2

В настоящее время у меня есть PDF-файл без какой-либо ToC (например, в Mac Preview.app я не вижу ToC на боковой панели).

Но у меня есть оглавление в формате XML, где есть заголовок и номер страницы, где начинается этот раздел.

Можно ли как-то добавить это оглавление в мой PDF-файл?

Поскольку у меня есть оглавление в XML, я могу проанализировать его любым возможным способом, поэтому, если бы существовала командная строка для добавления элемента оглавления в PDF, я также мог бы это сделать.

Есть идеи?

2 ответа2

2

Добавить закладку в PDF довольно просто, используя Ghostscript. Синтаксис:

gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=out.pdf in.pdf pdfmarks

Где pdfmarks - это текстовый файл с таким содержимым, как:

[/Title (Title Page) /Page 1 /OUT pdfmark
[/Title (Table of Contents) /Page 3 /OUT pdfmark
...

Для вложенных уровней используйте атрибут /Count. Например:

[/Count 3 /Title (Chapter 1) /Page 1 /OUT pdfmark
[/Count -2 /Title (Section 1.1) /Page 2 /OUT pdfmark
[/Title (Section 1.1.1) /Page 3 /OUT pdfmark
[/Title (Section 1.1.2) /Page 4 /OUT pdfmark
[/Count -1 /Title (Section 1.2) /Page 5 /OUT pdfmark
[/Title (Section 1.2.1) /Page 6 /OUT pdfmark
[/Title (Section 1.3) /Page 7 /OUT pdfmark

Аргумент к /Count дает количество непосредственно подчиненных закладок. Знак аргумента устанавливает отображение по умолчанию (отрицательное для закрытого, положительное для открытого).

Если в качестве оглавления недостаточно закладок, существуют приложения, которые создают оглавление из закладок. Я не использовал ничего подобного, но прибегнул к поиску, например Mapsoft TOCBuilder, который является коммерческим плагином Adobe Acrobat с пробной версией.

Источники:
PDF закладки с Ghostscript
Как создавать закладки с помощью ghostscript/pdfwrite/pdfmark

0

Если у вас есть только один файл, вот способ, которым вы можете сделать это, используя pdfTeX . Это может быть немного запутанным, но я знаю TeX (и не знаю других инструментов), и он делает свое дело, когда мне это нужно.

Вот пример файла, который скопирует полное содержимое вашего input.pdf и добавит оглавление, содержащее ссылки на некоторые номера страниц.

% Set page size... this is A4, change to whatever you need
\pdfpagewidth=210mm
\pdfpageheight=297mm

% TeX always adds unwanted 1in left and top margins, this counteracts them.
\advance\hoffset by -1in
\advance\voffset by -1in

% This macro inserts a verbatim copy of one page from the source into the output.
\def\copypage#1{%
  \pdfximage page #1 {input.pdf}%
  \shipout\vbox{\pdfrefximage\pdflastximage}}

% Determine the total number of pages
\pdfximage{input.pdf}
\newcount\total
\total=\pdflastximagepages

% Define an iterator to copy the whole file
\def\copy{%
  \copypage{\the\pageno} % Copy the page given by current page number
  \advance\pageno by 1 % Increase page number by one
  \ifnum\pageno > \total
    \let\copy\relax % After the last page has been copied, stop
  \fi
  \copy} % This repeats the cycle until \copy is redefined to \relax at the very end

\copy % Run the cycle

% Here you add your outline
\pdfoutline goto page 1 {/Fit} count 2 {Chapter}
  \pdfoutline goto page 1 {/Fit} count -3 {Section}
    \pdfoutline goto page 1 {/Fit} {Item}
    \pdfoutline goto page 2 {/Fit} {Item}
    \pdfoutline goto page 3 {/Fit} {Item}
  \pdfoutline goto page 4 {/Fit} count 1 {Section}
    \pdfoutline goto page 4 {/Fit} count -2 {Subection}
      \pdfoutline goto page 1 {/Fit} {Item}
      \pdfoutline goto page 5 {/Fit} {Item}

\end

Как использовать команду \pdfoutline :

  • Всегда указывайте номер страницы, даже для заголовков разделов, которые не должны использоваться напрямую
  • Замените "Глава", "Предмет" и т.д. Желаемыми заголовками
  • Укажите счетчик для элементов, которые содержат подэлементы (обратите внимание, что нет команды "закрытие", поэтому TeX должен знать счет заранее)
  • РЕДАКТИРОВАТЬ благодаря harrymc: сделайте счет отрицательным, если вы хотите, чтобы элемент с подпунктами был закрыт по умолчанию, оставьте его положительным, если вы хотите, чтобы он был открыт

После подготовки этого входного файла, сохраните его как, скажем, output.tex и обработайте его с помощью pdftex . Вуаля, это создает output.pdf с новым блестящим ToC.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .