用node.js替换PDF中的字符串|处理pdf的数据流/缓冲区

问题描述

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

我正在使用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”:

/跨度> BDC 英国电信 0 0 0 1 k / GS0克 / T1_0 1 Tf 10 0 0 10 25.5118 814.9606 Tm (SEI)Tj ET 电磁兼容 / Span > BDC 英国电信 10 0 0 10 39.5317 814.9606 Tm (-)Tj ET 电磁兼容 / Span > BDC 英国电信 0 1 1 0 k /

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)