Comment créer des fichiers PDF en Python [fermé]


156

Je travaille sur un projet qui prend des images de l'utilisateur, puis crée un fichier PDF contenant toutes ces images.

Existe-t-il un moyen ou un outil pour faire cela en Python? Par exemple, créer un fichier PDF (ou eps, ps) à partir de l'image1 + image 2 + image 3 -> fichier PDF?


47
En cas de doute, préfixez ce que vous recherchez par py;-)
mjv

8
Une autre astuce de recherche SO: [language or tag] some_keyword comme dans [python] PDFou[python] PDF image
mjv

Pour ceux qui viennent ici en utilisant matplolib: stackoverflow.com/questions/17788685/…
David Parks

J'ai décliné cette question parce que la réponse acceptée est la mauvaise réponse ....
boatcoder

Réponses:


39

Je suggère pyPdf . Cela fonctionne vraiment bien. J'ai aussi écrit un article de blog il y a quelque temps, vous pouvez le trouver ici .


7
Un fork actuel de PyPDF2 se trouve ici .
Edmond Burnett

99
Notez que pypdf ne coupe / colle / etc. que le contenu pdf existant - vous ne pouvez pas ajouter de texte ou d'images à un pdf.
drevicko le

3
pyPDF2 n'est pas pour créer de nouveaux documents PDF, 4cs
michelek

160

