Как удалить свойства документа назначения закладки - PullRequest
2 голосов
/ 27 ноября 2011

Вопрос касается 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

  • Этого не произошло

2в. добавьте BookmarkTitle: Temp title строку в "doc.nfo" в надежде, что теперь закладки будут перезаписаны:

echo "BookmarkTitle: Temp title" >> book.nfo
pdftk doc.pdf update_info doc.nfo output new.pdf

  • Этого не произошло

Здесь я остановился

Я не знаю ни одного другого инструмента CLI, который позволял бы мне удалять закладки из файлов PDF, кроме GhostScript с пустым файлом pdfmarks, но GS занимает слишком много времени для обработки файлов PDF, и я хочу этого избежать.

Также в этом процессе я начал подозревать, что это ошибка Evince. Вышеуказанная проблема возникает только в том случае, если в качестве целевого типа закладок задано значение /FitH - вместо «Подгонка по горизонтали» я буду использовать «Подгонка по высоте», поскольку именно так ведет себя Evince.
Те же файлы, которые открываются с помощью ePDFViewer или SumatraPDF в Wine, не ведут себя как Evince. Может быть, так устроено это средство просмотра PDF, но я помню, как наблюдал ту же проблему с некоторыми программами чтения PDF для Windows (не помню, какие именно)

Кстати, я на Ubuntu 11.04 с Evince 2.32.0

...