问题是关于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"
...
在sqare括号中,它是目的地布局的类型 脚本很快(每秒几个文档)易于掌握,什么不是,只有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 bug。只有当目的地书签类型设置为/FitH
- “适合Horizontaly”时,才会触发上述问题。我会假设“Fit Height”,因为这就是Evince的行为。
使用Wine下的ePDFViewer
或SumatraPDF
打开时,相同的文件不像Evince。也许这就是这个PDF查看器的设计方式,但我记得见过一些Windows PDF阅读器的相同问题(不记得是哪个)
BTW,我在Ubuntu 11.04上使用Evince 2.32.0