node.js - 如何使用 NodeJS 替换 PDF 文件中的字符串?

标签 node.js pdf pdf-generation

我有一个模板 PDF 文件,我想替换一些标记字符串以生成新的 PDF 文件并保存它们。最好/最简单的方法是什么?我不需要添加图形或任何花哨的东西,只需简单的文本替换,所以我不想要任何太复杂的东西。

谢谢!

编辑:刚刚找到HummusJS ,我会看看我是否能取得进展并张贴在这里。

最佳答案

我通过搜索找到了这个问题,所以我认为它值得回答。我在这里找到了 BrighTide 的答案:https://github.com/galkahana/HummusJS/issues/71#issuecomment-275956347

基本上,有一个非常强大的 Hummus 包,它使用用 C++ 编写的库(当然是跨平台的)。我认为 github 评论中给出的答案可以像这样功能化:

var hummus = require('hummus');

/**
 * Returns a byteArray string
 * 
 * @param {string} str - input string
 */
function strToByteArray(str) {
  var myBuffer = [];
  var buffer = new Buffer(str);
  for (var i = 0; i < buffer.length; i++) {
      myBuffer.push(buffer[i]);
  }
  return myBuffer;
}

function replaceText(sourceFile, targetFile, pageNumber, findText, replaceText) {  
    var writer = hummus.createWriterToModify(sourceFile, {
        modifiedFilePath: targetFile
    });
    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));
    }
    var string = new Buffer(data).toString().replace(findText, replaceText);

    //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();
}

// replaceText('source.pdf', 'output.pdf', 0, /REPLACEME/g, 'My New Custom Text');

更新:
编写示例时使用的版本是 1.0.83,最近可能会发生变化。

更新 2: 最近我遇到了另一个具有不同字体的 PDF 文件的问题。由于某种原因,文本被分成小块,即字符串 QWERTYUIOPASDFGHJKLZXCVBNM1234567890- 表示为 -286(Q)9(WER)24(T)-8(YUIOP)116(ASDF) 19(GHJKLZX)15(CVBNM1234567890-) 除了编写一个正则表达式之外,我不知道还能做什么。所以不用这一行:

var string = new Buffer(data).toString().replace(findText, replaceText);

我现在有这样的东西:

var string = Buffer.from(data).toString();

var characters = REPLACE_ME;
var match = [];
for (var a = 0; a < characters.length; a++) {
    match.push('(-?[0-9]+)?(\\()?' + characters[a] + '(\\))?');
}

string = string.replace(new RegExp(match.join('')), function(m, m1) {
    // m1 holds the first item which is a space
    return m1 + '( ' + REPLACE_WITH_THIS + ')';
});

关于node.js - 如何使用 NodeJS 替换 PDF 文件中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36778637/

相关文章:

ios - 从 iPad 发送电子邮件时 PDF 签名会轮换

pdf - phantomjs pdf 可点击超链接

node.js - ReactJS,内部专用 IP 服务器上的 Express 应用程序自托管

javascript - 无法加载资源: the server responded with a status of 404 (Not Found) in koa2 & nodejs

php - 对PDF文件的每一页进行截图

c# - IText AllowAssembly 和 StandardEncryption

php - TCPDF - 多单元格高度

javascript - 在 AWS 上运行的 Node.JS 应用程序性能问题

javascript - 重试时客户端连接未正确关闭

pdf - 使用 PDFBox 从 PDF 中获取文本行的边界框