2015-05-18 2 views
5

Я ищу инструмент командной строки, чтобы добавить закладки в файл PDF.Создание закладок в файл PDF через командную строку

У меня есть page number и label. Хотелось бы создать закладку под названием label, ссылаясь на страницу page number.

Кто-нибудь знает инструмент командной строки (желательно OSX) для этого?

У меня есть около 4000 страниц PDF-файлов и около 150 закладок, и я бы хотел автоматизировать его.

Мой план заключается в использовании системного вызова внутри r-скрипта.

EDIT

создать около 4000 одного PDF-файлы с графиками и я с помощью системной команды OSX /System/Library/Automator/Combine PDF Pages.action/Contents/Resources/join.py присоединиться к PDF-файлов вместе. Раньше я использовал pdfjoin от pdfjam, но это было слишком медленно. В конце концов, именно так я получаю свой PDF-файл, когда я добавляю закладки вручную с помощью Adobe Acrobat Professional на данный момент.

+0

Я не уверен, что у вас есть код для создания PDF-файла или только самого PDF-файла. Если первое, нам понадобится гораздо больше деталей. – Roland

+0

Спасибо @Roland, я добавил информацию о томе. – drmariod

+0

[pdftk] (https://www.pdflabs.com/docs/pdftk-version-history/) может обновлять/вставлять закладки. Кроме того, вот потенциально полезный поток на [stats.SO] (http://unix.stackexchange.com/questions/17065/add-and-edit-bookmarks-to-pdf) – hrbrmstr

ответ

3

Вы также можете использовать pdftk. Также имеется for OS X.

Я не просматриваю все детали здесь и сейчас, потому что это уже было сделано в другом месте. Просто коротко:

  1. Создайте образец PDF из исходных файлов (без закладок).
  2. Добавить закладок с Adobe Acrobat (к которым у вас есть доступ).
  3. Выполнить одну из следующих команд:

    pdftk my.pdf dump_data output - 
    pdftk my.pdf dump_data output bookmarks+otherdata.txt 
    
  4. Исследование формат выходного сигнала.

  5. Измените выходной .txt-файл, добавив все нужные записи.
  6. Run PDFTK снова:

    pdftk my.pdf update_info bookmarks.txt output bookmarked.pdf 
    

Дополнительная информация

Это формат Закладка я заметил, после проверки на шаге 4 выше.

BookmarkBegin 
BookmarkTitle: -- Your Title 1 -- 
BookmarkLevel: 1 
BookmarkPageNumber: 1 
BookmarkBegin 
BookmarkTitle: -- Your Title 2 -- 
BookmarkLevel: 1 
BookmarkPageNumber: 2 
BookmarkBegin 
BookmarkTitle: -- Your Title 3 -- 
... 
... 
and so on... 

И замените вышеуказанное .. в соответствующем месте.

+0

На самом деле, мне очень нравится это решение, очень четкий синтаксис и очень простой скрипт ... Спасибо – drmariod

+0

@drmariod: На самом деле, мне нравится это решение * наименее * из всех трех :) –

+0

Мне нравится это решение, самый лучший и самый простой я могу понять .. как у меня уже есть pdftk. – ihightower

1

Хорошо, вот quick'n'dirty способ сделать три работы сразу:

  1. Объединить ваши 400 одной страницы PDF-файлов.
  2. Создать документ верхнего уровня ToC (Содержание).
  3. Создайте закладку PDF для каждой страницы.

Включает использование установки LaTeX.

Вы можете начать с пустого шаблона LaTeX подобно следующему:

\documentclass[]{article} 
\usepackage{pdfpages} 
\usepackage{hyperref} 
    \hypersetup{breaklinks=true, 
       bookmarks=true, 
       pdfauthor={}, 
       pdftitle={}, 
       colorlinks=true, 
       citecolor=blue, 
       urlcolor=blue, 
       linkcolor=magenta, 
       pdfborder={0 0 0}} 
\begin{document} 

