在未压缩的 PDF 中进行集体内联编辑

2024-04-24

我有一个很大的 PDF(~20mb,160mb。未压缩)。 我需要在其中的文本中进行查找和替换,大约 1000 次。 这是我尝试过的。

  1. Via SVG

    • 转换为 SVG (inkscape)
    • 逐行读取 SVG 并在文件中进行替换
    • 转换回 PDF

=>输出不好,可能是由于SVG中的一些几何变换矩阵,文本渲染得不好

  1. 创建约 1000 个 sed 命令

    • 解压PDF
    • 使用 sed 命令执行每个替换
    • 重新压缩 PDF

=> 太长了。每个 sed 命令大约需要 20 秒,导致处理过程需要几个小时

  1. 逐行读取并替换

    • 解压PDF
    • Read line by line the PDF
      • 查找要替换的文本
      • 使用 perl 替换
      • 将行写入新文件
    • 压缩新文件

=>由于未压缩的PDF中存在剩余数据流,新文件显然已损坏(将二进制写入文本行)

我想知道是否可以逐行阅读未压缩的 PDF,但直接在其中进行编辑。我怎么能这样做呢?

我搜索过 perl 内联编辑,但它会立即执行整个文件中的更改,而我想编辑一行。

其他想法也非常受欢迎;)

根据建议,我使用了 CAM::PDF,这是最有效、最简单的解决方案


2. 和 3. 没有区别。 sed 逐行读取输入文件并将更改的行写入输出文件。如果你喂了-i切换到它,sed只需打开输入文件,然后取消链接(这就是rmdo) 然后打开同名的输出文件并写入。就是这样。不涉及魔法。因此,如果您通过 Perl 损坏了内容,而不是通过sed你做了一些不同于sed。主要区别是,您可以使 Perl 脚本更快地替换许多字符串。看在带有 csv 的文本文件上使用 sed https://stackoverflow.com/questions/29071270/using-sed-on-text-files-with-a-csv/29075406#29075406

主要技巧是您可以编译用于搜索和替换的正则表达式,它可以在线性时间内工作。

my %replace = ( foo => 'bar' );
my $re = join '|', map quotemeta, keys %replace;
$re = qr/($re)/;

while (<>) {
    s/$re/$replace{$1}/g;
}

