Ответы:
Вот рабочее решение. Однако вам нужно будет настроить его в соответствии с вашими потребностями.
В моем примере я удалил первую страницу PDF, а затем мне нужно было обновить закладки, чтобы они указывали на правильные местоположения.
удалить страницу 1 из in.pdf:
pdftk A=in.pdf cat A2-end output temp.pdf
создать файл in.info из файла in.pdf:
pdftk in.pdf dump_data > in.info
В моем случае необходимо исправить in.info, так как я удалю страницу.
Таким образом, мне нужно уменьшить BookmarkPageNumber на единицу, чтобы закладки приводили к нужным страницам.
PHP-код:
$file = "in.info";
$data = file_get_contents($file);
foreach (explode("\n", $data) as $row) {
$tmp = explode(": ", $row);
if ($tmp[0] == "BookmarkPageNumber") {
if ($tmp[1] != "1") $tmp[1]--;
echo $tmp[0].": ".$tmp[1]."\n";
} else {
echo $row."\n";
}
}
создать окончательный out.pdf:
pdftk temp.pdf update_info in2.info output out.pdf
протестировал работу на Debian с использованием pdftk 2.01
Вам нужно сделать pdftk in.pdf dump_data > in.info, а затем добавить update_infoпараметр при генерации out.pdf. Цитирование из man pdftk:
update_info <info data filename | - | PROMPT>Изменяет метаданные, хранящиеся в отдельном информационном словаре PDF, в соответствии с файлом входных данных. Файл входных данных использует тот же синтаксис, что и вывод из dump_data. Не-ASCII символы должны быть закодированы в виде числовых объектов XML. Это не меняет метаданные, хранящиеся в потоке XMP PDF, если они есть. Например:
pdftk in.pdf update_info in.info output out.pdf
update_info_utf8 <info data filename | - | PROMPT>
То же, что update_info, за исключением того, что вход кодируется как UTF-8.
dump_data_utf8для update_info_utf8работы, конечно.
pdftk in.pdf dump_data > in.info, pdftk in.pdf cat 1-22 43 23-42 44-end output out.pdfи pdftk out.pdf update_info in.info output out1.pdfТам до сих пор нет закладок в out1.pdf. `
Внимательно читая справочную страницу , он говорит, что update_infoпринимает данные в любом формате dump_data. Это, вероятно, должно быть скорректировано в соответствии с перетасовкой страницы. Звучит невозможно , но автоматически это не так.
Сайт PDFtk дает только указанный выше результат и создает / редактирует закладки в качестве результатов. Все, что Google знает о закладках в PDF и реорганизации, - это хиты описанных выше операций и лирические описания чудес, которые они предлагают, и этой ветки ;-).
Так что, кажется, это невозможно сделать. Комментарии предлагают некоторые возможности, которые не сработали при попытке.
«pdfmod» - это простой графический инструмент, который позволяет удалить одну или несколько страниц режима из существующего PDF. Это всего лишь вопрос нескольких кликов. Он также сохраняет информацию о содержании и перекрестные ссылки в формате PDF.
«pdftk» работает хорошо, и я использовал его в течение длительного времени, но раньше я терял контент после удаления одной или двух страниц из pdf. Те PDF-файлы, которые тестируются в "pdftk" и "pdfmod", создаются из openoffice.
pdfmodкажется лучше, чем pdftkкогда дело доходит до сохранения метаданных. Различный exiftoolвывод показывает, что pdfmodсохраняет метаданные, но pdftkне сохраняет все, даже если вы используете dump_data_utf8& update_info_utf8.
#!/usr/bin/python output = open('res.info','w') with open('temp.info','r') as f: for line in f: if line.startswith("BookmarkPageNumber"): output.write( "BookmarkPageNumber: "+ str(int(line.split()[1])+1)+"\n") else: output.write(line)