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

2023-11-26

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

Thanks!

编辑:刚刚发现HummusJS,我会看看是否可以取得进展并将其发布在这里。


我通过搜索发现了这个问题,所以我认为它值得回答。我在这里找到了 BrightTide 的答案: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');

UPDATE:
编写示例时使用的版本是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 + ')';
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 NodeJS 替换 PDF 文件中的字符串? 的相关文章

随机推荐

  • 使用 TinyXml for C++ 时需要清理哪些内存管理?

    我正在做以下事情TinyXml TiXmlDocument doc TiXmlDeclaration decl new TiXmlDeclaration 1 0 TiXmlElement main new TiXmlElement main
  • Chromium 和 Firefox 显示颜色不同,我不知道哪一个做得对

    我一直在 Ubuntu 17 10 下构建一个网站 并使用 Firefox 和 Chromium 进行测试 这两个浏览器显示的颜色完全不同 不仅是图像 而且是所有颜色 我一直认为是 Chromium 出于某种原因错误地使它们过度饱和 所以到
  • 在 mac os x 环境中对可执行应用程序文件进行签名的方法或技术有哪些?

    我想使用自签名证书对 app 文件或 ipa 文件等 mac 操作系统可执行文件进行签名 以用于开发目的 我不打算在 ios 或 mac 应用商店中发布签名的应用程序 我想将其开发为一个工具 那么有哪些可用选项呢 我不想使用 Xcode 的
  • 是否可以获得变量的最大可能长度

    我想知道 plsql 中是否存在给出变量最大长度的函数 例如 如果我声明 DECLARE varia VARCHAR2 7 BEGIN call of a function that would return 7 END 即使 varia
  • 如何在 WP8 上突出显示 LongListSelector 中的选定项目?

    如何在 Windows Phone 8 上的新 LongListSelector 中突出显示所选项目 事实上 如果我点击列表中的一项 什么也不会发生 我的列表仅包含一个简单的字符串 它将通过 TextBlock 显示 但我想强调的是用户的选
  • 为 flex-wrap 添加动画

    当谈到换行点时 我们如何添加动画 也许这可以帮助 我们有一个标题 在该标题的内部有一个带有 flex attr 的容器 当我们从下到上调整浏览器大小时 或者当我们改变浏览器的高度时 这些项目突然重塑形状 方向是列 我只想向此事件添加动画 谢
  • 仅在媒体打印的最后打印页中打印页脚

    我需要打印多页 页脚需要打印在最后一页底部 我已经为页脚添加了 css 如下所示 footer display block width 100 position absolute left 0 bottom 0px 问题是页脚正在打印第一页
  • 如何用实验分支替换master分支

    我有两个分支 master 和experiment 它们都是分开进化的 现在已经非常不同了 现在我准备将实验分支设为我的主分支 If I try git checkout master git merge experiment 我得到了很多
  • 设计表单以在 Windows CE 上使用不同的分辨率和宽高比

    我有一个在 Compact Framework 上运行的 NET 2 0 应用程序 它有一堆不同的形式 最初都是为了在具有特定屏幕分辨率的特定设备上运行而设计的 我现在希望让这个应用程序在具有非常不同的屏幕分辨率的其他一些设备上运行 有些设
  • 我如何在 C# 中实现 QueueDictionary(队列和字典的组合)?

    基本上 我想要的数据结构将镜像 MSMQ 但会在内存中 因为它正在一个进程中使用 通过镜像 MSMQ 我的意思是您会将对象排队 然后您可以将对象出队或使用密钥检索它们 这是我的初步尝试 我这次尝试的主要问题是 通过 id 获取会被频繁使用
  • 使用 Puppeteer for Node.js 自动允许网络摄像头访问

    我正在设置一个涉及启动网络摄像头视频会话的测试 到目前为止 一切工作正常 除了授予对网络摄像头的访问权限之外 不需要任何用户交互 当我使用的第三方库进行调用时 navigator mediaDevices getUserMedia audi
  • Wordpress - Woocommerce 删除“已添加到购物车”消息

    我希望在将商品添加到购物车后删除 产品已成功添加到购物车 的措辞和区域 我只想什么都没有 没有消息 也没有空间容纳消息 这是网站 http www tinytreasurehunts com代码位于 woocommerce function
  • iTextSharp 表格单元格间距可能吗?

    iTextSharp 中的表格 PdfPTable 中是否可以有单元格间距 我看不出有什么可能 我确实看到了一项使用 iTextSharp text Table 的建议 但这在我的 iTextSharp 版本 5 2 1 上似乎不可用 如果
  • 不同模块中的类名相同

    我需要在 swift 5 中使用两个同名的类 为此 我在两个不同的模块中创建了这两个类 但我对如何在UIViewController 我的一堂课是Person这是在models gt student模块和另一个类是Person与 是在mod
  • C中字节和字符的区别

    我想知道为什么我不能从书中编译一个例子 我在这里简化了示例 以避免发布受版权保护的书籍中的示例 include
  • QueryExpression 与 FetchXml CRM2011

    我们发现 Linq for CRM 2011 严重损坏 它似乎在没有对其进行任何 QA 的情况下就进入了 指示提供程序损坏程度的指标是像 Where x gt x b 这样的查询有效 但是这个 Where x gt b x 可能不依赖于某些
  • 如何从 MS Word 访问表格中具有不同单元格宽度的列

    我正在尝试从表格的第一列获取单元格 在 中获取异常Foreach Cells c in rng Tables 1 Columns 1 Cells 因为该表包含具有混合单元格宽度的列 例如 第一行有 4 个单元格 第二行只有 2 个单元格 2
  • 后台工作者访问 UI 的正确方法

    我不确定我是否正确执行此操作 但我正在使用以下代码 单击button1 执行 DoWork 问题是这样的 我如何调用 UI 来获取 textbox1 和 textbox2 的值 因为它们位于不同的线程上 所以无法调用它们 我应该使用调度程序
  • 如何让 setw 适用于以下所有标准输出?

    应该是一个微不足道的问题 但发现 setw 仅适用于其紧随其后的输出 并且不确定如何允许它适用于所有后续输出 例如 对于以下代码行 cout lt
  • 如何使用 NodeJS 替换 PDF 文件中的字符串?

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