Core 桥接层
core 桥接层(packages/webview/src/core/)是 Vue webview UI 与 ComPDFKit Core 引擎之间的无状态门面。它将单体 ComPDFKitViewer 类隐藏在约 120 个薄函数之后,是唯一被允许调用引擎的层。
角色与规则
- 无状态: 无业务状态、无 DOM 操作。唯一可变结构是
documentViewersMap(多实例注册表)。 - 每个文件一个函数: 文件名 === 函数名;默认导出的箭头函数。
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());- 默认实例 = 1。
getDocumentViewer()解析到实例 1(主文档)。 - 两种注册模式: 存储外部构建的 viewer,或从
options内部构造。 - 注册点:
helpers/initDocument.js注册实例 1;CompareDocumentContainer.vue注册实例 2 和 3(对比旧/新文件查看器)。 - 约 120 个桥接文件中仅约 13 个传递
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。
属性面板、事件、打印、viewer 元素
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)的默认值)。
架构要点
- 引擎之上的门面 ——在单体类之上的扁平、分类、稳定接口。
- 设计上的单一状态接缝 ——调试"我在与哪个 viewer 通信"时应检查
documentViewers.js。 - 默认实例偏向 ——实例 1 是常态;多实例按方法可选。
- 清晰分层 ——桥接层从不触碰 store 或 DOM;
apis/是接合点。