问题描述
我目前正在尝试以编程方式替换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 (将#修改为@)