Как сохранить закладки при перестановке страниц файла PDF с помощью таких инструментов, как pdftk?

12

Я использую, pdftkчтобы переставить страницы файла PDF с закладками / схемами, но после этого выходной файл потерял закладки оригинала.

Моя команда pdftk in.pdf cat 1-22 43 23-42 44-end output out.pdf.

Мне было интересно, как я мог сохранить закладки, переставляя страницы?

Тим
источник

Ответы:

10

Вот рабочее решение. Однако вам нужно будет настроить его в соответствии с вашими потребностями.

В моем примере я удалил первую страницу PDF, а затем мне нужно было обновить закладки, чтобы они указывали на правильные местоположения.

  1. удалить страницу 1 из in.pdf:

    pdftk A=in.pdf cat A2-end output temp.pdf
    
  2. создать файл in.info из файла in.pdf:

    pdftk in.pdf dump_data > in.info
    
  3. В моем случае необходимо исправить 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";
        }
    }
    
  4. создать окончательный out.pdf:

    pdftk temp.pdf update_info in2.info output out.pdf
    

протестировал работу на Debian с использованием pdftk 2.01

Мартин Олика
источник
1
Работал на меня тоже. Может быть, вы могли бы добавить подсказку о том, как выполнить ваш скрипт (не знаю, как ...) или добавить скрипт на python:#!/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)
Vser
6

Вам нужно сделать 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.

человек, любящий учиться
источник
Благодарность! Как мне получить этот файл "in.info"?
Тим
@Tim: отредактировано. Надеюсь теперь понятно. Вы должны использовать dump_data_utf8для update_info_utf8работы, конечно.
Филомат
3
Благодарность! Это все еще не работает. Мои команды в три этапа: 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. `
Тим
@ Тим, я могу подтвердить, что это действительно не работает. Вы нашли какое-нибудь решение для этого случайно?
Glutanimate
1
Мой беглый траул Google показывает, что закладки вообще не обрабатываются.
vonbrand
5

Внимательно читая справочную страницу , он говорит, что update_infoпринимает данные в любом формате dump_data. Это, вероятно, должно быть скорректировано в соответствии с перетасовкой страницы. Звучит невозможно , но автоматически это не так.

Сайт PDFtk дает только указанный выше результат и создает / редактирует закладки в качестве результатов. Все, что Google знает о закладках в PDF и реорганизации, - это хиты описанных выше операций и лирические описания чудес, которые они предлагают, и этой ветки ;-).

Так что, кажется, это невозможно сделать. Комментарии предлагают некоторые возможности, которые не сработали при попытке.

vonbrand
источник
1

«pdfmod» - это простой графический инструмент, который позволяет удалить одну или несколько страниц режима из существующего PDF. Это всего лишь вопрос нескольких кликов. Он также сохраняет информацию о содержании и перекрестные ссылки в формате PDF.

«pdftk» работает хорошо, и я использовал его в течение длительного времени, но раньше я терял контент после удаления одной или двух страниц из pdf. Те PDF-файлы, которые тестируются в "pdftk" и "pdfmod", создаются из openoffice.

https://apps.fedoraproject.org/packages/pdfmod

Abhijit
источник
pdfmodкажется лучше, чем pdftkкогда дело доходит до сохранения метаданных. Различный exiftoolвывод показывает, что pdfmodсохраняет метаданные, но pdftkне сохраняет все, даже если вы используете dump_data_utf8& update_info_utf8.
user1338062