Skip to content
全新发布

PDF SDK 与 AI 文档处理

在 GitHub 获取完整的私有化部署SDK 包及 AI 智能文档处理能力,一键部署,快速构建您的文档处理工作流。

Core 桥接层

core 桥接层(packages/webview/src/core/)是 Vue webview UI 与 ComPDFKit Core 引擎之间的无状态门面。它将单体 ComPDFKitViewer 类隐藏在约 120 个薄函数之后,是唯一被允许调用引擎的层。

角色与规则

  • 无状态: 无业务状态、无 DOM 操作。唯一可变结构是 documentViewers Map(多实例注册表)。
  • 每个文件一个函数: 文件名 === 函数名;默认导出的箭头函数。
  • docNum 始终是最后一个参数(存在时),转发给 getDocumentViewer(docNum)
  • 纯委托: 典型桥接文件是一行——getDocumentViewer(docNum).<engineMethod>(args...)。唯一的转换是轻量参数解构。
  • 单向依赖: apis/ → core/ → engine。桥接层从不触碰 Pinia store 或 DOM。

多实例注册表 — documentViewers.js

唯一有状态的文件(24 行):

javascript
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 个桥接函数。按领域:

生命周期与多实例

getDocumentViewersetDocumentViewergetDocumentViewersdeleteDocumentViewerinitinitConfiginitializeViewer

文档加载、元数据与编辑

loadDocumentgetPagesCountgetCurrentPagegetDocumentNamesetDocumentNamegetOutlinesgetOptionUrldownloadgetDocEditorPagessaveDocumentEditcompare

导航、页面与视口

nextPagepreviousPagepageNumberChangedrotateClockwiserotateCounterclockwisezoomInzoomOutscaleChangedgetScalegetScrollViewElementgetSelectedPagepageToWindowwindowToPagerequestFullScreenModetoggleSidebarswitchScrollModeswitchSpreadModewebViewerNamedActionwebViewerPageMode

搜索与文本

searchsetActiveSearchResultclearSearchResultsgetSelectedText

批注 — 增删改查、管理器与历史

getAnnotationsListgetAnnotationManagergetAnnotationHistoryManagerimportAnnotationsexportAnnotationsexportXfdfsaveAnnotationsremoveAllAnnotationsselectAnnotationjumpToAnnotationsetAnnotationStylesaddAnnotationImagehandleReplyAnnotationsetUnselectableAnnotationTypesgetUnselectableAnnotationTypesenableAutoSelectOnCreatedisableAutoSelectOnCreateupdateViewWithColorIndexshowPopuphandlePopupsetAnnotator

批注 — 印章与高亮

getDynamicStampPreviewgetStampRecthandleStampsetHighlightLinksetHighlightForm

工具

setToolswitchToolsetToolModegetToolModegetToolStylessetToolStylesregisterToolsetDefaultSelectsetEraseModegetEraseMode

内容编辑

switchAnnotationEditorModesetContentEditorPropertygetContentEditManagergetContentEditHistoryManageraddEditorImagegetCropedPageImage

表单

handleFieldenableSkipNoRequireddisableSkipNoRequiredisSkipNoRequiredsetConsecutiveTypegetConsecutiveTypedisableFillConsecutivelyisFillConsecutivelygetFormSignFilledAndUnfilledgetRequiredFormSignsetAutoJumpNextSign

数字签名

handleSigngetSignaturedeleteSignatureverifySignaturegetVerificationResult

证书、安全与权限

loadCertificatesaddToTrustedCertificateListscheckCertificateIsTrustedcheckPermissionPasswordgetPermissionsetPasswordremovePasswordcheckPassword

密文与扁平化

applyRedactionsflattenPdfflattenPdfDownload

图层与测量

setLayersexportLayerssetMeasurementDefaults

用户与访问控制

setCurrentUsergetCurrentUserisUserAdminisReadOnlyModeEnabled

属性面板、事件、打印、viewer 元素

setPropertyPanelsetInitPropertyeventBusaddEventremoveEventtriggerPrintinggetViewerElementhandleCreateStatus

apis/ 如何消费桥接层

apis/index.js 执行 import core from '@/core',将整个桥接层展开到 objForWebViewerCore,发布为 window.instance.Core。它还直接暴露默认实例:window.instance.docViewer = core.getDocumentViewer()

约 67 个 apis/ 文件中仅 2 个直接导入 coreindex.jsregisterTool.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);searchsetActiveSearchResultclearSearchResultssetAnnotationStyles 桥接文件此前使用内联 getDocumentViewer(docNum = 1) 重赋值写法(现为 getDocumentViewer(docNum),依赖 getDocumentViewer(number = 1) 的默认值)。

架构要点

  1. 引擎之上的门面 ——在单体类之上的扁平、分类、稳定接口。
  2. 设计上的单一状态接缝 ——调试"我在与哪个 viewer 通信"时应检查 documentViewers.js
  3. 默认实例偏向 ——实例 1 是常态;多实例按方法可选。
  4. 清晰分层 ——桥接层从不触碰 store 或 DOM;apis/ 是接合点。

相关