web-dev-qa-db-fra.com

Comment créer PDF fichiers en Python

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?

156
Stephen T.

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 .

41
Geo

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

  1. 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.

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

  3. ReportLab est très vaste. ( Userguide ) Cependant, avec un peu de Ctrl + F et un accès direct à la source, j'ai eu ceci:

    • Tout d’abord, téléchargez le programme d’installation Windows et source
    • 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.

137
Evgeni Sergeev

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:

  1. Rendu côté serveur avec des modèles mako avec le style et le balisage que vous souhaitez pour votre document pdf
  2. Exécution de la méthode pdfkit.from_string(...) en passant le code HTML rendu en tant que paramètre

De 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 devrez également installer wkhtmltopdf ( sur Ubuntu ).
26
eton_ceb

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

14
gruszczy

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.

6
Allen

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()
5

Je pense que matplotlib est capable de sérialiser des graphiques, du texte et d'autres objets dans un document pdf.

5
Andrea

J'utilise rst2pdf pour créer un fichier pdf, car je connais mieux RST que 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’était pas aussi simple à utiliser (du moins pour moi).

5
ismailsunni

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)

4
mirek

Vous pouvez réellement essayer xhtml2pdf http://flask.pocoo.org/snippets/68/

1
zeroc00l

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

1
mfs

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)

1
Brecht Machiels

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.

1
Tofystedeth

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

0
Chepe