您可以按照原来的方法使用它,但我建议使用 Perl 脚本制作它,这样您可以保留正则表达式并替换 pdf 文件之间的哈希值。您也可以尝试将其与CAM::PDF https://metacpan.org/pod/CAM::PDF。有示例脚本changepagestring.pl https://metacpan.org/source/CDOLAN/CAM-PDF-1.60/bin/changepagestring.pl在里面。您还可以看看PDF::API2 https://metacpan.org/pod/PDF::API2这需要更多的工作,但可能会提供更好的结果。但请记住,PDF 格式不适合修改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在未压缩的 PDF 中进行集体内联编辑 的相关文章

  • 在 Perl 中验证电子邮件的正则表达式

    我是 Perl 新手 正在尝试掌握脚本语言 其中我遇到了正则表达式来验证电子邮件地址 我正在分享 perl 脚本 我不确定我在哪里犯了错误 部分始终被省略 随后正确的电子邮件 ID 也显示为无效 这是代码 usrs bin perl str
  • 不区分大小写的关键字匹配

    我正在编写一种用于解析计算机语言的语法 可以与解析 Eyapp http search cpan org casiano Parse Eyapp 1 182 lib Parse Eyapp pod 这是一个 Perl 包 可以简化常规语言解
  • 在solr中获取pdf搜索结果的页码

    我正在构建一个 Web 应用程序 用户可以在其中搜索 pdf 文档并使用 pdf js 查看它们 我想显示搜索结果 其中包含找到搜索词的段落的简短片段以及用于在右侧页面打开文档的链接 所以我需要的是每个搜索结果的页码和简短的文本片段 我正在
  • 当与不需要虚拟机的编译程序一起使用时,CGI 是否仍然很慢?

    当我学习 CGI 时 我了解到任何编程语言都可以用来将其输出挂钩到 http 响应消息 而它的输入是 http 请求消息 我读过的很多文章都在 Perl 的背景下讨论 CGI 这是因为 Perl 是与 CGI 结合使用的最常见的语言吗 我想
  • Perl:通过一次 MySQL 调用更新多行

    似乎这不可能 但嘿我不妨问一下 我可能是错的 想知道 perl 是否可以使用一个 MySQL 调用来更新多行 我正在使用 DBI 任何帮助或反馈将不胜感激 这可以通过 ASP 和 ASP net 在 MSSQL 中实现 所以想知道是否也可以
  • 使用 Poppler Qt4 C++

    我需要在我的应用程序中使用 pdf 查看器库 我使用 C 和 QT 我下载了Poppler http poppler freedesktop org 和代码示例Poppler Qt4 界面库 http people freedesktop
  • 如何在 Moose 中存储哈希值的哈希值?

    我想知道 在 Moose 中存储哈希值的最佳方式是什么 让我们以这样的哈希为例 my hash step1 gt extraction gt object1 analysis gt object2 step2 gt extraction g
  • 如何在 UNIX / Linux 操作系统下使用 sed 替换带有换行符 (\n) 的模式?

    我有一个 txt 文件 其中包含 Some random text here This file has multiple lines Should be one line I use sed q N s n sl g t q file1
  • 重命名 PDF 文件中的指定目标

    我一直在 PDF 文件中使用命名目标来在文件中的特定位置打开 PDF 文件 负责生成 PDF 文档的团队使用工具从书签自动生成命名目的地 因此命名目的地往往具有诸如 9 Glossary 或 Additional Information 之
  • Perl OO 方法调用第一个参数值 (->)

    就 Perl OO 而言 到底做了什么 gt do 例如我拨打 main 电话 result a b gt mymethod 在我定义的包中mymethod 我使用以下内容 my class 总的来说 我显然没有向mymethod 那么哪里
  • pyPDF通过django合并并显示为httpresponse

    我在合并 pyPDF 逻辑以将两个 pdf 文件合并到我的 django 站点时遇到问题 我编写了在本地服务器上的 python 文件中运行时用于合并文件的代码 但我需要明确识别要合并的文件 from pyPdf import PdfFil
  • 如何在 Perl 中使用数组引用中的索引作为方法引用?

    如同这个关于迭代子例程引用的问题 https stackoverflow com questions 452529 how do i iterate over dereference an array of subroutine refs
  • 如何在 ionic 应用程序中显示 pdf 文件而无需下载

    我所做的事情 在应用程序浏览器中使用 使用谷歌文档 使用的网页视图 所以我尝试了所有这些方法来使用 ionic 在 Android 设备中显示 pdf 文件 但没有用 我可以在所有这些方法中看到下载按钮 谁能告诉我如何在没有用户下载选项的情
  • Perl - HTTP::代理捕获 XHR/JSON 通信

    网站http openbook etoro com main http openbook etoro com main 有一个实时提要 由 javascript 通过 XHR keep alive 请求生成 并以 gzip 压缩 JSON
  • sed 仅最后一个匹配模式

    我想sed仅文本文件的最后一个匹配模式 输入文件 boy boy girl boy 输出文件 boy boy girl boys 一种方法是反转文件 仅替换第一个匹配项 然后再次反转 tac
  • 使用 ps2pdf (ghostscript) 创建正确的 PDF/X

    我已经为此苦苦挣扎了几天 所以我想我应该在这里寻求帮助 基本上 我尝试使用 ps2pdf 版本 9 10 创建正确的 PDF X 1 和 PDF X 3 文档 是的 我知道据说 ps2pdf 仅支持 PDF X 3 请参阅这个线程 http
  • Perl Mongo 查找对象 ID

    你会认为这是一件简单的事情 我有一个集合中的对象 ID 列表 我想根据对象 ID 获取单个记录 谷歌搜索过 但没有任何帮助 所以我有对象 ID 5106c7703abc120a04070b34 my client MongoDB Mongo
  • 哪一个代表null? undef 或空字符串

    我想插入null在表的一列中 哪一个代表null undef或空字符串 应该使用哪一种 为什么 我知道关于defined我可以检查一下 但我更多的是从数据库的角度来看 代表哪一个null更合适吗 Update 我在用DBI module D
  • 如何让 PDF 内容(由 Spring MVC 控制器方法提供)显示在新窗口中

    我是 Spring MVC 的新手 但它的功能给我留下了深刻的印象 我正在使用 3 1 0 RELEASE 并且我必须显示 PDF 来响应 form form 提交 这是我在控制器中编写的 小 代码 RequestMapping value
  • 多个与单个 Catalyst 应用程序

    我有多个作为 FCGI 运行的 Catalyst 应用程序 将它们整合为具有多个控制器的单个控制器是否有好处 Thanks Simone 内存 大概吧 我认为每台服务器至少要保留 15MB 左右 因此如果您在 3 台服务器上运行 3 个应用