{ 
    \hypersetup{linkcolor=black} 
    \setcounter{tocdepth}{3} 
    % Comment next line in or out if you want a ToC or not: 
    \tableofcontents 
} 

%% Here goes your additional code: 
%% 1 line per included PDF! 

\end{document} 

Сейчас как раз перед последней строкой этого шаблона, вставить одну строку на внешний файл PDF вы хотите включить.

  1. В случае, если вы хотите создать TOC, он должен быть отформатирован следующим образом:

    \includepdf[pages={<pagenumber>},addtotoc{<pagenumber>,<section>,<level>,\ 
            <heading>,<label>}]{pdffilename.pdf} 
    
  2. В случае, если вы уверены, что каждый включенный PDF является 1-страничный документ, это упрощает это:

    \includepdf[addtotoc{<pagenumber>,<section>,<level>,\ 
            <heading>,<label>}]]{pdffilename.pdf} 
    

Здесь все следующих пяти параметров для addtotoc, в порядке, указанном для файлов, которые будут отображаться в записях и в ToC. См ниже для конкретного примера:

  • <pagenumber>: Количество страницы, вставленной документа, который будет связан с. (В вашем случае всегда «1», потому что вы вставляете только одностраничные документы, однако вы можете вставить 5-страничный документ и ссылку на страницу 3 вставленного PDF).
  • <section>: Название раздела LaTeX. Может быть section, subsection, subsubsection ... В вашем случае «раздел».
  • <level>: Уровень раздела LaTeX. В вашем случае «1».
  • <heading>: Это строка. Используется для текста закладки
  • <label>: Это должно быть уникально для каждой закладки. Используется в PDF-файле для перехода к правильной странице при нажатии закладки.

Чтобы проверить это быстро, я использовал Ghostscript для создания 20 1-страницы PDF документы:

for i in {1..20}; do 
    gs -o p${i}.pdf -sDEVICE=pdfwrite    \ 
     -c "/Helvetica findfont 30 scalefont setfont \ 
      100 600 moveto       \ 
      (Page ${i}) show       \ 
      showpage"; 
done 

С помощью этих тестовых файлов я мог бы сделать строки для вставки в шаблон выглядеть эти:

\includepdf[addtotoc={1,section,1,Page 1 (First),p1}]{p1.pdf} 
\includepdf[addtotoc={1,section,1,Page 2,p2}]{p2.pdf} 
\includepdf[addtotoc={1,section,1,Page 3,p3}]{p3.pdf} 
[...] 
\includepdf[addtotoc={1,section,1,Page 11 (In the Middle),p11}]{p11.pdf} 
[...] 
\includepdf[addtotoc={1,section,1,Page 20 (Last),p20}]{p20.pdf} 

Сохраните шаблон с вставленной строки, выполните следующую команду дважды:

pdflatex template.tex 
pdflatex template.tex 

Полученный файл будет иметь закладки, глядя, как это в Preview.app:

Screenshot: Preview.app with the bookmarks opened


Примечание: LaTeX доступен для OSX с помощью двух методов:


Я добавлю один или два метода для вставки закладки в командной строке тоже позже или в ближайшие дни, если у меня есть больше времени.

На данный момент это один должен сделать, потому что я никогда не показывал здесь на SO, AFAICR.

Но я думал, потому что вы дали фон «Я слияние 1-страницы PDF-файлов, и это медленно, а теперь я хочу, чтобы добавить закладки тоже ...», я мог бы показать, как это сделать с одним единственным методом.

ПОДСКАЗКА: Один из других методов будет использовать pdftk, которые IS доступна для Mac OS X!

+0

Я не запускаю команду' addtotoc' ... Это говорит команда не найдена, но она может найти пакет 'pdfpages' ... Поэтому я не понимаю проблему здесь :-( – drmariod

+0

@dmariod: Не видя ваш код, я не могу сказать, что с ним не так. очень простые, которые одни и те же глаза, которые смотрели на линию (и) при записи, уже не могут распознать, но «сторонние» глаза легко могут ... Случились и мне, и не только раз :) –

