Est-il possible, en utilisant Python, de fusionner des fichiers PDF séparés?
En supposant que oui, je dois étendre ceci un peu plus loin. J'espère parcourir les dossiers d'un répertoire et répéter cette procédure.
Et je pousse peut-être ma chance, mais est-il possible d'exclure une page qui est contenue dans des PDF (ma génération de rapport crée toujours une page vierge supplémentaire).
Une bibliothèque Pure-Python construite sous forme de boîte à outils PDF. Il est capable de:
* fractionner les documents page par page,
* fusionner les documents page par page,
(et beaucoup plus)
Voici un exemple de programme qui fonctionne avec les deux versions.
#!/usr/bin/env pythonimport systry: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)
Fonctionne pour moi uniquement avec une ouverture en mode binaire (flux d'entrée et flux de sortie). open(input_file), 'r+b', et au lieu de sys.stdout, j'utilise output_stream = open('result.pdf', 'w+b').
Simeon Borko
@SimeonBorko Supprimez le +, cela signifie «lire et écrire» et aucun des fichiers n'est à la fois lu et écrit. J'ai ajouté la prise en charge de la sortie de support Windows basée sur stackoverflow.com/questions/2374427/… .
Gilles 'SO- arrête d'être mauvais'
PyPDF2 / 3 n'est pas stable, comment puis-je fusionner des fichiers pdf sans PyPDF2 / 3.
GoingMyWay
2
J'ai dû utiliser sys.stdout.bufferPython 3.6.8 (Linux)
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()
Vous pouvez transmettre des descripteurs de fichiers à la place des chemins de fichiers si vous le souhaitez.
Fusion de fichiers
Si vous souhaitez un contrôle plus fin de la fusion, il existe une mergeméthode du PdfMerger, qui vous permet de spécifier un point d'insertion dans le fichier de sortie, ce qui signifie que vous pouvez insérer les pages n'importe où dans le fichier. La appendméthode peut être considérée comme un mergeendroit où le point d'insertion est la fin du fichier.
par exemple
merger.merge(2, pdf)
Ici, nous insérons le pdf entier dans la sortie mais à la page 2.
Plages de pages
Si vous souhaitez contrôler quelles pages sont ajoutées à partir d'un fichier particulier, vous pouvez utiliser l' pagesargument mot - clé de appendet merge, en passant un tuple sous la forme (start, stop[, step])(comme la rangefonction régulière ).
par exemple
merger.append(pdf, pages=(0,3))# first 3 pages
merger.append(pdf, pages=(0,6,2))# pages 1,3, 5
Si vous spécifiez une plage non valide, vous obtiendrez un fichier IndexError.
Remarque: également que pour éviter de laisser les fichiers ouverts, la PdfFileMergerméthode close doit être appelée lorsque le fichier fusionné a été écrit. Cela garantit que tous les fichiers sont fermés (entrée et sortie) en temps opportun. C'est dommage que ce PdfFileMergerne soit pas implémenté en tant que gestionnaire de contexte, nous pouvons donc utiliser le withmot - clé, éviter l'appel de fermeture explicite et obtenir une sécurité d'exception facile.
Vous pouvez également consulter le pdfcatscript fourni dans le cadre de pypdf2. Vous pouvez potentiellement éviter d'avoir à écrire du code complètement.
Le github PyPdf2 comprend également des exemples de code démontrant la fusion.
Fusionner tous les fichiers pdf présents dans un répertoire
Mettez les fichiers pdf dans un répertoire. Lancer le programme. Vous obtenez un pdf avec tous les fichiers PDF fusionnés.
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)
La pdfrwbibliothèque peut le faire assez facilement, en supposant que vous n'ayez pas besoin de conserver les signets et les annotations, et que vos PDF ne sont pas cryptés. cat.pyest un exemple de script de concaténation et subset.pyun exemple de script de sous-définition de page.
La partie pertinente du script de concaténation - suppose qu'il inputss'agit d'une liste de noms de fichiers d'entrée et outfnest un nom de fichier de sortie:
from pdfrw importPdfReader,PdfWriter
writer =PdfWriter()for inpfn in inputs:
writer.addpages(PdfReader(inpfn).pages)
writer.write(outfn)
Comme vous pouvez le voir, il serait assez facile de laisser de côté la dernière page, par exemple quelque chose comme:
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')
Une légère variation en utilisant un dictionnaire pour une plus grande flexibilité (ex: tri, dédup):
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")
J'ai utilisé pdf unite sur le terminal linux en tirant parti du sous-processus (suppose que one.pdf et two.pdf existent sur le répertoire) et le but est de les fusionner en three.pdf
open(input_file), 'r+b'
, et au lieu de sys.stdout, j'utiliseoutput_stream = open('result.pdf', 'w+b')
.+
, cela signifie «lire et écrire» et aucun des fichiers n'est à la fois lu et écrit. J'ai ajouté la prise en charge de la sortie de support Windows basée sur stackoverflow.com/questions/2374427/… .sys.stdout.buffer
Python 3.6.8 (Linux)Vous pouvez utiliser PyPdf2 de
PdfMerger
classe.Concaténation de fichiers
Vous pouvez simplement concaténer des fichiers en utilisant la
append
méthode.Vous pouvez transmettre des descripteurs de fichiers à la place des chemins de fichiers si vous le souhaitez.
Fusion de fichiers
Si vous souhaitez un contrôle plus fin de la fusion, il existe une
merge
méthode duPdfMerger
, qui vous permet de spécifier un point d'insertion dans le fichier de sortie, ce qui signifie que vous pouvez insérer les pages n'importe où dans le fichier. Laappend
méthode peut être considérée comme unmerge
endroit où le point d'insertion est la fin du fichier.par exemple
Ici, nous insérons le pdf entier dans la sortie mais à la page 2.
Plages de pages
Si vous souhaitez contrôler quelles pages sont ajoutées à partir d'un fichier particulier, vous pouvez utiliser l'
pages
argument mot - clé deappend
etmerge
, en passant un tuple sous la forme(start, stop[, step])
(comme larange
fonction régulière ).par exemple
Si vous spécifiez une plage non valide, vous obtiendrez un fichier
IndexError
.Remarque: également que pour éviter de laisser les fichiers ouverts, la
PdfFileMerger
méthode close doit être appelée lorsque le fichier fusionné a été écrit. Cela garantit que tous les fichiers sont fermés (entrée et sortie) en temps opportun. C'est dommage que cePdfFileMerger
ne soit pas implémenté en tant que gestionnaire de contexte, nous pouvons donc utiliser lewith
mot - clé, éviter l'appel de fermeture explicite et obtenir une sécurité d'exception facile.Vous pouvez également consulter le
pdfcat
script fourni dans le cadre de pypdf2. Vous pouvez potentiellement éviter d'avoir à écrire du code complètement.Le github PyPdf2 comprend également des exemples de code démontrant la fusion.
la source
Fusionner tous les fichiers pdf présents dans un répertoire
Mettez les fichiers pdf dans un répertoire. Lancer le programme. Vous obtenez un pdf avec tous les fichiers PDF fusionnés.
la source
La
pdfrw
bibliothèque peut le faire assez facilement, en supposant que vous n'ayez pas besoin de conserver les signets et les annotations, et que vos PDF ne sont pas cryptés.cat.py
est un exemple de script de concaténation etsubset.py
un exemple de script de sous-définition de page.La partie pertinente du script de concaténation - suppose qu'il
inputs
s'agit d'une liste de noms de fichiers d'entrée etoutfn
est un nom de fichier de sortie:Comme vous pouvez le voir, il serait assez facile de laisser de côté la dernière page, par exemple quelque chose comme:
Avertissement: Je suis l'
pdfrw
auteur principal .la source
Est-il possible, en utilisant Python, de fusionner des fichiers PDF séparés?
Oui.
L'exemple suivant fusionne tous les fichiers d'un dossier dans un seul nouveau fichier PDF:
la source
Git Repo: https://github.com/mahaguru24/Python_Merge_PDF.git
la source
ici, http://pieceofpy.com/2009/03/05/concatenating-pdf-with-python/ , donne une solution.
De même:
la source
Une légère variation en utilisant un dictionnaire pour une plus grande flexibilité (ex: tri, dédup):
la source
J'ai utilisé pdf unite sur le terminal linux en tirant parti du sous-processus (suppose que one.pdf et two.pdf existent sur le répertoire) et le but est de les fusionner en three.pdf
la source