É possível, usando Python, mesclar arquivos PDF separados?
Supondo que sim, preciso estender isso um pouco mais. Espero percorrer as pastas de um diretório e repetir este procedimento.
E posso estar abusando da sorte, mas é possível excluir uma página contida nos PDFs (minha geração de relatório sempre cria uma página em branco extra).
Uma biblioteca Pure-Python construída como um kit de ferramentas PDF. É capaz de:
* dividir documentos página por página,
* mesclar documentos página por página,
(e muito mais)
Aqui está um programa de amostra que funciona com as duas versões.
#!/usr/bin/env pythonimport sys
try:fromPyPDF2importPdfFileReader,PdfFileWriterexceptImportError:from pyPdf importPdfFileReader,PdfFileWriterdef pdf_cat(input_files, output_stream):
input_streams =[]try:# 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# /programming/6773631/problem-with-closing-python-pypdf-writing-getting-a-valueerror-i-o-operation/6773733#6773733for input_file in input_files:
input_streams.append(open(input_file,'rb'))
writer =PdfFileWriter()for reader in map(PdfFileReader, input_streams):for n in range(reader.getNumPages()):
writer.addPage(reader.getPage(n))
writer.write(output_stream)finally:for f in input_streams:
f.close()if __name__ =='__main__':if sys.platform =="win32":import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
pdf_cat(sys.argv[1:], sys.stdout)
Funciona para mim apenas com a abertura no modo binário (fluxos de entrada e também fluxo de saída). open(input_file), 'r+b', e em vez de sys.stdout eu uso output_stream = open('result.pdf', 'w+b').
Simeon Borko
@SimeonBorko Elimine o +, significa “ler e escrever” e nenhum dos arquivos é lido e escrito. Eu adicionei suporte de saída de suporte do Windows com base em stackoverflow.com/questions/2374427/… .
Gilles 'SO- pare de ser mal'
PyPDF2 / 3 não é estável, como posso mesclar arquivos pdf sem PyPDF2 / 3.
GoingMyWay
2
Tive que usar sys.stdout.bufferPython 3.6.8 (Linux)
Você pode simplesmente concatenar arquivos usando o appendmétodo.
fromPyPDF2importPdfFileMerger
pdfs =['file1.pdf','file2.pdf','file3.pdf','file4.pdf']
merger =PdfFileMerger()for pdf in pdfs:
merger.append(pdf)
merger.write("result.pdf")
merger.close()
Você pode passar identificadores de arquivo em vez de caminhos de arquivo, se desejar.
Mesclagem de arquivos
Se você quiser um controle mais refinado da mesclagem, existe um mergemétodo do PdfMerger, que permite especificar um ponto de inserção no arquivo de saída, o que significa que você pode inserir as páginas em qualquer lugar do arquivo. O appendmétodo pode ser considerado como mergeonde o ponto de inserção é o final do arquivo.
por exemplo
merger.merge(2, pdf)
Aqui, inserimos todo o pdf na saída, mas na página 2.
Intervalos de páginas
Se você deseja controlar quais páginas são anexadas de um arquivo específico, você pode usar o pagesargumento de palavra - chave de appendemerge , passando uma tupla na forma (start, stop[, step])(como a rangefunção regular ).
por exemplo
merger.append(pdf, pages=(0,3))# first 3 pages
merger.append(pdf, pages=(0,6,2))# pages 1,3, 5
Se você especificar um intervalo inválido, obterá um IndexError .
Nota: também para evitar que os arquivos PdfFileMergerfiquem abertos, o método s close deve ser chamado quando o arquivo mesclado for gravado. Isso garante que todos os arquivos sejam fechados (entrada e saída) em tempo hábil. É uma pena que PdfFileMergernão seja implementado como um gerenciador de contexto, então podemos usar a withpalavra - chave, evitar a chamada fechada explícita e obter alguma segurança de exceção fácil.
Você também pode querer dar uma olhada no pdfcatscript fornecido como parte do pypdf2. Você pode potencialmente evitar a necessidade de escrever código completamente.
O github PyPdf2 também inclui alguns exemplos de código que demonstram a fusão.
Mesclar todos os arquivos PDF que estão presentes em um diretório
Coloque os arquivos PDF em um diretório. Lance o programa. Você recebe um pdf com todos os pdfs mesclados.
import os
fromPyPDF2importPdfFileMerger
x =[a for a in os.listdir()if a.endswith(".pdf")]
merger =PdfFileMerger()for pdf in x:
merger.append(open(pdf,'rb'))with open("result.pdf","wb")as fout:
merger.write(fout)
A pdfrwbiblioteca pode fazer isso facilmente, supondo que você não precise preservar marcadores e anotações, e seus PDFs não estão criptografados. cat.pyé um exemplo de script de concatenação esubset.py um script de subconjunto de página de exemplo.
A parte relevante do script de concatenação - assume que inputsé uma lista de nomes de arquivos de entrada e outfné um nome de arquivo de saída:
from pdfrw importPdfReader,PdfWriter
writer =PdfWriter()for inpfn in inputs:
writer.addpages(PdfReader(inpfn).pages)
writer.write(outfn)
Como você pode ver, seria muito fácil deixar de fora a última página, por exemplo, algo como:
writer.addpages(PdfReader(inpfn).pages[:-1])
Isenção de responsabilidade: eu sou o pdfrwautor principal .
fromPyPDF2importPdfFileMergerimport webbrowser
import os
dir_path = os.path.dirname(os.path.realpath(__file__))def list_files(directory, extension):return(f for f in os.listdir(directory)if f.endswith('.'+ extension))
pdfs = list_files(dir_path,"pdf")
merger =PdfFileMerger()for pdf in pdfs:
merger.append(open(pdf,'rb'))with open('result.pdf','wb')as fout:
merger.write(fout)
webbrowser.open_new('file://'+ dir_path +'/result.pdf')
Uma ligeira variação usando um dicionário para maior flexibilidade (por exemplo, classificação, desduplicação):
import os
fromPyPDF2importPdfFileMerger# use dict to sort by filepath or filename
file_dict ={}for subdir, dirs, files in os.walk("<dir>"):for file in files:
filepath = subdir + os.sep + file
# you can have multiple endswithif filepath.endswith((".pdf",".PDF")):
file_dict[file]= filepath
# use strict = False to ignore PdfReadError: Illegal character error
merger =PdfFileMerger(strict=False)for k, v in file_dict.items():print(k, v)
merger.append(v)
merger.write("combined_result.pdf")
Eu usei o pdf unite no terminal linux aproveitando o subprocesso (assume que existam one.pdf e two.pdf no diretório) e o objetivo é mesclá-los em three.pdf
open(input_file), 'r+b'
, e em vez de sys.stdout eu usooutput_stream = open('result.pdf', 'w+b')
.+
, significa “ler e escrever” e nenhum dos arquivos é lido e escrito. Eu adicionei suporte de saída de suporte do Windows com base em stackoverflow.com/questions/2374427/… .sys.stdout.buffer
Python 3.6.8 (Linux)Você pode usar a classe do PyPdf2
PdfMerger
.Concatenação de arquivo
Você pode simplesmente concatenar arquivos usando o
append
método.Você pode passar identificadores de arquivo em vez de caminhos de arquivo, se desejar.
Mesclagem de arquivos
Se você quiser um controle mais refinado da mesclagem, existe um
merge
método doPdfMerger
, que permite especificar um ponto de inserção no arquivo de saída, o que significa que você pode inserir as páginas em qualquer lugar do arquivo. Oappend
método pode ser considerado comomerge
onde o ponto de inserção é o final do arquivo.por exemplo
Aqui, inserimos todo o pdf na saída, mas na página 2.
Intervalos de páginas
Se você deseja controlar quais páginas são anexadas de um arquivo específico, você pode usar o
pages
argumento de palavra - chave deappend
emerge
, passando uma tupla na forma(start, stop[, step])
(como arange
função regular ).por exemplo
Se você especificar um intervalo inválido, obterá um
IndexError
.Nota: também para evitar que os arquivos
PdfFileMerger
fiquem abertos, o método s close deve ser chamado quando o arquivo mesclado for gravado. Isso garante que todos os arquivos sejam fechados (entrada e saída) em tempo hábil. É uma pena quePdfFileMerger
não seja implementado como um gerenciador de contexto, então podemos usar awith
palavra - chave, evitar a chamada fechada explícita e obter alguma segurança de exceção fácil.Você também pode querer dar uma olhada no
pdfcat
script fornecido como parte do pypdf2. Você pode potencialmente evitar a necessidade de escrever código completamente.O github PyPdf2 também inclui alguns exemplos de código que demonstram a fusão.
fonte
Mesclar todos os arquivos PDF que estão presentes em um diretório
Coloque os arquivos PDF em um diretório. Lance o programa. Você recebe um pdf com todos os pdfs mesclados.
fonte
A
pdfrw
biblioteca pode fazer isso facilmente, supondo que você não precise preservar marcadores e anotações, e seus PDFs não estão criptografados.cat.py
é um exemplo de script de concatenação esubset.py
um script de subconjunto de página de exemplo.A parte relevante do script de concatenação - assume que
inputs
é uma lista de nomes de arquivos de entrada eoutfn
é um nome de arquivo de saída:Como você pode ver, seria muito fácil deixar de fora a última página, por exemplo, algo como:
Isenção de responsabilidade: eu sou o
pdfrw
autor principal .fonte
É possível, usando Python, mesclar arquivos PDF separados?
Sim.
O exemplo a seguir mescla todos os arquivos em uma pasta em um único novo arquivo PDF:
fonte
Git Repo: https://github.com/mahaguru24/Python_Merge_PDF.git
fonte
aqui, http://pieceofpy.com/2009/03/05/concatenating-pdf-with-python/ , oferece uma solução.
similarmente:
fonte
Uma ligeira variação usando um dicionário para maior flexibilidade (por exemplo, classificação, desduplicação):
fonte
Eu usei o pdf unite no terminal linux aproveitando o subprocesso (assume que existam one.pdf e two.pdf no diretório) e o objetivo é mesclá-los em three.pdf
fonte