So erstellen Sie PDF-Dateien in Python [geschlossen]


156

Ich arbeite an einem Projekt, das einige Bilder vom Benutzer nimmt und dann eine PDF-Datei erstellt, die alle diese Bilder enthält.

Gibt es eine Möglichkeit oder ein Werkzeug, um dies in Python zu tun? Zum Beispiel, um eine PDF-Datei (oder eps, ps) aus Bild1 + Bild 2 + Bild 3 -> PDF-Datei zu erstellen?


47
Wenn Sie Zweifel haben , Präfix , was auch immer Sie suchen nach py;-)
mjv

8
Ein weiterer SO- [language or tag] some_keyword[python] PDF[python] PDF image
Suchtrick

Für diejenigen, die mit matplolib hierher kommen: stackoverflow.com/questions/17788685/…
David Parks

Ich habe diese Frage abgelehnt, weil die akzeptierte Antwort die falsche Antwort ist ...
Bootscodierer

Antworten:


39

Ich schlage pyPdf vor . Es funktioniert wirklich gut. Ich habe vor einiger Zeit auch einen Blog-Beitrag geschrieben, den Sie hier finden können .


7
Eine aktuelle Gabel von PyPDF2 befindet sich hier .
Edmond Burnett

98
Beachten Sie, dass Pypdf nur vorhandene PDF-Inhalte ausschneidet / einfügt / usw. - Sie können einem PDF keinen Text oder Bilder hinzufügen.
Drevicko

3
pyPDF2 ist nicht zum Erstellen neuer PDF-Dokumente, 4cs
michelek

160

Hier ist meine Erfahrung, nachdem ich den Hinweisen auf dieser Seite gefolgt bin.

  1. pyPDF kann keine Bilder in Dateien einbetten. Es kann nur geteilt und zusammengeführt werden. (Quelle: Strg + F über die Dokumentationsseite ) Das ist großartig, aber nicht, wenn Sie Bilder haben, die noch nicht in eine PDF-Datei eingebettet sind.

  2. pyPDF2 scheint keine zusätzliche Dokumentation über pyPDF zu haben.

  3. ReportLab ist sehr umfangreich. ( Userguide ) Mit ein wenig Strg + F und dem Durchsuchen der Quelle habe ich jedoch Folgendes erhalten:

    • Zuerst laden Sie die Windows - Installer und Quelle
    • Versuchen Sie dies dann in der Python-Befehlszeile:

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

Alles, was ich brauchte, war, ein paar Bilder in eine PDF-Datei zu bringen, damit ich überprüfen kann, wie sie aussehen, und sie drucken kann. Das oben Genannte reicht aus, um dieses Ziel zu erreichen.

ReportLab ist großartig, würde aber davon profitieren, Helloworlds wie die oben genannten prominent in seine Dokumentation aufzunehmen.


13
Ich muss sagen, Reportlab ist das Beste für die PDF-Generierung, das ich ausprobiert habe, definitiv das vollständigste. Es ist jedoch auch etwas komplizierter. blog.pythonlibrary.org/2010/03/08/… blog.pythonlibrary.org/2010/09/21/…
Jose Salvatierra

1
Dies war genau das, wonach ich gesucht hatte
Maarten

@ JoseSalvatierra Danke Jose ... das ist wirklich einfach. Danke für den Blog Link.
Arindam Roychowdhury

33

Ich schlage Pdfkit vor . (Installation Guide )

Es erstellt PDF aus HTML-Dateien. Ich habe es ausgewählt, um PDF in 2 Schritten von meinem Python Pyramid-Stapel zu erstellen:

  1. Serverseitiges Rendern mit Mako-Vorlagen mit dem gewünschten Stil und Markup für Ihr PDF-Dokument
  2. Ausführen der pdfkit.from_string(...)Methode durch Übergabe des gerenderten HTML-Codes als Parameter

Auf diese Weise erhalten Sie ein PDF-Dokument mit unterstützten Stilen und Bildern.

Sie können es wie folgt installieren:

  • mit pip

    pip install pdfkit

  • Sie müssen auch wkhtmltopdf ( unter Ubuntu ) installieren .

