Как объединить PDF-файлы и создать закладки для каждого входного файла в выходной файл? (Linux)

2268
yanpas

Я использую Linux, и я хотел бы иметь программное обеспечение (или сценарий, метод), который объединяет некоторые PDF-файлы и создает единый выходной PDF-файл, содержащий закладки. Закладки именуются по имени файла PDF-файлов, которые использовались для слияния и указывали на номер страницы, где начинаются эти файлы.

Подобные возможности есть у Adobe Acrobat, но он не бесплатный и только для Windows.

1
В Okular вы можете поместить закладки в каждую часть PDF-файла, и они будут отображаться в столбце закладок, независимо от того, открыт файл или нет. Затем вы нажимаете и ... Это не то, что вы ищете, но это может сработать. Чтобы физически объединить больше pdf только в одном, вы можете использовать латекс ... Кстати, ваш вопрос, вероятно, будет закрыт, потому что предложение программного обеспечения не по теме. Должно быть по-другому, если вы пытаетесь создать скрипт, который `находит все PDF-файлы с их расположением, разделяет` basename` и `dirname` и помещает все в контейнер tex для компиляции, чтобы получить ваш файл, и вы где-то останавливаетесь , ;) Hastur 8 лет назад 0
Взгляните на http://unix.stackexchange.com/q/17065/121614 NZD 8 лет назад 0
@Hastur ну gs скрипт будет в порядке для этой цели) У меня нет исходных файлов, только pdfs, поэтому я не понимаю, как латекс может помочь yanpas 8 лет назад 0
@yanpas: Я не очень хорошо понял: вы хотите создать, скажем так, книгу, включающую в себя несколько файлов PDF и с индексом в начале (или в конце) с _hyperlinks_ на страницу, с которой каждый Статья начинается в книге, или вы хотите создать индекс со ссылкой, указывающей на файл на жестком диске? Я полагаю, 1-й. Вы можете это подтвердить? Hastur 8 лет назад 0
@Hastur ответ ближе к первому. Я и мои одногруппники готовим около 100 вопросов к экзамену, каждый из нас вносит свой вклад в редактора, которого он предпочитает, и отправляет мне свой результат в формате PDF. Затем я объединяю все файлы PDF в файл output.pdf. Для более удобной навигации я хотел бы, чтобы external.pdf имел список закладок (когда я нажимаю на этот список - я перехожу в раздел документа, который связан с кучей ответов. Что-то вроде http://i.imgur.com /hQQwp6i.png yanpas 8 лет назад 0
@yanpas Не стесняйтесь добавлять нужные пакеты и изменять их для своих целей :) Я протестировал, что это работает на моей системе. Дай мне знать. Hastur 8 лет назад 0
Почему бы не использовать только один и тот же формат файла, который лучше подходит для редактирования, вырезания и вставки? Как ODF (Libreoffice), Word и т. Д.? Или, если каждый не может быть обеспокоен использованием * той же * программы, тогда * вы * открываете каждый файл в его собственном формате, а затем вырезаете и вставляете в свой любимый? Xen2050 8 лет назад 0
@ Xen2050 Я описал только один случай, иногда нет ничего, кроме PDF из Интернета, и мне все еще нужна strcuture в окончательном PDF yanpas 8 лет назад 0

2 ответа на вопрос

2
Hastur

Изменив хороший ответ [ 1 ] на tex.stackexchange.com, вы можете создать itemizeсписок со ссылкой на файлы, которые вы включите ниже. (Аналогично току). Латекс позаботится об обновлении номеров страниц.

Некоторые латексные слова больше

  • Строка, как это будет включать файл PDFMyDoc1.pdf с именем ссылки "doc01", присутствующей в том же каталоге файла латекса:

    \modifiedincludepdf{-} 
  • Команда as \pagerefсоздаст ссылку с номером третьей страницы документа, для справки которой используется ключ «doc02» . Латекс позаботится о том, чтобы держать его в курсе.

  • Блок \begin \endсоздаст остроконечный список.

Файл латекса
Здесь ниже модифицированный шаблон, который будет работать с pdflatex:

\documentclass \usepackage \usepackage \usepackage[russian,english]  \newcounter \newcounter \newcommand{\addlabelstoallincludedpages}[1]{ \refstepcounter \stepcounter \label{#1.\thecurrentpagecounter}} \newcommand{\modifiedincludepdf}[3]{ \setcounter \includepdf[pages=#1,pagecommand=\addlabelstoallincludedpages{#2}]{#3}}  \begin  You can refer to the beginning or to a specific page: \\ see page \pageref till \pageref.\\  \begin \item Here contribution from Grupmate 1 \pageref \item Here contribution from Grupmate 2 \pageref \end  \modifiedincludepdf{-} \modifiedincludepdf{-}  \end 

Заметка

Чтобы просто объединять и разделять PDF-документы или страницы, вы можете использовать инструменты pdftk и черпать вдохновение из других вопросов [ 3 ] по этому поводу.

Рекомендации

2
yanpas

UPDATE: I wasn't satisfied with the result and has written this with nice GUI:

https://github.com/Yanpas/PdfMerger


Learned python and has written (modified) program in one hour:

#! /usr/bin/env python # Original author Nicholas Kim, modified by Yan Pashkovsky # New license - GPL v3 import sys import time from PyPDF2 import utils, PdfFileReader, PdfFileWriter def get_cmdline_arguments(): """Retrieve command line arguments.""" from optparse import OptionParser usage_string = "%prog [-o output_name] file1, file2 [, ...]" parser = OptionParser(usage_string) parser.add_option( "-o", "--output", dest="output_filename", default=time.strftime("output_%Y%m%d_%H%M%S"), help="specify output filename (exclude .pdf extension); default is current date/time stamp" ) options, args = parser.parse_args() if len(args) < 2: parser.print_help() sys.exit(1) return options, args def main(): options, filenames = get_cmdline_arguments() output_pdf_name = options.output_filename + ".pdf" files_to_merge = [] # get PDF files for f in filenames: try: next_pdf_file = PdfFileReader(open(f, "rb")) except(utils.PdfReadError): print >>sys.stderr, "%s is not a valid PDF file." % f sys.exit(1) except(IOError): print >>sys.stderr, "%s could not be found." % f sys.exit(1) else: files_to_merge.append(next_pdf_file) # merge page by page output_pdf_stream = PdfFileWriter() j=0 k=0 for f in files_to_merge: for i in range(f.numPages): output_pdf_stream.addPage(f.getPage(i)) if i==0: output_pdf_stream.addBookmark(str(filenames[k]),j) j = j + 1 k += 1 # create output pdf file try: output_pdf_file = open(output_pdf_name, "wb") output_pdf_stream.write(output_pdf_file) finally: output_pdf_file.close() print "%s successfully created." % output_pdf_name if __name__ == "__main__": main() 

This program requires PyPDF2, you can install it via sudo pip install pypdf2, before this you need to install pip :) Just open terminal and enter ./pdfmerger.py *.pdf

Похожие вопросы