【发布时间】:2021-04-02 10:02:55
【问题描述】:
How do I replace a string in a PDF file using NodeJS? 有一个解决方案来替换 PDF 中的文本。使用相同的代码,我有一个令人费解的问题:文本在 PDF 的源代码中被替换但不呈现。改编自上述解决方案的相关行是:
console.log(replaceText);
var string = new Buffer(data).toString().replace(findText, replaceText);
console.log(string);
控制台显示在PDF的源字符串中被替换:
/TT0 1 TF 65.5689 -24.5097 24.5097 65.5689 363.9941 762.3682 (e)Tj 61.1539 -34.0617 34.0617 61.1539 381.1689 756.6411 (n)Tj 54.8214 -43.5272 43.5272 54.8214 408.6333 741.0947 (d)Tj 48.8331 -50.153 50.153 48.8331 426.3779 726.999 (a)Tj 52 0 0 52 75.8203 226.9756 (abcdefghijklmnopqrstuvwxyz)Tj 33 0 0 33 25.8203 302.9756 (E)Tj (ste cheque-prenda, para:)Tj 1.818 -7.152 时差 (www.emocoes.org/abcdefghijklmnopqrstuvwxyz)Tj 外星人PDF 看起来像这样:
在这种情况下缺少 K、X 和 Y。在 Adobe Illustrator 中打开文件显示它们仍在其他字母后面:
我找不到明确的模式:有时 H 和 J 在其他替换字符串中也会丢失,而丢失的字母与其他字体不同(我测试了 Open Sans 和 Times New Roman)。
问题是什么,我该如何解决?
我的代码是:
function customizeVoucher(findText, replaceText) {
var sourceFile = path.join(__dirname, "../private/vouchers/custom-old.pdf");
var link = "/vouchers/cheque-prenda-" + replaceText + ".pdf";
var targetFile = path.join(__dirname, "../private" + link);
var pageNumber = 0;
var writer = hummus.createWriterToModify(sourceFile, {
modifiedFilePath: targetFile,
log: path.join(__dirname, "../hummus.md")
});
var sourceParser = writer.createPDFCopyingContextForModifiedFile().getSourceDocumentParser();
var pageObject = sourceParser.parsePage(pageNumber);
var textObjectId = pageObject.getDictionary().toJSObject().Contents.getObjectID();
var textStream = sourceParser.queryDictionaryObject(pageObject.getDictionary(), 'Contents');
//read the original block of text data
var data = [];
var readStream = sourceParser.startReadingFromStream(textStream);
while(readStream.notEnded()){
Array.prototype.push.apply(data, readStream.read(10000));
}
console.log(replaceText);
var string = new Buffer(data).toString().replace(findText, replaceText);
console.log(string);
// Create and write our new text object.
var objectsContext = writer.getObjectsContext();
objectsContext.startModifiedIndirectObject(textObjectId);
var stream = objectsContext.startUnfilteredPDFStream();
stream.getWriteStream().write(strToByteArray(string));
objectsContext.endPDFStream(stream);
objectsContext.endIndirectObject();
writer.end();
return link;
}
源 PDF 是here。
【问题讨论】:
-
很可能仅将字体作为子集嵌入,仅存在最初需要的字形。这只是您提到的过于简单的文本替换方法失败的众多情况中的一种。
-
@mkl 确实如此:隐藏所有字形的文件不存在此问题。 Illustrator 可以渲染它可能是因为它具有源字体。你能写一个答案并推荐一个更可靠的解决方案吗?
-
我可以写一个答案,但我没有更可靠的 Javascript 解决方案。
-
没关系,能不能加个不是Javascript的更靠谱的方法?
-
在带有 itext 的 Java 中,我首先应用带坐标的文本提取(以查找要替换的文本),在这些坐标处使用编辑删除文本,然后将替换添加为新文本。明年我回到办公室时,我可以写一些更详细的内容。
标签: javascript node.js pdf