14

Sie können versuchen , diese (Python-for-PDF-Generation) oder Sie können versuchen PyQt , die Unterstützung für den Druck zu pdf hat.

Python für die PDF-Generierung

Mit dem Format (Portable Document Format) können Sie Dokumente erstellen, die auf jeder Plattform genau gleich aussehen. Manchmal muss ein PDF-Dokument jedoch dynamisch generiert werden, und das kann eine ziemliche Herausforderung sein. Glücklicherweise gibt es Bibliotheken, die helfen können. Dieser Artikel untersucht eine davon für Python.

Lesen Sie mehr unter http://www.devshed.com/c/a/Python/Python-for-PDF-Generation/#whoCFCPh3TAks368.99


Link funktioniert nicht mehr.
Robert Koch

9

Hier ist eine Lösung, die nur mit den Standardpaketen funktioniert. matplotlibverfügt über ein PDF-Backend zum Speichern von Zahlen in PDF. Sie können Figuren mit Nebenhandlungen erstellen, wobei jede Nebenhandlung eines Ihrer Bilder ist. Sie haben die volle Freiheit, mit der Figur herumzuspielen: Titel hinzufügen, mit der Position spielen usw. Sobald Ihre Figur fertig ist, speichern Sie sie als PDF. Bei jedem Aufruf von savefigwird eine weitere PDF-Seite erstellt.

Das folgende Beispiel zeigt 2 Bilder nebeneinander auf Seite 1 und Seite 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()

In meinem Test generiert der Code eine einzelne Seite mit 2 Bildern
Konstruktor

Die aktualisierte Version des Codes finden Sie unter github.com/constructor-igor/TechSugar/blob/master/pythonSamples/…
Konstruktor

7

Ich habe das in PyQt ziemlich oft gemacht und es funktioniert sehr gut. Qt bietet umfassende Unterstützung für Bilder, Schriftarten, Stile usw. und all diese können in PDF-Dokumente geschrieben werden.


1
Wow, Qt sieht toll aus. Sie sagen, dass sie 15 Plattformen unterstützen, inc. Windows, Mac OS X, Linux, Android, iOS, Windows RT sowie diese Echtzeitbetriebssysteme - INTEGRITY QNX VxWorks qt.io/qt-framework . Und da ich ein Python-Fan bin, mag ich "PyQt kombiniert alle Vorteile von Qt und Python. Ein Programmierer hat die ganze Leistung von Qt, kann sie aber mit der Einfachheit von Python nutzen." Riverbankcomputing.co.uk / software / pyqt / intro
AnneTheAgile

7

Ich glaube, dass matplotlib die Fähigkeit hat, Grafiken, Text und andere Objekte in ein PDF-Dokument zu serialisieren.


Ja, du kannst. Diese SO-Antwort enthält einige gute Links dazu.
Drevicko

6

Ich verwende rst2pdf , um eine PDF-Datei zu erstellen, da ich mit RST besser vertraut bin als mit HTML. Es unterstützt das Einbetten fast aller Arten von Raster- oder Vektorbildern.

Es erfordert Reportlab , aber ich fand, dass Reportlab nicht so einfach zu verwenden ist (zumindest für mich).


6

fpdf ist auch Python. Und oft benutzt. Siehe PyPI / Pip-Suche. Aber vielleicht wurde es von pyfpdf in fpdf umbenannt. Von Funktionen: PNG-, GIF- und JPG-Unterstützung (einschließlich Transparenz und Alphakanal)


1
Ihre Antwort ist unklar, aber Thyere ist sicherlich PyFPDF pfoject pyfpdf.readthedocs.io/en/latest
Wojciech Kaczmarek

Die ganze Verwirrung bei der Benennung ist wirklich schade. Diese Antwort und der Kommentar von @WojciechKaczmarek verdienen wirklich mehr positive Stimmen und Aufmerksamkeit. PyFPDF ist ein Python-Port einer häufig verwendeten PDF-Bibliothek, die ursprünglich in PHP geschrieben wurde.
Ideogramm


3

