Fusionar archivos PDF

¿Es posible, usando Python, combinar archivos PDF separados?

Suponiendo que sea así, necesito extender esto un poco más. Espero recorrer las carpetas en un directorio y repetir este procedimiento.

Y es posible que esté presionando mi suerte, pero ¿es posible excluir una página contenida en los PDF (la generación de mi informe siempre crea una página en blanco adicional)?

Utilice Pypdf o su sucesor PyPDF2 :

Una biblioteca de Pure-Python creada como un conjunto de herramientas PDF. Es capaz de:
* División de documentos página por página,
* fusionando documentos página por página,

(y mucho más)

Aquí hay un progtwig de muestra que funciona con ambas versiones.

#!/usr/bin/env python import sys try: from PyPDF2 import PdfFileReader, PdfFileWriter except ImportError: from pyPdf import PdfFileReader, PdfFileWriter def 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 # https://stackoverflow.com/questions/6773631/problem-with-closing-python-pypdf-writing-getting-a-valueerror-io-operation/6773733#6773733 for 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) 

La nueva biblioteca de PyPdf2 tiene una clase PdfMerger , que puede usarse como tal.

ejemplo:

 from PyPDF2 import PdfFileMerger pdfs = ['file1.pdf', 'file2.pdf', 'file3.pdf', 'file4.pdf'] merger = PdfFileMerger() for pdf in pdfs: merger.append(open(pdf, 'rb')) with open('result.pdf', 'wb') as fout: merger.write(fout) 

El método de append parece requerir un objeto de archivo lento. Es decir, no lee el archivo inmediatamente. Esperará hasta que se invoque el método de write . Si utiliza un ámbito abierto (es decir, with ), agrega páginas en blanco al archivo resultante, ya que el archivo de entrada se cierra en ese punto.

La forma más fácil de evitar esto si el tiempo de vida del identificador de archivo es un problema, es pasar cadenas de nombre de archivo adjuntas y permitir que maneje el tiempo de vida del archivo.

es decir

 from PyPDF2 import PdfFileMerger pdfs = ['file1.pdf', 'file2.pdf', 'file3.pdf', 'file4.pdf'] merger = PdfFileMerger() for pdf in pdfs: merger.append(pdf) merger.write("result.pdf") 

También es posible que desee ver el script pdfcat proporciona como parte de pypdf2. Usted puede potencialmente evitar la necesidad de escribir código por completo.

¿Es posible, usando Python, combinar archivos PDF separados?

Sí.

El siguiente ejemplo combina todos los archivos de una carpeta en un solo archivo PDF nuevo:

 #!/usr/bin/env python # -*- coding: utf-8 -*- from argparse import ArgumentParser from glob import glob from pyPdf import PdfFileReader, PdfFileWriter import os def merge(path, output_filename): output = PdfFileWriter() for pdffile in glob(path + os.sep + '*.pdf'): if pdffile == output_filename: continue print("Parse '%s'" % pdffile) document = PdfFileReader(open(pdffile, 'rb')) for i in range(document.getNumPages()): output.addPage(document.getPage(i)) print("Start writing '%s'" % output_filename) with open(output_filename, "wb") as f: output.write(f) if __name__ == "__main__": parser = ArgumentParser() # Add more options if you like parser.add_argument("-o", "--output", dest="output_filename", default="merged.pdf", help="write merged PDF to FILE", metavar="FILE") parser.add_argument("-p", "--path", dest="path", default=".", help="path of source PDF files") args = parser.parse_args() merge(args.path, args.output_filename) 

Combinar todos los archivos pdf que están presentes en un directorio

Ponga los archivos pdf en un directorio. Lanzar el progtwig. Obtienes un pdf con todos los pdfs fusionados.

 import os from PyPDF2 import PdfFileMerger 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) 

La biblioteca pdfrw puede hacer esto con bastante facilidad, asumiendo que no necesita conservar los marcadores y las anotaciones, y que sus archivos PDF no están cifrados. cat.py es un ejemplo de script de concatenación, y subset.py es un ejemplo de script de subconjunto de páginas.

La parte relevante del script de concatenación: asume que las inputs son una lista de nombres de archivos de entrada, y outfn es un nombre de archivo de salida:

 from pdfrw import PdfReader, PdfWriter writer = PdfWriter() for inpfn in inputs: writer.addpages(PdfReader(inpfn).pages) writer.write(outfn) 

Como se puede ver en esto, sería bastante fácil omitir la última página, por ejemplo, algo como:

  writer.addpages(PdfReader(inpfn).pages[:-1]) 

Descargo de responsabilidad: Soy el principal autor pdfrw .

Aquí, http://pieceofpy.com/2009/03/05/concatenating-pdf-with-python/ , da una solución.

similar:

 from pyPdf import PdfFileWriter, PdfFileReader def append_pdf(input,output): [output.addPage(input.getPage(page_num)) for page_num in range(input.numPages)] output = PdfFileWriter() append_pdf(PdfFileReader(file("C:\\sample.pdf","rb")),output) append_pdf(PdfFileReader(file("c:\\sample1.pdf","rb")),output) append_pdf(PdfFileReader(file("c:\\sample2.pdf","rb")),output) append_pdf(PdfFileReader(file("c:\\sample3.pdf","rb")),output) output.write(file("c:\\combined.pdf","wb")) 
 from PyPDF2 import PdfFileMerger import 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') 

Git Repo: https://github.com/mahaguru24/Python_Merge_PDF.git

Una pequeña variación que usa un diccionario para una mayor flexibilidad (por ejemplo, clasificación, deducción)

 import os from PyPDF2 import PdfFileMerger # use dict to sort by filepath or filename file_dict = {} for subdir, dirs, files in os.walk(""): for file in files: filepath = subdir + os.sep + file # you can have multiple endswith if 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")