3

问题是关于 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 阅读器上看到过同样的问题(不记得是哪个) ePDFViewerSumatraPDF

顺便说一句,我在 Ubuntu 11.04 上使用 Evince 2.32.0

4

0 回答 0