Je travaille sur un projet qui prend des images de l'utilisateur, puis crée un fichier PDF contenant toutes ces images.
Y at-il un moyen ou un outil pour faire cela en Python? Par exemple. créer un fichier PDF (ou eps, ps) à partir du fichier image1 + image 2 + image 3 -> PDF?
Voici mon expérience après avoir suivi les astuces sur cette page.
pyPDF ne peut pas incorporer d'images dans des fichiers. Il ne peut que scinder et fusionner. (Source: Ctrl + F via sa page de documentation ) Ce qui est bien, mais pas si vous avez des images qui ne sont pas déjà incorporées dans un PDF.
pyPDF2 ne semble pas avoir de documentation supplémentaire sur pyPDF.
ReportLab est très vaste. ( Userguide ) Cependant, avec un peu de Ctrl + F et un accès direct à la source, j'ai eu ceci:
Ensuite, essayez ceci sur la ligne de commande Python:
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch, cm
c = canvas.Canvas('ex.pdf')
c.drawImage('ar.jpg', 0, 0, 10*cm, 10*cm)
c.showPage()
c.save()
Tout ce dont j'avais besoin, c’était d’obtenir un ensemble d’images dans un fichier PDF pour pouvoir en vérifier l’aspect et les imprimer. Ce qui précède est suffisant pour atteindre cet objectif.
ReportLab est excellent, mais gagnerait à inclure des mondes tels que ceux mentionnés ci-dessus dans sa documentation.
Je suggère Pdfkit . (installation guide )
Il crée des pdf à partir de fichiers html. Je l'ai choisi pour créer un pdf en 2 étapes à partir de ma pile de pyramides Python:
pdfkit.from_string(...)
en passant le code HTML rendu en tant que paramètreDe cette façon, vous obtenez un document pdf avec style et images pris en charge.
Vous pouvez l'installer comme suit:
en utilisant pip
pip install pdfkit
Vous pouvez essayer this (Python-for-PDF-Generation) ou vous pouvez essayer PyQt , qui supporte l’impression au format pdf .
Python pour la génération PDF
Le format PDF (Portable Document Format) vous permet de créer des documents exactement identiques sur toutes les plateformes. Parfois, un document PDF doit cependant être généré de manière dynamique, ce qui peut être un défi de taille. Heureusement, il existe des bibliothèques qui peuvent aider. Cet article examine l'un de ceux pour Python.
Pour en savoir plus, consultez http://www.devshed.com/c/a/Python/Python-for-PDF-Generation/#whoCFCPh3TAks368.99
Je l'ai fait assez souvent dans PyQt et cela fonctionne très bien. Qt offre une prise en charge étendue des images, polices, styles, etc., qui peuvent tous être écrits dans des documents pdf.
Voici une solution qui fonctionne uniquement avec les packages standard. matplotlib
dispose d'un PDF backend pour enregistrer les figures au format PDF. Vous pouvez créer des figures avec des sous-parcelles, chaque sous-parcelle étant l'une de vos images. Vous avez toute liberté pour jouer avec la figure: ajouter des titres, jouer avec la position, etc. Une fois votre figure terminée, enregistrez au format PDF. Chaque appel à savefig
créera une autre page de PDF.
L'exemple ci-dessous représente deux images côte à côte, à la page 1 et à la page 2.
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
from scipy.misc import imread
import os
import numpy as np
files = [ "Column0_Line16.jpg", "Column0_Line47.jpg" ]
def plotImage(f):
folder = "C:/temp/"
im = imread(os.path.join(folder, f)).astype(np.float32) / 255
plt.imshow(im)
a = plt.gca()
a.get_xaxis().set_visible(False) # We don't need axis ticks
a.get_yaxis().set_visible(False)
pp = PdfPages("c:/temp/page1.pdf")
plt.subplot(121)
plotImage(files[0])
plt.subplot(122)
plotImage(files[1])
pp.savefig(plt.gcf()) # This generates page 1
pp.savefig(plt.gcf()) # This generates page 2
pp.close()
Je pense que matplotlib est capable de sérialiser des graphiques, du texte et d'autres objets dans un document pdf.
fpdf est python (aussi). Et souvent utilisé. Voir Recherche PyPI/pip. Mais peut-être at-il été renommé de pyfpdf à fpdf. Caractéristiques: Prise en charge des formats PNG, GIF et JPG (y compris la transparence et le canal alpha)
Vous pouvez réellement essayer xhtml2pdf http://flask.pocoo.org/snippets/68/
fpdf fonctionne bien pour moi. Beaucoup plus simple que ReportLab et vraiment gratuit. Fonctionne avec UTF-8.
rinohtype prend en charge l'intégration d'images PDF, PNG et JPEG (en mode natif) et d'autres formats bitmap (lorsque Pillow est installé).
(Divulgation complète: je suis l'auteur de rinohtype)
Cela dépend du format de vos fichiers image, mais pour un projet ici au travail, j'ai utilisé l'outil tiff2pdf dans LibTIFF à partir de RemoteSensing.org . En gros, un sous-processus vient d'appeler tiff2pdf.exe avec l'argument approprié lire le type de tiff que j'avais et sortir le type de pdf que je voulais. S'ils ne sont pas des tiffs, vous pouvez probablement les convertir en tiff à l'aide de PIL, ou peut-être trouver un outil plus spécifique à votre type d'image (ou plus générique si les images seront diversifiées) comme ReportLab mentionné ci-dessus.
Si vous connaissez bien LaTex, vous pouvez envisager/ pylatex
L'un des avantages de pylatex est qu'il est facile de contrôler la qualité de l'image. Les images de votre pdf seront de la même qualité que les images originales. Lors de l'utilisation de reportlab, j'ai constaté que les images étaient automatiquement compressées et leur qualité réduite.
Le désavantage de pylatex est que, puisqu'il est basé sur LaTex, il peut être difficile de placer les images exactement où vous le souhaitez sur la page. Cependant, j'ai constaté que l'utilisation de l'argument position dans la classe Figure, et parfois de la sous-figure, donnait de bons résultats.
Exemple de code pour créer un pdf avec une seule image:
from pylatex import Document, Figure
doc = Document(documentclass="article")
with doc.create(Figure(position='p')) as fig:
fig.add_image('Lenna.png')
doc.generate_pdf('test', compiler='latexmk', compiler_args=["-pdf", "-pdflatex=pdflatex"], clean_tex=True)
En plus d'installer pylatex (pip install pylatex), vous devez installer LaTex. Pour Ubuntu et les autres systèmes Debian, vous pouvez exécuter Sudo apt-get install texlive-full
. Si vous utilisez Windows, je recommanderais MixTex