with pdfs open python pdf file-io

python - pdfs - Fusionar archivos PDF



split pdf python (6)

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

Pon los archivos pdf en un directorio. Lanzar el programa. 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)

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

Asumiendo eso, necesito extender esto un poco más. Espero recorrer las carpetas de un directorio y repetir este procedimiento.

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


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

La parte relevante de la secuencia de comandos 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 puede ver en esto, sería bastante fácil omitir la última página, por ejemplo, algo así como:

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

Descargo de responsabilidad: soy el autor principal de pdfrw .


La biblioteca PyPdf2 más PyPdf2 tiene una clase PdfMerger , que se puede usar de esta manera.

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 de inmediato. Parece esperar hasta que se invoca 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 está cerrado en ese punto.

La forma más fácil de evitar esto si la duración de la gestión del archivo es un problema, es pasar cadenas de nombre de archivo anexadas y permitirle manejar la duración 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")


Use Pypdf o su sucesor PyPDF2 :

Una biblioteca Pure-Python construida como un kit 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 programa 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://.com/questions/6773631/problem-with-closing-python-pypdf-writing-getting-a-valueerror-i-o-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)


aquí, http://pieceofpy.com/2009/03/05/concatenating-pdf-with-python/ , ofrece 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"))


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

Sí.

El siguiente ejemplo combina todos los archivos de una carpeta en un único 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)