如何查看和编辑PDF文件的代码


12

我想知道如何查看和编辑PDF文件的代码?

  1. 通过查看,我不想看到二进制格式,因此我想hexdump可能不是我想要的。我试过了gedit,但是没有编码方法可以用来解码PDF内容。

  2. 通过编辑,我想搜索/Fit并将其更改 /XYZ为例如sed。但是我的命令sed s/\/Fit/\/XYZ/ < 1.pdf > 2.pdf似乎没有改变我的PDF的外观,尽管它没有报告任何错误。我想知道是否sed真的可以像纯文本格式一样处理PDF文件?

我的问题的背景可以从这个问题中找到。我的操作系统是Ubuntu 10.10。

Answers:


9

您可以使用sed二进制文件(至少GNU sed;某些实现可能会遇到包含空字符或未以换行符结尾的文件的麻烦)。但是,您使用的命令仅替换了/Fit每行中的第一个匹配项,并且在PDF文件中行几乎没有意义。您需要替换所有事件:

 sed s/\/Fit/\/XYZ/g

/Fit当单词后没有单词组成部分时才替换(例如,不替换/Fitness;我不知道您的文件是否包含/Fit该内容会引起麻烦),否则替换将更可靠。这是一种方法:

perl -pe 's!/Fit\b!/XYZ!g'

谢谢!现在可以使用了!(1)我想知道sed如何以二进制内容搜索字符?sed在搜索之前是否先对查询字符进行编码?(2)在最后一条命令中!\bg是什么意思?仅使用sed就可以不用perl来完成吗?

1
@Tim(1)Sed将数据加载到内存中,对其进行操作并打印出来。为什么它需要编码什么?(2)g表示替换sed和perl中每一行上的所有匹配项。!是分隔符;您可以选择(几乎)任何字符作为s命令的分隔符(在sed和perl中都使用)。\b表示单词边界;它存在于perl中,但不存在于sed中。
吉尔(Gilles)“所以,别再邪恶了”,

关于(1),因为您在命令中赋予sed的字符是人类可读的。如果要搜索的内容完全是二进制的,那么sed如何在其中找到查​​询词?
蒂姆(Tim)

@Tim Text是碰巧是人类可读的二进制数据。
吉尔(Gilles)“所以,别再邪恶了”,

1
@Tim是的,您可以在查询中传递二进制数据。您必须按原样在sed或shell源代码中插入字符。
吉尔(Gilles)“所以,别再邪恶了”,

17

关于您的第一个问题(“查看源代码,但没有二进制”):为了解压缩附加到许多对象的内部二进制流,您有几个选择。

我最喜欢的工具是QPDF,可在所有主要的OS平台上使用。以下命令解压缩所有流和所有对象流:

 qpdf --qdf --object-streams=disable orig.pdf expanded.pdf

现在,您可以在任何文本编辑器中打开PDF。(那里可能仍然存在一些二进制blob:例如,字体文件和ICC配置文件,这对于QPDF的扩展没有意义)。

重新压缩expanded.pdf编辑后再次,你可以运行:

 qpdf expanded.pdf orig2.pdf

(在手动编辑PDF时请小心!要正确执行此操作,您需要了解很多有关其内部语法的信息。添加或删除单个字节后,您可能会收到来自PDF读取器的错误消息,这些读者可能不再能够打开它,因为PDF的内部ToC已损坏,这是基于字节偏移量计算的。尽管仅替换FitXYZ字符串也可以,但是...)


1
您也可以添加或删除文本。当对象流的长度更改时,可以使用fix-qdfqpdf一部分的程序重新计算字节偏移。不过,您仍然必须小心一点。参见qpdf.sourceforge.net/files/qpdf-manual.html#ref.qdf
H. Rittich

@ H.Rittich:谢谢您的评论……您认为这以什么方式为问题开辟了新的视角?您是否认为我们不知道我们可以通过这种方式添加或删除文本?
Kurt Pfeifle

@KursPfeifle:我不对您所知道的做任何假设。答案表明,以这种方式编辑PDF 需要保留文件中对象的字节偏移量。但是,以后可以使用时,可以更改字节偏移量fix-qdf。因此,如果要用不同长度的字符串替换字符串,则可以,但是需要使用该fix-qdf工具。我会说,这是对答案的有用补充。
H. Rittich '19

@ H.Rittich:谢谢你的见解。当我强调要保留对象的字节偏移我不想劝告人们了解如何,他们应该这样做。如果您的评论措词略有不同,我会更快地理解您的评论意图的。
Kurt Pfeifle

1

sed它是面向行的,因此不适用于二进制文件,这些文件的结构是块而不是行。
尝试改用bbe(bbe-.sourceforge.net)。

另外,Emacs(GNU和XEmacs)和vim都可以无缝打开PDF文件。当然,它打印的不是很漂亮,因为它是文本和二进制混合的,但是对于您的编辑目的来说已经足够了。
有一个用于vim 的Pdftk插件,可以使所有操作变得更加容易,请在此处下载(zip文件)。
您可能知道,以上两个编辑器都具有强大的搜索和替换功能。

另外,将PDF转换为QDF模式之前,实际上很容易编辑PDF文件。


您也可以尝试sed使用-b开关进行编辑。如果有效,我将其添加到我的答案中。
Philomath

@Tim:“什么都不显示”是什么意思,只是空的?任何错误消息?另外,您可以尝试使用XEmacs吗?(他们三个都为我工作)。
Philomath

没关系-b,它是特定于Cygwin的。
Philomath

Emacs说:“文件1.pdf大(9MB),真的打开了吗?(是或否)”。我选择“ y”,然后什么也没有。

最有可能是Emacs问题,您有XEmacs吗?(我刚刚打开了一个31 MB的PDF,没有任何问题)。
Philomath

0

使用LibreOffice或OpenOffice打开PDF,查看,替换,编写新PDF等。我认为,即使有很多文档要处理,您甚至可以从命令行或以编程方式使用它。

请注意,来自某些来源(例如扫描仪)的PDF 通常将页面作为图像而不是文本来包含,因此您在使用搜索和替换时会感到不走运。


3
(1/2)请注意以下事实:LibreOffice不是本机PDF编辑器。打开PDF时,它将所有页面转换为矢量图像(这可能会将原始PDF的光栅部分保留为光栅部分),并在LibreOffice套件的LibreOffice Draw部分中将其打开。然后,当它保存编辑的PDF文件时,它将是一个PDF文件,该文件已从本机LibreOffice Draw格式(后缀.odg导出为PDF。
Kurt Pfeifle

3
(2/2)此工作流程可能会有意外的副作用。此外,LibreOffice Draw应用程序可能无法正确地从原始PDF导入所有元素。但是,在许多情况下,它对于所有没有更好方法的人仍然可能是有用的工具。
Kurt Pfeifle
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.