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

Javascript 将PDF中的字符串替换为node.js |处理PDF的数据流/缓冲区,javascript,node.js,pdf,buffer,hummus.js,Javascript,Node.js,Pdf,Buffer,Hummus.js,我目前正在尝试以编程方式替换pdf中的占位符字符串。(简单示例:我想将字符串“SEI”更改为“1”) 我目前可以访问pdf的内容,并将其转换为流和/或缓冲区,然后将缓冲区转换回pdf,但由于我目前无法正确操作该流/缓冲区,我现在基本上只复制该pdf。当我使用buffer.toString()并将“SEI”的字符串替换为“1”时,它会改变缓冲区,使其现在在“SEI”之前的位置保留值“1”,但它不会正确显示在pdf中(它只在正方形中显示一个?字符),可能是因为我没有正确操作缓冲区 我正在使用humm

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

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

代码:

异步函数replacetext(文件路径){
const modPdfWriter=hummus.createWriterToModify(文件路径,{modifiedFilePath:`${filePath}-modified.pdf`,压缩:false})
const numPages=modPdfWriter.createPDFCopingContextFormodifiedFile().getSourceDocumentParser().GetPageScont()
用于(设页面=0;页面
我还尝试了节点包,比如流替换或缓冲区替换,但它们不起作用

这是缓冲区的剪切,其中还包含字符串“SEI”:

/跨度BDC 英国电信 01千 /GS0 gs /T1_0 1 Tf 10 0 10 25.5118 814.9606 Tm (SEI)Tj ET 电磁兼容 /跨度BDC 英国电信 1039.5317814.9606TM (-)Tj ET 电磁兼容 /跨度BDC 英国电信 0110K
/

您是否已检查字体资源T1\U 0是否支持字符代码“1”?(对于嵌入式字体,通常只支持一个子集,即实际使用的字符代码子集。)如何检查?对于特定文件,您可以使用PDF内部浏览器,如iText RUPS、PDFBox PDFDebugger或Adobe Acrobat Preflight的“浏览内部PDF结构”选项。可能也有javascript工具用于此,但我不知道它们。或者共享有问题的文件。下面是一个示例pdf,我想将“SEITENPLATZHALTER”更改为数字(介于1和~100之间)。您的SEITENPLATZHALTER在前两页上使用名为T1_0的字体绘制,在其余两页上使用名为T1_1的字体绘制;在这两种情况下,各自的名称解析为相同的PDF字体对象,并且该字体对象只是嵌入的子集。更确切地说,它只提供字符/空格/逗号/A/E/H/I/J/L/N/P/R/S/T/Z/A/d/E/I/L/m/N/o/P/R/S/T/u的标志符号。因此,内容流中的简单搜索和替换将不允许用数字替换占位符文本。另一个复杂的问题是,您的SEITENPLATZHALTER由四部分组成:
[(SEITENPL)12(A)48(TZHAL)108.1(TER)]TJ
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)
    
}