Como mesclar pdfs e criar marcadores para cada arquivo de entrada no arquivo de saída? (linux)

1

Estou usando o Linux e gostaria de ter um software (ou script, método) que mesclasse alguns pdfs e criasse um pdf de saída unificado, contendo marcadores. Os marcadores são nomeados por nome de arquivo de arquivos PDF, que foram usados para mesclar e apontar para o número da página, onde esses arquivos começam.

Possibilidades semelhantes têm o Adobe Acrobat, mas é não-livre e somente para Windows.

    
por yanpas 06.12.2015 / 23:23

2 respostas

2

UPDATE : Eu não estava satisfeito com o resultado e escrevi isso com uma boa interface:

link

Aprendeu python e escreveu o programa (modificado) em uma hora:

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

Este programa requer o PyPDF2, você pode instalá-lo via sudo pip install pypdf2 , antes disso você precisa instalar o pip :) Apenas abra o terminal e insira ./pdfmerger.py *.pdf

    
por 13.12.2015 / 00:55
2

Modificando uma boa resposta [ 1 ] de tex.stackexchange.com , você pode criar uma lista itemize com a referência aos arquivos que você incluirá abaixo. (Semelhante a um toc). O Latex terá o cuidado de atualizar os números das páginas.

Algumas palavras Latex mais

  • Uma linha como esta incluirá o arquivo PDF MyDoc1.pdf com o nome de referência "doc01" presente no mesmo diretório do arquivo latex:

    \modifiedincludepdf{-}{doc01}{MyDoc1.pdf}
    
  • Um comando como \pageref{doc02.3} criará um link com o número da terceira página do documento que tem como referência a chave "doc02" . O Latex terá o cuidado de mantê-lo atualizado.

  • Um bloco \begin{itemize} \end{itemize} criará uma lista pontuda.

O arquivo de latex
Aqui abaixo o modelo modificado que funcionará com 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}

Nota

Para simplesmente mesclar e dividir documentos ou páginas em PDF, você pode usar ferramentas como pdftk e inspirar-se em outras perguntas [ 3 ] sobre isso.

Referências

por 07.12.2015 / 17:26