Browse Source

fix: 重新加载文档释放 page 及 doc

liutian 11 months ago
parent
commit
b39589dd0e
2 changed files with 24 additions and 17 deletions
  1. 5 4
      packages/core/src/index.js
  2. 19 13
      packages/core/src/worker/compdfkit_worker.js

+ 5 - 4
packages/core/src/index.js

@@ -252,9 +252,6 @@ class ComPDFKitViewer {
         const blob = await response.blob()
         this.#fonFile = new File([blob], 'DroidSansFallbackFull.ttf', { type: blob.type })
       }
-      const doc = await this.messageHandler.sendWithPromise('InitDocument')
-
-      this.doc = doc
     }
     return verified
   }
@@ -490,12 +487,16 @@ class ComPDFKitViewer {
           }
 
           let buffer = new Uint8Array(binaryData)
-          await this.messageHandler.sendWithPromise('LoadFile', {
+          const doc = await this.messageHandler.sendWithPromise('LoadFile', {
+            doc: this.doc,
+            pagesPtr: this.pagesPtr,
             buffer,
             fontFile: this.#fonFile,
             fontName: 'DroidSansFallbackFull'
           })
 
+          this.doc = doc
+
           const loadRes = await this.messageHandler.sendWithPromise('LoadDocumentByStream', {
             doc: this.doc,
             fileId: 0,

+ 19 - 13
packages/core/src/worker/compdfkit_worker.js

@@ -95,15 +95,18 @@ class CPDFWorker {
       return error
     })
 
-    messageHandler.on('InitDocument', () => {
-      const doc = Module._InitDocument()
-
-      return doc
-    })
-
     messageHandler.on('LoadFile', async (data) => {
       ComPDFKitJS.opened_files = []
       ComPDFKitJS.opened_files[0] = data.buffer
+      if (data.pagesPtr && data.pagesPtr.length > 0) {
+        data.pagesPtr.forEach(item => {
+          Module._ClearPage(item.pagePtr)
+        })
+      }
+
+      if (data.doc) {
+        Module._ClearDocument(data.doc)
+      }
 
       if (!data.fontFile) return true
 
@@ -2424,9 +2427,6 @@ async function getSignatures({
           }
 
           const certPtr = Module._GetSignCert(signerPtr)
-
-          let result = false
-          
           if (certPtr) {
             signer.version = Module._GetSignVersion(certPtr)
             Module._GetSignAlgOid(certPtr)
@@ -2482,8 +2482,10 @@ async function getSignatures({
             // TODO: 验证证书
             CertArray = []
             Module._ExportToFilePath(certPtr, 1)
-            ComPDFKitJS.opened_cert[0] = CertArray[0]
-            result = Module._VerifyGetChain(signerPtr, certPtr, 0, CertArray[0].length)
+            ComPDFKitJS.opened_cert[i] = CertArray[0]
+
+            const certLength = ComPDFKitJS.opened_cert[i].length
+            const result = Module._VerifyGetChain(signerPtr, certPtr, i, certLength)
             if (result === 1) {
               signer.isCertTrusted = true
               for (let f = 0; f < signer.certificateList.length; f++) {
@@ -2493,9 +2495,13 @@ async function getSignatures({
               needCheck = true
             }
 
-            const len = ComPDFKitJS.opened_files[0].length
-            result = Module._VerifyDocument(doc, signaturePtr, 0, len)
+            const fileLength = ComPDFKitJS.opened_files[0].length
+            const signerResult = Module._VerifySigner(signaturePtr, signerPtr, 0, fileLength)
 
+            const signatureResult = Module._VerifyDocument(doc, signaturePtr, 0, fileLength)
+            if (signatureResult === 1) {
+              signer.isSignVerified = true
+            }
             CertArray = []
             Module._GetSignCertChain(certPtr)