Answers:
您可以使用sed
二进制文件(至少GNU sed;某些实现可能会遇到包含空字符或未以换行符结尾的文件的麻烦)。但是,您使用的命令仅替换了/Fit
每行中的第一个匹配项,并且在PDF文件中行几乎没有意义。您需要替换所有事件:
sed s/\/Fit/\/XYZ/g
仅/Fit
当单词后没有单词组成部分时才替换(例如,不替换/Fitness
;我不知道您的文件是否包含/Fit
该内容会引起麻烦),否则替换将更可靠。这是一种方法:
perl -pe 's!/Fit\b!/XYZ!g'
g
表示替换sed和perl中每一行上的所有匹配项。!
是分隔符;您可以选择(几乎)任何字符作为s
命令的分隔符(在sed和perl中都使用)。\b
表示单词边界;它存在于perl中,但不存在于sed中。
关于您的第一个问题(“查看源代码,但没有二进制”):为了解压缩附加到许多对象的内部二进制流,您有几个选择。
我最喜欢的工具是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已损坏,这是基于字节偏移量计算的。尽管仅替换Fit
为XYZ
字符串也可以,但是...)
fix-qdf
qpdf一部分的程序重新计算字节偏移。不过,您仍然必须小心一点。参见qpdf.sourceforge.net/files/qpdf-manual.html#ref.qdf
fix-qdf
。因此,如果要用不同长度的字符串替换字符串,则可以,但是需要使用该fix-qdf
工具。我会说,这是对答案的有用补充。
sed
它是面向行的,因此不适用于二进制文件,这些文件的结构是块而不是行。
尝试改用bbe(bbe-.sourceforge.net)。
另外,Emacs(GNU和XEmacs)和vim都可以无缝打开PDF文件。当然,它打印的不是很漂亮,因为它是文本和二进制混合的,但是对于您的编辑目的来说已经足够了。
有一个用于vim 的Pdftk插件,可以使所有操作变得更加容易,请在此处下载(zip文件)。
您可能知道,以上两个编辑器都具有强大的搜索和替换功能。
另外,将PDF转换为QDF模式之前,实际上很容易编辑PDF文件。
sed
使用-b
开关进行编辑。如果有效,我将其添加到我的答案中。
-b
,它是特定于Cygwin的。
使用LibreOffice或OpenOffice打开PDF,查看,替换,编写新PDF等。我认为,即使有很多文档要处理,您甚至可以从命令行或以编程方式使用它。
请注意,来自某些来源(例如扫描仪)的PDF 通常将页面作为图像而不是文本来包含,因此您在使用搜索和替换时会感到不走运。
!
,\b
和g
是什么意思?仅使用sed就可以不用perl来完成吗?