问题是关于 PDF 书签。
创建书签时,可以选择分配目标页面布局(除其他外),鼓励用户不要设置,除非确实有理由这样做。
我有时会跑到这类文件,并想永久删除此属性,同时保留书签。
我假设您理解我的要求,但如果不是这里,这个问题的说法会有所不同:
我的偏好是将我的 PDF 阅读器 (Evince) 设置为具有两页显示和最适合的页面布局,这对我来说是最舒服的。现在,一些 PDF 文档在书签目的地设置了自定义文档布局(例如页面宽度 75%),每次使用书签跳转到页面时,我都必须更正我的布局。
在 PDF 阅读器中忽略此属性的选项会很好,但没有,所以我想使用一些命令行工具处理此 PDF 文件并从 PDF 书签中删除所有这些自定义属性
更新:
这是我现在在哪里 - 无处 :)
我不仅需要工具来“纠正”这个问题,而且还需要知道哪些 PDF 文件受到了影响。
我使用 pyPdf 来完成这项工作:
# chk-out.py
import sys
from pyPdf import PdfFileReader
def flat(iterable):
for element in iter(iterable):
if isinstance(element, list):
for e in flat(element):
yield e
else:
yield element
f = open(sys.argv[1], 'rb')
p = PdfFileReader(f)
try:
for outline in flat(p.getOutlines()):
if outline['/Type']:
print '[%s]: "%s"' % (outline['/Type'], sys.argv[1])
exit()
except AssertionError:
print '[***] File "%s": Feature not supported, or corrupted PDF' % sys.argv[1]
f.close()
行如:
$ for f in *.pdf ; do python chk-out.py "$f" ; done
输出如下内容:
[/Fit]: "doc1.pdf"
[/XYZ]: "doc2.pdf"
[/Fit]: "doc3.pdf"
[/FitH]: "doc4.pdf"
...
在方括号中,它是目标布局的类型。
脚本速度快(每秒几个文档)易于掌握,但 pyPdf 不支持编写 PDF 书签
我想用pdftk
这个任务:
1:在单独的文件中转储元数据和书签:
pdftk doc.pdf dump_data | grep ^Info > doc.nfo
pdftk doc.pdf dump_data | grep ^Book > doc.toc
2:尝试删除书签,然后从“doc.toc”更新
2a. 只需尝试编写“doc.toc”
pdftk doc.pdf update_info doc.toc output new.pdf
- 没有改变
2b。写信息元数据,希望书签轮廓将被删除:
pdftk doc.pdf update_info doc.nfo output new.pdf
- 它没有发生
2c。在“doc.nfo”中追加BookmarkTitle: Temp title
一行,希望现在书签将被覆盖:
echo "BookmarkTitle: Temp title" >> book.nfo
pdftk doc.pdf update_info doc.nfo output new.pdf
- 它没有发生
这是我停下来的地方
我不知道任何其他 CLI 工具可以让我从 PDF 文件中删除书签,除了带有空pdfmarks
文件的 GhostScript,但是 GS 处理 PDF 文件需要太多时间,我想避免这种情况。
同样在这个过程中,我开始怀疑这是 Evince 错误。仅当目标书签类型设置为/FitH
“适合水平”时才会触发上述问题,我将假设改为“适合高度”,因为这就是 Evince 的行为方式。使用 Wine或在 Wine 下
打开相同文件时的行为与 Evince 不同。也许这就是这个 PDF 查看器的设计方式,但我记得在某些 Windows PDF 阅读器上看到过同样的问题(不记得是哪个) ePDFViewer
SumatraPDF
顺便说一句,我在 Ubuntu 11.04 上使用 Evince 2.32.0