【问题标题】:en masse inline editing in an uncompressed PDF在未压缩的 PDF 中进行批量内联编辑
【发布时间】:2015-03-27 00:10:11
【问题描述】:

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

  1. 通过 SVG

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

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

  1. 创建 ~1000 sed 命令

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

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

  1. 逐行读取并替换

    • 解压缩 PDF
    • 逐行阅读 PDF
      • 查找要替换的文本
      • 使用 perl 替换
      • 将行写入新文件
    • 压缩新文件

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

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

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

非常欢迎其他想法;)

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

【问题讨论】:

  • 在 Perl 中,将整个未压缩的 PDF 以二进制形式读取到内存中,进行尽可能多的更改,编写新版本。
  • 好主意。虽然您如何在二进制文件中查找和替换文本?
  • Denis Rouzaud:您可以使用专门用于处理 PDF 文档的库。
  • reinerpost: 你能说出我的名字吗(在 linux 下)?谢谢!

标签: perl pdf sed


【解决方案1】:

2.和3没有区别。sed逐行读取输入文件,将改变的行写入输出文件。如果您将-i 切换到它,sed 只是打开输入文件然后取消链接(这是rm 所做的)然后打开具有相同名称的输出文件并写入。而已。不涉及魔法。因此,如果您通过 Perl 而不是sed 损坏了内容,那么您所做的事情与sed 不同。主要区别在于,您可以使 Perl 脚本更快地替换许多字符串。见Using sed on text files with a csv

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

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

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

您可以将它与您的原始方法一起使用,但我建议您在 Perl 脚本中制作它,这样您就可以保留正则表达式并替换 pdf 文件之间的哈希值。您也可以尝试将其与CAM::PDF 结合使用。其中有示例脚本changepagestring.pl。您还可以查看PDF::API2,这需要更多的工作,但可能会提供更好的结果。但请记住,PDF 格式不适合修改。

【讨论】:

  • 嗯,不完全一样。 2、我要运行1000次sed命令。使用 3,我只读取一次文件,如果找到要替换的模式,我会替换它。这就是为什么 2 需要 6-7 小时而 3 需要
  • 在 3 中,问题是我以 ASCII 格式读取文件并将内容以 ASCII 格式写入新文件,所以我认为解压缩文件时留下的一些二进制流存在问题。
  • “但请记住,PDF 格式不适合修改” 您是什么意思? Adobe Acrobat 正是这样做的。
  • @DenisRouzaud 您也只能运行 sed 一次。您可以传递更多的-e 参数,也可以将多个参数写入一个以; 分隔的参数。
  • @DenisRouzaud 你说的 ASCII 文件是什么意思?你认为这意味着什么? ASCII 是如何以二进制编码字符的方式。它们是外面的 EBCDIC 计算机,主要是在博物馆里。您在 Windows 中工作吗?您可能应该使用-C0 开关或使用binmode() 或:raw io 层。 Perl 默认情况下不会区别对待 ASCII。
【解决方案2】:

您可以按照中所述的 pdftk 步骤进行操作 How to find and replace text in a existing PDF file with PDFTK (or other command line application)

您可以先将 PDF 拆分为较小的文档,每个文档有几页,替换文本并再次将它们合并在一起 - 全部使用 pdftk。

还有 PDFEdit 软件 (http://pdfedit.cz/en/index.html)。它是一个带有脚本界面的 GUI 应用程序。您可以处理单个页面,然后使用脚本命令进行查找替换。看看它是否会加载您的 PDF。

【讨论】:

  • 为什么要将文档拆分成更小的文档?
  • Denis:PDF 为单页,文档大小为 160 MB。这可能意味着 PDF 包含一个大图像,并且文本在图像中而不是文本中。请检查您是否能够在 Evince 等 PDF 查看器中选择文本。
  • Reiner:我认为内存限制受到了影响,因为文档有很多页面。页面较小的文档会更易于管理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2022-11-23
相关资源
最近更新 更多