如何删除书签目标文档属性

时间:2011-11-27 14:59:02

标签: pdf pypdf

问题是关于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 - “适合Horizo​​ntaly”时,才会触发上述问题。我会假设“Fit Height”,因为这就是Evince的行为。
使用Wine下的ePDFViewerSumatraPDF打开时,相同的文件不像Evince。也许这就是这个PDF查看器的设计方式,但我记得见过一些Windows PDF阅读器的相同问题(不记得是哪个)

BTW,我在Ubuntu 11.04上使用Evince 2.32.0

0 个答案:

没有答案