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