2

Вот еще один ответ. Этот использует Ghostscript для обработки PDF-to-PDF и pdfmark Оператор PostScript для вставки закладок.

Для некоторых введение в тему pdfmark, смотрите также:

Этот метод включает в себя два этапа:

  1. Создать текстовый файл (файл PostScript, на самом деле), с ограниченным набором pdfmark команд, по одному в строке и закладки, которую вы хотите добавить.
  2. Запустите команду Ghostscript, которая обрабатывает ваш текущий файл PDF вместе с текстовым файлом.

1.

Содержание в текстовый файл должен выглядеть следующим образом:

[/Page 1 /View [/XYZ null null null] /Title (This is page 1)   /OUT pdfmark 
[/Page 2 /View [/XYZ null null null] /Title (Dunno which page this is....) /OUT pdfmark 
[/Page 3 /View [/XYZ null null null] /Title (Some other name)  /OUT pdfmark 
[/Page 4 /View [/XYZ null null null] /Title (File 4)     /OUT pdfmark 
[/Page 5 /View [/XYZ null null null] /Title (File 5)     /OUT pdfmark 
[/Page 6 /View [/XYZ null null null] /Title (File 6)     /OUT pdfmark 
[/Page 7 /View [/XYZ null null null] /Title (File 7)     /OUT pdfmark 
% more lines for more pages to bookmark... 
[/Page 13 /View [/XYZ null null null] /Title (File 13)    /OUT pdfmark 
[/Page 14 /View [/XYZ null null null] /Title (Bookmark for page 14) /OUT pdfmark 
% more lines for more pages to bookmark... 

Имя этого файла, например: addmybookmarks.txt

2.

Теперь запустите эта команда:

gs -o bookmarked.pdf \ 
    -sDEVICE=pdfwrite \ 
    addmybookmarks.txt \ 
    -f original.pdf 

В результате PDF, bookmarked.pdf теперь содержит закладки. Смотрите этот скриншот:

Screenshot of bookmarks added with the help of Ghostscript and <code>pdfmark</code>

1

Вот метод python для добавления Закладок в Оглавление. Работает на MacOS без каких-либо других установок.

#!/usr/bin/python  
from Foundation import NSURL, NSString 
import Quartz as Quartz 
import sys 

# You will need to change these filepaths to a local test pdf and an output file. 
infile = "/path/to/file.pdf" 
outfile = "/path/to/output.pdf" 

def getOutline(page, label): 
    # Create Destination 
    myPage = myPDF.pageAtIndex_(page) 
    pageSize = myPage.boundsForBox_(Quartz.kCGPDFMediaBox) 
    x = 0 
    y = Quartz.CGRectGetMaxY(pageSize) 
    pagePoint = Quartz.CGPointMake(x,y) 
    myDestination = Quartz.PDFDestination.alloc().initWithPage_atPoint_(myPage, pagePoint) 
    myLabel = NSString.stringWithString_(label) 
    myOutline = Quartz.PDFOutline.alloc().init() 
    myOutline.setLabel_(myLabel) 
    myOutline.setDestination_(myDestination) 
    return myOutline 

pdfURL = NSURL.fileURLWithPath_(infile) 
myPDF = Quartz.PDFDocument.alloc().initWithURL_(pdfURL) 
if myPDF: 
    # Here's where you list your page index (starts at 0) and label. 
    outline1 = getOutline(0, 'Page 1') 
    outline2 = getOutline(1, 'Page 2') 
    outline3 = getOutline(2, 'Page 3') 

    # Create a root Outline and add each outline. (Needs a loop.) 
    rootOutline = Quartz.PDFOutline.alloc().init() 
    rootOutline.insertChild_atIndex_(outline1, 0) 
    rootOutline.insertChild_atIndex_(outline2, 1) 
    rootOutline.insertChild_atIndex_(outline3, 2) 
    myPDF.setOutlineRoot_(rootOutline) 
    myPDF.writeToFile_(outfile) 
Смежные вопросы