首页 > 解决方案 > 用 node.js 替换 PDF 中的字符串 | 操作 pdf 的数据流/缓冲区

问题描述

我目前正在尝试以编程方式替换 pdf 中的占位符字符串。(简单的例子:我想将字符串“SEI”更改为“1”)我目前可以访问 pdf 的内容并将其转换为流和/或缓冲区并将该缓冲区转换回 pdf,但因为我目前无法正确操作该流/缓冲区我现在基本上只复制该pdf。当我使用 buffer.toString() 并且只对“SEI”使用字符串替换为“1”时,它会更改缓冲区,使其现在保存“SEI”之前的值“1”,但它没有正确显示在 pdf 中(它只在正方形中显示 ? 字符)可能是因为我没有正确操作缓冲区。

我正在使用 hummus.js 访问 pdf 数据相关占位符的字体是“Frutiger Next Pro Bold”(如果重要的话)

代码:

async function replacetext(filePath) {      
    const modPdfWriter = hummus.createWriterToModify(filePath, {modifiedFilePath: `${filePath}-modified.pdf`, compress: false})
    const numPages = modPdfWriter.createPDFCopyingContextForModifiedFile().getSourceDocumentParser().getPagesCount()

    for (let page = 0; page < numPages; page++) {
        const copyingContext = modPdfWriter.createPDFCopyingContextForModifiedFile()
        const objectsContext = modPdfWriter.getObjectsContext()

        const pageObject = copyingContext.getSourceDocumentParser().parsePage(page)
        const textStream = copyingContext.getSourceDocumentParser().queryDictionaryObject(pageObject.getDictionary(), 'Contents')
        const textObjectID = pageObject.getDictionary().toJSObject().Contents.getObjectID()

        let data = []
        const readStream = copyingContext.getSourceDocumentParser().startReadingFromStream(textStream)
        while (readStream.notEnded()) {
            const readData = readStream.read(10000)
            data = data.concat(readData)

        }   

        var redactedPdfPageAsString = new Buffer.from(data).toString();
        
     //   var replacedBuffer = redactedPdfPageAsString.replace("SEI", "1");
          var replacedBuffer = replace(redactedPdfPageAsString, "SEI", "1");
          
        objectsContext.startModifiedIndirectObject(textObjectID)

        const stream = objectsContext.startUnfilteredPDFStream();
        stream.getWriteStream().write(strToByteArray(replacedBuffer));
        objectsContext.endPDFStream(stream);

        objectsContext.endIndirectObject();
    }
    
    modPdfWriter.end()

    hummus.recrypt(`${filePath}-modified.pdf`, filePath)
    
}  

我还尝试了流替换或缓冲区替换等节点包,但它们不起作用。

这是缓冲区的一部分,其中还包含字符串“SEI”:

/Span <</Lang (de-DE)/MCID 0 >>BDC BT 0 0 0 1 k /GS0 gs /T1_0 1 Tf 10 0 0 10 25.5118 814.9606 Tm (SEI)Tj ET EMC /Span <</Lang ( de-DE)/MCID 1 >>BDC BT 10 0 0 10 39.5317 814.9606 Tm (-)Tj ET EMC /Span <</Lang (de-DE)/MCID 2 >>BDC BT 0 1 1 0 k /

标签: javascriptnode.jspdfbufferhummus.js

解决方案


推荐阅读