Voici mon expérience après avoir suivi les conseils sur cette page.

  1. pyPDF ne peut pas intégrer d'images dans des fichiers. Il ne peut que se scinder et fusionner. (Source: Ctrl + F via sa page de documentation ) Ce qui est génial, mais pas si vous avez des images qui ne sont pas déjà incorporées dans un PDF.

  2. pyPDF2 ne semble pas avoir de documentation supplémentaire en plus de pyPDF.

  3. ReportLab est très complet. ( Guide d'utilisation ) Cependant, avec un peu de Ctrl + F et en parcourant sa source, j'ai obtenu ceci:

    • Tout d'abord, téléchargez le programme d'installation et la source Windows
    • 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 est d'obtenir un tas d'images dans un PDF, afin que je puisse vérifier leur apparence et les imprimer. Ce qui précède est suffisant pour atteindre cet objectif.

ReportLab est génial, mais gagnerait à inclure des mondes hellow comme ci-dessus en évidence dans sa documentation.


13
Je dois dire que reportlab est le meilleur pour la génération PDF que j'ai essayé, certainement le plus complet. Cependant, c'est aussi un peu plus compliqué. blog.pythonlibrary.org/2010/03/08/… blog.pythonlibrary.org/2010/09/21/…
Jose Salvatierra

1
C'était exactement ce que je cherchais
Maarten

@JoseSalvatierra Merci Jose ... c'est vraiment facile. Merci pour le lien du blog.
Arindam Roychowdhury

33

Je suggère Pdfkit . ( guide d' installation )

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 Python Pyramid:

  1. Rendu côté serveur avec des modèles mako avec le style et le balisage que vous souhaitez pour votre document PDF
  2. pdfkit.from_string(...)Méthode d' exécution en passant le code HTML rendu en paramètre

De cette façon, vous obtenez un document PDF avec un style et des images pris en charge.

Vous pouvez l'installer comme suit:

  • en utilisant pip

    pip install pdfkit

  • Vous devrez également installer wkhtmltopdf ( sur Ubuntu ).

14

Vous pouvez essayer ceci (Python-for-PDF-Generation) ou vous pouvez essayer PyQt , qui prend en charge 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 qui se ressemblent exactement sur toutes les plates-formes. Cependant, un document PDF doit parfois être généré dynamiquement, ce qui peut être un défi. Heureusement, il existe des bibliothèques qui peuvent vous aider. Cet article examine l'un de ceux pour Python.

En savoir plus sur http://www.devshed.com/c/a/Python/Python-for-PDF-Generation/#whoCFCPh3TAks368.99


Le lien ne fonctionne plus.
Robert Koch

9

Voici une solution qui ne fonctionne qu'avec les packages standard. matplotliba un backend PDF pour enregistrer les figures au format PDF. Vous pouvez créer des figures avec des sous-graphiques, où chaque sous-graphique est 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-la au format PDF. Chaque appel à savefigcréera une autre page de PDF.

L'exemple ci-dessous montre 2 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()

dans mon test, le code génère une seule page avec 2 images
constructeur du

la version mise à jour du code peut être trouvée dans github.com/constructor-igor/TechSugar/blob/master/pythonSamples/…
constructeur le

7

J'ai pas mal fait cela dans PyQt et cela fonctionne très bien. Qt prend en charge les images, les polices, les styles, etc. et tous peuvent être écrits dans des documents PDF.


1
Wow, Qt a l'air incroyable. Ils disent qu'ils soutiennent 15 plates-formes, inc. Windows, Mac OS X, Linux, Android, iOS, Windows RT ainsi que ces systèmes d'exploitation en temps réel - INTEGRITY QNX VxWorks qt.io/qt-framework . Et, comme je suis fan de python, j'aime bien "PyQt combine tous les avantages de Qt et Python. Un programmeur a toute la puissance de Qt, mais est capable de l'exploiter avec la simplicité de Python." Riverbankcomputing.co.uk / software / pyqt / intro
AnneTheAgile

7

Je crois que matplotlib a la capacité de sérialiser des graphiques, du texte et d'autres objets dans un document pdf.


Oui, vous pouvez. Cette réponse SO a quelques bons liens sur la façon de le faire.
drevicko le

7

fpdf est (aussi) python. Et souvent utilisé. Voir Recherche PyPI / pip. Mais peut-être qu'il a été renommé de pyfpdf en fpdf. À partir des fonctionnalités: prise en charge des formats PNG, GIF et JPG (y compris la transparence et le canal alpha)


1
Votre réponse n'est pas claire, mais c'est certainement PyFPDF pfoject pyfpdf.readthedocs.io/en/latest
Wojciech Kaczmarek

Toute la confusion dans la dénomination est vraiment dommage. Cette réponse et le commentaire de @WojciechKaczmarek méritent vraiment plus de votes positifs et d'attention. PyFPDF est un portage python d'une bibliothèque PDF souvent utilisée écrite à l'origine en PHP.
Idéogramme

6

J'utilise rst2pdf pour créer un fichier pdf, car je suis plus familier avec RST qu'avec HTML. Il prend en charge l'intégration de presque tous les types d'images raster ou vectorielles.

Cela nécessite reportlab , mais j'ai trouvé que reportlab n'est pas si simple à utiliser (du moins pour moi).



3

Cela dépend du format de vos fichiers image, mais pour un projet ici au travail, j'ai utilisé l'outil tiff2pdf dans LibTIFF de RemoteSensing.org . Fondamentalement, juste utilisé un sous-processus pour appeler tiff2pdf.exe avec l'argument approprié pour lire le type de tiff que j'avais et produire le type de pdf que je voulais. S'ils ne sont pas des tiffs, vous pouvez probablement les convertir en tiffs en utilisant PIL, ou peut-être trouver un outil plus spécifique à votre type d'image (ou plus générique si les images seront diverses) comme ReportLab mentionné ci-dessus.


3

fpdf fonctionne bien pour moi. Beaucoup plus simple que ReportLab et vraiment gratuit. Fonctionne avec UTF-8.


2
Lien / Descrip .: fpdf.org FPDF est une classe PHP qui permet de générer des fichiers PDF avec du PHP pur, c'est-à-dire sans utiliser la bibliothèque PDFlib. F de FPDF signifie Free: vous pouvez l'utiliser pour tout type d'utilisation et le modifier en fonction de vos besoins. FPDF a d'autres avantages: des fonctions de haut niveau. Voici une liste de ses principales caractéristiques: Choix de l'unité de mesure, du format de page et des marges, Gestion des en-têtes et pieds de page, Saut de page automatique, Saut de ligne automatique et justification du texte, Prise en charge des images (JPEG, PNG et GIF), Couleurs, Liens, TrueType, Type1 et prise en charge de l'encodage, compression de page
AnneTheAgile

12
Pas très pertinent étant donné que la question concernait Python, pas PHP
KingRadical

1
pourquoi tout ce vote négatif? fpdf est également disponible pour python. pip install fpdf works
user1981924

1
fpdf a peut-être commencé avec php. Mais il existe un portage python qui fonctionne très bien. Je pense donc que c'est une réponse très pertinente qui mérite plus de votes positifs que de votes négatifs. (Je ne suis pas sûr de la situation lorsque cette réponse a été publiée pour la première fois)
Sumudu

3

rinohtype prend en charge l'incorporation d'images PDF, PNG et JPEG (nativement) et d'autres formats bitmap (lorsque Pillow est installé).

(Divulgation complète: je suis l'auteur de rinohtype)


1
Hey! Corrigez-moi si je me trompe, mais il semble que c'est un outil assez puissant et contrairement à beaucoup d'autres énumérés ici, ce n'est pas un wrapper python pour une bibliothèque php / ruby ​​/ perl / pyqt4 / autre merde.
Mikaelblomkvistsson

3

Si vous êtes familier avec LaTex, vous voudrez peut-être envisager pylatex

L'un des avantages du 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 que la qualité de l'image était réduite.

L'inconvénient de pylatex est que, comme il est basé sur LaTex, il peut être difficile de placer les images exactement où vous le souhaitez sur la page. Cependant, j'ai trouvé que l'utilisation de l'argument position dans la classe Figure, et parfois Subfigure, donne des résultats assez bons.

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 d'autres systèmes Debian, vous pouvez exécuter sudo apt-get install texlive-full. Si vous utilisez Windows, je recommanderais MixTex

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.