Concatene rapidamente um grande número de pequenos PDFs

0

Eu estou no Windows 10. Eu tenho 2.000 arquivos PDF, cada um tem duas ou três páginas (com exatamente uma página em branco) e tem apenas 40 ~ 50 KiB de tamanho, totalizando menos de 100 MiB. Eu quero concatenar todas as páginas em todos os arquivos em um único arquivo PDF. A abordagem atual que estou usando é o Acrobat DC → Ferramentas → Combinar arquivos. Eu arrasto todos os arquivos para dentro da ferramenta e apertei start. Após algumas estimativas, acho que são necessárias mais de 12 horas para fazer isso (notebook Core i7-4710HQ, 16 GiB RAM e SSD). Isso é bastante impraticável para mim. Existe um caminho mais rápido?

    
por iBug 21.01.2018 / 15:05

2 respostas

1

Se você se preocupa em usar python, existem vários scripts python discutidos neste tópico anterior: link

Devido à maneira como a biblioteca em PDF do Python funciona, todos os arquivos são abertos primeiro e somente quando se escreve o arquivo de saída, o conteúdo é lido. Você deve esperar alto consumo de memória por causa disso. A solução alternativa seria dividir os arquivos em várias pastas.

Você pode facilmente expandir esse script para, por exemplo, combinar todos os PDFs em uma subárvore e todas as suas subpastas.

Este programa suporta sinalizadores opcionais para saída detalhada e para pular a última página de cada arquivo de entrada. Caracteres curinga são permitidos para o padrão de arquivo de entrada.

from argparse import ArgumentParser
from glob import glob
from PyPDF2 import PdfFileReader, PdfFileWriter



def PDF_cat(files, output_filename, skiplastpage, verbose):
    # First open all the files, then produce the output file, and
    # finally close the input files. This is necessary because
    # the data isn't read from the input files until the write
    # operation. Thanks to
    # https://stackoverflow.com/questions/6773631/problem-with-closing-_
    #    python-pypdf-writing-getting-a-valueerror-i-o-operation/6773733

    writer = PdfFileWriter()
    skip = 1 if skiplastpage else 0

    # collect and open input files
    inp = [open(f,'rb') for f in glob(files) if f != output_filename]
    n = len(inp)
    print 'merging %d files' % n
    for i, fh in enumerate(inp, 1):
        reader = PdfFileReader(fh)
        for pg in range(reader.getNumPages() - skip):
            writer.addPage(reader.getPage(pg))
        if verbose: print '%d/%d %s' % (i, n, fh.name)

    print('writing output file...')
    with open(output_filename, 'wb') as fout:
        writer.write(fout)
    # finallly...
    for fh in inp:
        fh.close()

if __name__ == '__main__':
    parser = ArgumentParser()

    # add more options if you like
    parser.add_argument('-o', '--output',
                        dest='output_filename',
                        help='write merged PDF files to FILE',
                        metavar='FILE')
    parser.add_argument(dest='files',
                        help='PDF files to merge')
    parser.add_argument('-s', '--skiplastpage',
                        dest='skiplastpage',
                        action='store_true',
                        help='skip last page of each merged PDF')
    parser.add_argument('-v', '--verbose',
                        dest='verbose',
                        action='store_true',
                        help='show progress')
    parser.set_defaults(output_filename='mergedPDFs.pdf', files='.\*.pdf',
                        skiplastpage=False, verbose=False)

    args = parser.parse_args()
    PDF_cat(args.files, args.output_filename, args.skiplastpage, args.verbose)

Um teste rápido: mesclar 501 PDFs idênticos de 91 KB cada um levou 61 s no meu notebook, usando PDFtk.exe levou 83 s. Os arquivos de saída não eram do mesmo tamanho, mas eram idênticos.

    
por 21.01.2018 / 15:50
0

Existem outras alternativas ao Acrobat que você pode tentar. Essas ferramentas podem ajudá-lo de alguma forma.

1. PDFSam

  • Mesclar e dividir um arquivo PDF em determinados números de página, em determinado nível de favoritos ou em arquivos de um determinado tamanho
  • Extrair páginas do PDF
  • Gire arquivos PDF, todas as páginas ou apenas as páginas selecionadas
  • Mesclar arquivos PDF juntos, tendo páginas alternadamente de um e de outro.

2. PDFMerge

  • Mesclagem e manipulação de arquivos seguros
  • Fornece Plataforma on-line para mesclar PDFs
  • Também disponível a versão do DEsktop

3. PDFtk

  • Kit de ferramentas simples, mas muito poderoso
  • Vem com uma ferramenta de linha de comando que facilita a interação com vários PDFs facilmente na linha de comando.

Por enquanto, sugiro que você use o pdftk, já que sua ferramenta de linha de comando é muito poderosa e economiza muito tempo e esforço.

Sinta-se à vontade para editar a lista com qualquer outra ferramenta.

    
por 21.01.2018 / 16:21