随机推荐

  • 如何在静态方法或自定义类中注入HttpClient?

    我想使用角度HttpClient在静态方法或类中 在类中不能将其定义为构造函数参数 我尝试过类似的东西 export class SomeNotInjectableService static doSomething const injec
  • Ruby on Rails 3:link_创建新的嵌套资源?

    我试图在 Rails 3 应用程序中创建一个链接来创建新的嵌套资源 但我无法弄清楚 链接到新嵌套资源的语法是什么 解决方案 确保您的资源正确嵌套在您的路由文件中 resources books do resources chapters e
  • Amazon S3:授予来自 IP 的匿名访问权限(通过存储桶策略)

    我有一个 Amazon S3 存储桶 并且希望将其可供特定计算机上的脚本使用 而无需部署登录凭证 所以我的计划是只允许从该机器的 IP 进行匿名访问 我对亚马逊云还很陌生 存储桶策略看起来是不错的选择 我将以下策略添加到我的存储桶中 Ver
  • 如何解决“允许的最大密钥长度为 900 字节”。

    我有以下表结构 CREATE TABLE dbo Signature caption id nvarchar 512 NOT NULL signature id int NOT NULL 我想使用以下 alter 命令添加主键 ALTER
  • C# 中 System.String[*] 和 System.String[] 的区别

    Edit 我知道 C 相当于For Each server As String In servers is foreach var item in servers 但是由于GetOPCServers返回对象 应该将其转换为可迭代类型 我正在
  • 页面抓取以从谷歌财经获取价格

    我试图通过抓取谷歌金融页面来获取股票价格 我在 python 中使用 urllib 包 然后使用正则表达式来获取价格数据 当我让 python 脚本运行时 它最初会运行一段时间 几分钟 然后开始抛出异常 HTTP 错误 503 服务不可用
  • 如何设置“如果对象存在”条件?

    有没有办法检查对象是否存在 我不断收到 需要对象 错误 我知道该对象不存在 如果是这种情况 我想绕过我的代码的一部分 我不知道什么是我没有尝试过的 var codeName document getElementById testCode
  • 如何阻塞直到BlockingQueue为空?

    我正在寻找一种方法来阻止直到BlockingQueue是空的 我知道 在多线程环境下 只要有生产者将物品放入BlockingQueue 可能会出现队列变空 几纳秒后又充满项目的情况 但是 如果只有one生产者 那么它可能希望在停止将项目放入
  • 为 iPhone 或 Android 开发? (作为 C# 开发人员)[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用 R 提取包含特定人名的句子

    我正在使用 R 来提取包含特定人名的句子来自文本 这是一个示例段落 在蒂宾根 他作为改革家遭到反对 但在他的叔公约翰 罗伊克林的推荐下 他接受了马丁 路德的召唤 进入维滕贝格大学 梅兰希顿 21 岁时成为维滕贝格的希腊语教授 他研究圣经 尤
  • 根据 Python Pandas 中的描述场景和状态过滤产品

    假设我在 Pandas DataFrame 中有以下产品描述 我想保留满足以下条件的产品的所有产品描述 对于每一个id in product descriptions 检查是否包含全部descriptions从 至少 1 个场景scenar
  • DocumentDB IN 关键字与 Linq

    您现在可以使用 DocumentDB 创建 IN 查询 如下所示 SELECT FROM Families WHERE Families id IN AndersenFamily WakefieldFamily 但如果我使用 Linq 运行
  • Python GTTS 错误:AttributeError:“NoneType”对象没有属性“group”

    我有一个项目正在进行文本到语音转换 我的音频文件被存储为 mp3 但现在 当我检查 Gtts api 时抛出错误 我尝试搜索但找不到该错误的可行解决方案 我的代码如下 def synth sent language en slow Fals
  • 如何在 Raspberry Pi 上安装 PhantomJS 以便与 Python Selenium 一起使用?

    我想使用运行 Python 脚本Selenium WebDriver with PhantomJS作为我的无头浏览器树莓派运行 Raspbian 我最初在 OS X 中编写了该脚本 它运行良好 但在尝试让它在树莓派上工作时 我遇到了问题 当
  • 如何在 Palantir Foundry 中合并具有相同模式的多个数据集?

    我有几个数据集想要在 Palantir Foundry 中合并 我提前知道数据集是什么 所有数据集的架构都是相同的 即它们具有相同的列名称和列类型 组合 联合 这些数据集的最佳方法是什么 数据集A col1 col2 1 a 2 b 数据集
  • Pandas 使用列作为后缀进行透视

    我有一个类似于以下示例的数据框 Id Type Value 1 Value 2 1234 A 1 2 1234 B 1 2 789 A 1 2 789 B 1 2 567 A 1 2 我想转换以获得以下内容 Id Value 1 A Val
  • 用于反转字节顺序/更改字节顺序的命令行

    我在一些脚本中尝试解析 Java 编写的一些数据DataOutputStream writeLong 由于java似乎总是写大端 所以我在将字节输入到od 这是因为od总是假设字节序与您当前所在的拱门的字节序相匹配 而我在一台小字节序机器上
  • Erlang:如何限制分配给进程的内存

    我要问的是是否可以限制分配给特定进程的内存 堆或堆栈 以便该进程不能超过它 也许类似于 process flag min heap size MinHeapSize 但针对最大堆 您可以将某种进程跟踪 gen server 放在一起 定期检
  • 在 socket.io-client 中调用 IO 时出现错误,角度 8

    我在我的 Angular 项目中调用 socket io client 的 IO 如下所示 import Injectable from angular core import Observable from rxjs internal O
  • 在未压缩的 PDF 中进行集体内联编辑

    我有一个很大的 PDF 20mb 160mb 未压缩 我需要在其中的文本中进行查找和替换 大约 1000 次 这是我尝试过的 Via SVG 转换为 SVG inkscape 逐行读取 SVG 并在文件中进行替换 转换回 PDF gt 输出