如何合併pdf並為輸出文件中的每個輸入文件建立書籤? (Linux)

如何合併pdf並為輸出文件中的每個輸入文件建立書籤? (Linux)

我正在使用 Linux,我想要一個軟體(或腳本、方法)來合併一些 pdf 並建立一個包含書籤的統一輸出 pdf。書籤以 pdf 檔案的檔案名稱命名,用於合併並指向這些檔案開始的頁碼。

Adobe Acrobat 也有類似的功能,但它不是免費的且僅限 Windows。

答案1

更新:我對結果並不滿意,並用漂亮的 GUI 寫了這個:

https://github.com/Yanpas/PdfMerger


學習了python,並在一小時內編寫(修改)了程式:

#! /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()

該程式需要 PyPDF2,您可以透過安裝它sudo pip install pypdf2,在此之前您需要安裝 pip :) 只需打開終端並輸入./pdfmerger.py *.pdf

答案2

此 Bash 腳本將使目錄中的每個 PDF 在其第一頁包含一個書籤以及 PDF 文件名的文本,然後將它們全部連接起來。它可以處理非 ASCII 檔名。

#!/usr/bin/bash

cattedPDFname="${1:?Concatenated PDF filename}"

# make each PDF contain a single bookmark to first page
tempPDF=`mktemp`
for i in *.pdf
do
    bookmarkTitle=`basename "$i" .pdf`
    bookmarkInfo="BookmarkBegin\nBookmarkTitle: $bookmarkTitle\nBookmarkLevel: 1\nBookmarkPageNumber: 1"
    pdftk "$i" update_info_utf8 <(echo -en $bookmarkInfo) output $tempPDF verbose
    mv $tempPDF "$i"
done

# concatenate the PDFs
pdftk *.pdf cat output "$cattedPDFname" verbose

答案3

修改一個好的答案[1]tex.stackexchange.com,您可以建立一個itemize列表,並引用下面將包含的文件。 (類似目錄)。 Latex 會注意更新頁碼。

一些乳膠更多的話

  • 這行將包括PDFMyDoc1.pdf具有參考名稱的文件“文檔01”存在於乳膠檔案的同一目錄中:

    \modifiedincludepdf{-}{doc01}{MyDoc1.pdf}
    
  • 命令 as\pageref{doc02.3}將建立一個鏈接,其中包含文檔第三頁的編號,該文檔具有參考密鑰“文檔02”。 Latex 會注意保持更新。

  • 一個區塊\begin{itemize} \end{itemize}將創建一個指向列表。

乳膠文件
以下是適用於的修改後的範本pdflatex

\documentclass{article}
\usepackage{hyperref}
\usepackage{pdfpages}
\usepackage[russian,english]{babel}

\newcounter{includepdfpage}
\newcounter{currentpagecounter}
\newcommand{\addlabelstoallincludedpages}[1]{
   \refstepcounter{includepdfpage}
   \stepcounter{currentpagecounter}
   \label{#1.\thecurrentpagecounter}}
\newcommand{\modifiedincludepdf}[3]{
    \setcounter{currentpagecounter}{0}
    \includepdf[pages=#1,pagecommand=\addlabelstoallincludedpages{#2}]{#3}}

\begin{document}

You can refer to the beginning or to a specific page: \\
see page \pageref{doc01.1} till \pageref{doc02.3}.\\

\begin{itemize}
  \item Here contribution from Grupmate 1 \pageref{doc01.1}
  \item Here contribution from Grupmate 2 \pageref{doc02.1}
\end{itemize}

\modifiedincludepdf{-}{doc01}{MyDoc1.pdf}
\modifiedincludepdf{-}{doc02}{MyDoc2.pdf}

\end{document}

筆記

要簡單地合併和拆分 PDF 文件或頁面,您可以使用 pdftk 等工具並從其他問題中獲取靈感[3]關於它。

參考

相關內容