PDF 生成模板编辑器
开源可视化 PDF 生成引擎,支持自定义模板,并提供面向开发者的 API,灵活构建文档生成流程。
core 桥接层(packages/webview/src/core/)是 Vue webview UI 与 ComPDFKit Core 引擎之间的无状态门面。它将单体 ComPDFKitViewer 类隐藏在约 120 个薄函数之后,是唯一被允许调用引擎的层。
documentViewers Map(多实例注册表)。docNum 始终是最后一个参数(存在时),转发给 getDocumentViewer(docNum)。getDocumentViewer(docNum).<engineMethod>(args...)。唯一的转换是轻量参数解构。apis/ → core/ → engine。桥接层从不触碰 Pinia store 或 DOM。documentViewers.js 唯一有状态的文件(24 行):
import ComPDFKitViewer from '../../lib/webview.min.js'
const documentViewerMap = new Map();
export const setDocumentViewer = (number, documentViewer, options) => {
if (documentViewer) {
documentViewerMap.set(number, documentViewer); // 预构建的 viewer
} else {
const viewer = new ComPDFKitViewer(options); // 或在此构造
documentViewerMap.set(number, viewer);
}
};
export const deleteDocumentViewer = (number) => { documentViewerMap.delete(number); };
export const getDocumentViewer = (number = 1) => documentViewerMap.get(number);
export const getDocumentViewers = () => Array.from(documentViewerMap.values());getDocumentViewer() 解析到实例 1(主文档)。options 内部构造。helpers/initDocument.js 注册实例 1;CompareDocumentContainer.vue 注册实例 2 和 3(对比旧/新文件查看器)。docNum;其余硬编码到实例 1。core/index.js 重新导出约 120 个桥接函数。按领域:
getDocumentViewer、setDocumentViewer、getDocumentViewers、deleteDocumentViewer、init、initConfig、initializeViewer。
loadDocument、getPagesCount、getCurrentPage、getDocumentName、setDocumentName、getOutlines、getOptionUrl、download、getDocEditorPages、saveDocumentEdit、compare。
nextPage、previousPage、pageNumberChanged、rotateClockwise、rotateCounterclockwise、zoomIn、zoomOut、scaleChanged、getScale、getScrollViewElement、getSelectedPage、pageToWindow、windowToPage、requestFullScreenMode、toggleSidebar、switchScrollMode、switchSpreadMode、webViewerNamedAction、webViewerPageMode。
search、setActiveSearchResult、clearSearchResults、getSelectedText。
getAnnotationsList、getAnnotationManager、getAnnotationHistoryManager、importAnnotations、exportAnnotations、exportXfdf、saveAnnotations、removeAllAnnotations、selectAnnotation、jumpToAnnotation、setAnnotationStyles、addAnnotationImage、handleReplyAnnotation、setUnselectableAnnotationTypes、getUnselectableAnnotationTypes、enableAutoSelectOnCreate、disableAutoSelectOnCreate、updateViewWithColorIndex、showPopup、handlePopup、setAnnotator。
getDynamicStampPreview、getStampRect、handleStamp、setHighlightLink、setHighlightForm。
setTool、switchTool、setToolMode、getToolMode、getToolStyles、setToolStyles、registerTool、setDefaultSelect、setEraseMode、getEraseMode。
switchAnnotationEditorMode、setContentEditorProperty、getContentEditManager、getContentEditHistoryManager、addEditorImage、getCropedPageImage。
handleField、enableSkipNoRequired、disableSkipNoRequired、isSkipNoRequired、setConsecutiveType、getConsecutiveType、disableFillConsecutively、isFillConsecutively、getFormSignFilledAndUnfilled、getRequiredFormSign、setAutoJumpNextSign。
handleSign、getSignature、deleteSignature、verifySignature、getVerificationResult。
loadCertificates、addToTrustedCertificateLists、checkCertificateIsTrusted、checkPermissionPassword、getPermission、setPassword、removePassword、checkPassword。
applyRedactions、flattenPdf、flattenPdfDownload。
setLayers、exportLayers、setMeasurementDefaults。
setCurrentUser、getCurrentUser、isUserAdmin、isReadOnlyModeEnabled。
setPropertyPanel、setInitProperty、eventBus、addEvent、removeEvent、triggerPrinting、getViewerElement、handleCreateStatus。
apis/ 如何消费桥接层 apis/index.js 执行 import core from '@/core',将整个桥接层展开到 objForWebViewerCore,发布为 window.instance.Core。它还直接暴露默认实例:window.instance.docViewer = core.getDocumentViewer()。
约 67 个 apis/ 文件中仅 2 个直接导入 core(index.js、registerTool.js);其余通过注入接收。apis/ 层是将桥接调用与 store 修改组合的接合点(如 saveDocumentEditor.js 调用 core.saveDocumentEdit(),再编排 store action 和更多桥接调用)。
少数桥接文件偏离了干净的单行模式(调试时有用):
registerTool.js(26 行)——探测 documentViewer.toolRegistry.register,回退到 documentViewer.registerTool,均不存在则返回 false。initializeViewer.js(15 行)——转发前解构 { container, viewer, thumbnailView, outlineView, toggleButton }。eventBus.js ——返回 getDocumentViewer().eventBus(并非有状态,尽管名字如此)。setDocumentName.js / getDocumentName.js ——直接属性访问(getDocumentViewer().docName)。已修复的历史问题:
checkCertificateIsTrusted.js此前引用了未定义的data(现已转发其data参数,与同级证书函数一致);setActiveSearchResult.js参数名有reseult拼写错误(现为result);search、setActiveSearchResult、clearSearchResults和setAnnotationStyles桥接文件此前使用内联getDocumentViewer(docNum = 1)重赋值写法(现为getDocumentViewer(docNum),依赖getDocumentViewer(number = 1)的默认值)。
documentViewers.js。apis/ 是接合点。