javascript - 用 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 /
解决方案
推荐阅读
- mysql - 不同表中的sql语句总和和数量使用?
- android - 模型中的活动参考
- python - 我怎样才能让许多用户在同一个文件上工作?
- python - 基于大序列和异或运算实现问题的最有效方法
- mysql - #2014 - 命令不同步;您现在无法运行此命令 SQL 子查询
- javascript - 如何修改 javascript 文件中的 indexof 以在外部站点加载的文件上使用
- ssl - 在 GKE 的 Istio 入口网关中使用默认 SSL 证书
- php - 在多个 PHP 页面中使用相同的数组
- kubernetes - kubernetes 创建有状态集,pod 未启动
- java - 错误:无法在 Netbeans 中找到或加载主类