Es hängt davon ab, in welchem ​​Format Ihre Bilddateien vorliegen, aber für ein Projekt hier bei der Arbeit habe ich das Tool tiff2pdf in LibTIFF von RemoteSensing.org verwendet . Grundsätzlich wurde nur ein Unterprozess verwendet, um tiff2pdf.exe mit dem entsprechenden Argument aufzurufen, um die Art von TIFF zu lesen, die ich hatte, und um die Art von PDF auszugeben, die ich wollte. Wenn es sich nicht um Tiffs handelt, können Sie sie wahrscheinlich mithilfe von PIL in Tiffs konvertieren oder ein Tool finden, das spezifischer für Ihren Bildtyp ist (oder allgemeiner, wenn die Bilder unterschiedlich sind), wie das oben erwähnte ReportLab.


3

fpdf funktioniert gut für mich. Viel einfacher als ReportLab und wirklich kostenlos. Funktioniert mit UTF-8.


2
Link / Beschreibung: fpdf.org FPDF ist eine PHP-Klasse, mit der PDF-Dateien mit reinem PHP generiert werden können, dh ohne die PDFlib-Bibliothek zu verwenden. F von FPDF steht für Free: Sie können es für jede Art von Nutzung verwenden und an Ihre Bedürfnisse anpassen. FPDF hat andere Vorteile: Funktionen auf hoher Ebene. Hier ist eine Liste der Hauptfunktionen: Auswahl der Maßeinheit, Seitenformat und -ränder, Verwaltung von Seitenkopf- und Fußzeilen, Automatischer Seitenumbruch, Automatischer Zeilenumbruch und Textausrichtung, Bildunterstützung (JPEG, PNG und GIF), Farben, Links, Unterstützung für TrueType, Type1 und Codierung,
Seitenkomprimierung

12
Nicht sehr relevant, wenn man bedenkt, dass die Frage Python
betraf

1
Warum all diese Abstimmungen? fpdf ist auch für Python verfügbar. pip install fpdf works
user1981924

1
fpdf könnte mit php begonnen haben. Aber es gibt einen Python- Port, der wirklich gut funktioniert. Ich denke, dies ist eine sehr relevante Antwort, die mehr Aufwärtsstimmen als Abwärtsstimmen verdient. (Ich bin nicht sicher über die Situation, als diese Antwort ursprünglich veröffentlicht wurde)
Sumudu

3

rinohtype unterstützt das Einbetten von PDF-, PNG- und JPEG-Bildern (nativ) und anderen Bitmap-Formaten (wenn Pillow installiert ist).

(Vollständige Offenlegung: Ich bin der Autor von rinohtype)


1
Hallo! Korrigieren Sie mich, wenn ich falsch liege, aber es scheint, dass es ein ziemlich mächtiges Tool ist und im Gegensatz zu vielen anderen, die hier aufgelistet sind, kein Python-Wrapper für eine alte PHP / Ruby / Perl / Pyqt4 / andere Mistbibliothek.
Mikaelblomkvistsson

3

Wenn Sie mit LaTex vertraut sind, sollten Sie Pylatex in Betracht ziehen

Einer der Vorteile von Pylatex besteht darin, dass die Bildqualität leicht gesteuert werden kann. Die Bilder in Ihrem PDF haben die gleiche Qualität wie die Originalbilder. Bei der Verwendung von reportlab habe ich festgestellt, dass die Bilder automatisch komprimiert und die Bildqualität verringert wurden.

Der Nachteil von Pylatex ist, dass es schwierig sein kann, Bilder genau dort zu platzieren, wo Sie sie auf der Seite haben möchten, da es auf LaTex basiert. Ich habe jedoch festgestellt, dass die Verwendung des Positionsarguments in der Figure-Klasse und manchmal in Subfigure ausreichend gute Ergebnisse liefert.

Beispielcode zum Erstellen eines PDFs mit einem einzelnen Bild:

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)

Zusätzlich zur Installation von pylatex (pip install pylatex) müssen Sie LaTex installieren. Für Ubuntu und andere Debian-Systeme können Sie ausführen sudo apt-get install texlive-full. Wenn Sie Windows verwenden, würde ich MixTex empfehlen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.