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)