Zusammenfassung des Bibliotheksvergleichs zum Generieren von PDF mit Python

Zweck dieses Artikels

Bei der Ausgabe der Schätzung in PDF habe ich versucht, die Vorzüge der zugehörigen Bibliothek zu ermitteln. Der Zweck dieses Artikels besteht darin, die Implementierungsmethode und die Ausgabe in der Bibliothek darzustellen, damit sie verglichen werden können.

In diesem Artikel werden die PDF-Ausgabebibliotheken der beiden Methoden aufgelistet und verglichen. Die Methode und verschiedene Bibliotheken sind wie folgt.

Beim Vergleich beachten wir auch die folgenden Punkte.

--Instandhaltung ――Ist es leicht zu warten?

TL;DR.

Ich werde einen persönlichen subjektiven Vergleich hinterlassen.

Bibliotheksname Benutzerfreundlichkeit Freiheitsgrad Wartbarkeit Bemerkungen
django-wkhtmltopdf
django_xhtml2pdf ×
WeasyPrint
reportlab ×

HTML to PDF django-wkhtmltopdf

Dokumentation Dokumentation zu django-wkhtmltopdf 3.2.0

Es ist eine Bibliothek, die wkhtmltopdf umschließt, die oben in der Suche angezeigt wird, wenn mit "Python PDF" von Google nach Django gesucht wird. Es unterstützt die klassenbasierte Ansicht von Django und ist sehr einfach bereitzustellen. Das generierte PDF wird standardmäßig auch sauber ausgegeben. Da die Software jedoch separat installiert werden muss, scheint es schwierig zu sein, sie in AppEngine zu installieren (Überprüfung erforderlich).

Wie installiert man

$ pipenv install django-wkhtmltopdf

Die Softwareinstallation ist separat von wkhtmltopdf erforderlich.

SampleCode

from wkhtmltopdf.views import PDFTemplateView

class PdfSampleView(PDFTemplateView):
    filename = 'my_psdf.pdf'    
    template_name = "pdf_sample/sample.html"

Generiertes PDF

django_xhtml2pdf

Eine Bibliothek, die die Bibliothek django_xhtml2pdf umschließt, die HTML in PDF mit Python für Django konvertiert. Ein Mixin für klassenbasierte Ansichten wird bereitgestellt und ist einfach zu verwenden. Dekorateure werden ebenfalls standardmäßig unterstützt. Es gibt jedoch nur wenige Dokumente und Optionen. Wahrscheinlich, weil die CSS-Interpretation eindeutig ist, wird sie mit einer anderen Struktur als normales HTML ausgegeben.

xhtml2pdf / django-xhtml2pdf

Wie installiert man

$ pipenv install django_xhtml2pdf

SampleCode

from django_xhtml2pdf.views import PdfMixin

class Xhtml2pdfSampleView_(PdfMixin, TemplateView):
    template_name = "pdf_sample/sample.html"
    

Generiertes PDF

WeasyPrint

Tools und Bibliotheken zur PDF-Generierung in der Nähe von wkhtmltopdf. Die Dokumentation ist umfangreich. Obwohl es nicht so gut wie wkhtmltopdf ist, gibt es ein PDF mit höherer Qualität als xhtml aus. Es gibt kaum einen Unterschied in der Ausgabe mit HTML im Vergleich zu xhtml. In der Installationsdokumentation erscheint es AppEngine jedoch schwierig, da es separat vom Paket installiert werden muss (muss untersucht werden).

Install | WeasyPrint-Dokument

WeasyPrint — WeasyPrint 51 documentation

SampleCode

from weasyprint import HTML, CS
from django.http import HttpResponse
from django.template.loader import get_templat

class WeasyPrintView(TemplateView):
    template_name = 'pdf_sample/sample.html'

    def get(self, request, *args, **kwargs):

        html_template = get_template('pdf_sample/sample.html')
        context = super().get_context_data(**kwargs)

        html_str = html_template.render(context)  
        pdf_file = HTML(string=html_str, base_url=request.build_absolute_uri()).write_pdf(
        )

        response = HttpResponse(pdf_file, content_type='application/pdf')
        response['Content-Disposition'] = 'filename="fuga.pdf"'

        return response

Generiertes PDF

HardCodePDF

reportlab

Es ist eine Bibliothek, die durch Angabe des Layouts im Python-Code generiert wird. Es ist unvermeidlich lang, weil es auf dem Code einschließlich des Stils passiert. Die PDF-Generierung kann problemlos ausgeführt werden. Da alle Daten in Code eingefügt werden können, ist der Freiheitsgrad der Implementierung sehr hoch. Da es viele Optionen und Dokumente gibt, ist es möglich, eine Reihe von Büchern zu erstellen.

ReportLab - Content to PDF Solutions

Wie installiert man

$ pipenv install reportlab

SampleCode

from django.views.generic import TemplateView
from django.http import HttpResponse

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.lib.pagesizes import A4, portrait
from reportlab.platypus import Table, TableStyle
from reportlab.lib.units import mm
from reportlab.lib import colors

class ReportlabView(TemplateView):
    template_name = 'pdf_sample/sample.html'

    def get(self, request, *args, **kwargs):

        response = HttpResponse(status=200, content_type='application/pdf')
        response['Content-Disposition'] = 'filename="example.pdf"'
        # response['Content-Disposition'] = 'attachment; filename="example.pdf"'

        self._create_pdf(response)
        return response

    def _create_pdf(self, response):
        #Stellen Sie eine gotische Schriftart ein, die Japanisch verwenden kann
        font_name = 'HeiseiKakuGo-W5'
        pdfmetrics.registerFont(UnicodeCIDFont(font_name))

        #Machen Sie A4 Porträt PDF
        size = portrait(A4)

        #Erstellen Sie einen Ort zum Zeichnen von PDF: Der Ursprung von PDF befindet sich oben links(bottomup=False)
        pdf_canvas = canvas.Canvas(response)
        #Header
        font_size = 24  #Schriftgröße
        pdf_canvas.setFont("HeiseiKakuGo-W5", font_size)
        pdf_canvas.drawString(93 * mm, 770, "Zitat")
        font_size = 10
        pdf_canvas.setFont("HeiseiKakuGo-W5", font_size)
        pdf_canvas.drawString(
            150 * mm, 813, f"Voraussichtliches Ausgabedatum: "
        )
        pdf_canvas.drawString(
            150 * mm,
            800,
            "xxxxxxxxxxx-xxxxxxxxxx",
        )

        # (4)Name der Firma
        data = [
            [f"Hogehoge Firma", ""],
            ["Projekttitel", "Hogehoge-Projekt"],
            ["Geschätzte Gültigkeitsdauer: 30 Tage ab Ausstellungsdatum", ""],
        ]

        table = Table(data, colWidths=(15 * mm, 80 * mm), rowHeights=(7 * mm))
        table.setStyle(
            TableStyle(
                [
                    ("FONT", (0, 0), (-1, -1), "HeiseiKakuGo-W5", 12),
                    ("LINEABOVE", (0, 1), (-1, -1), 1, colors.black),
                    ("VALIGN", (0, 0), (1, -1), "MIDDLE"),
                    ("VALIGN", (0, 1), (0, -1), "TOP"),
                ]
            )
        )
        table.wrapOn(pdf_canvas, 20 * mm, 248 * mm)
        table.drawOn(pdf_canvas, 20 * mm, 248 * mm)



        pdf_canvas.drawString(20 * mm, 238 * mm, "Wir werden eine Schätzung wie folgt vornehmen")
        # (4)Name der Firma
        data = [
            ["Gesamtbetrag (inklusive Steuern)", f"1000 Yen"],
        ]

        table = Table(data, colWidths=(50 * mm, 60 * mm), rowHeights=(7 * mm))
        table.setStyle(
            TableStyle(
                [
                    ("FONT", (0, 0), (1, 2), "HeiseiKakuGo-W5", 10),
                    ("BOX", (0, 0), (2, 3), 1, colors.black),
                    ("INNERGRID", (0, 0), (1, -1), 1, colors.black),
                    ("VALIGN", (0, 0), (1, 2), "MIDDLE"),
                    ("ALIGN", (1, 0), (-1, -1), "RIGHT"),
                ]
            )
        )
        table.wrapOn(
            pdf_canvas,
            20 * mm,
            218 * mm,
        )
        table.drawOn(
            pdf_canvas,
            20 * mm,
            218 * mm,
        )

        #Artikel
        data = [["Inhalt", "Startmonat", "Ende des Monats", "Stückpreis", "Menge", "Geldbetrag"]]

        for idx in range(13):
            data.append([" ", " ", " ", " ", " ", ""])

        data.append([" ", " ", " ", "gesamt", "", f"{1000:,}"])
        data.append([" ", " ", " ", "Verbraucher Steuer", "", f"{1000 * 0.10:,.0f}"])
        data.append([" ", " ", " ", "Gesamtbetrag einschließlich Steuern", "", f"{1000 * 1.10:,.0f}"])
        data.append(
            [" ", " ", " ", "", "", ""],
        )

        table = Table(
            data,
            colWidths=(70 * mm, 25 * mm, 25 * mm, 20 * mm, 20 * mm, 20 * mm),
            rowHeights=6 * mm,
        )
        table.setStyle(
            TableStyle(
                [
                    ("FONT", (0, 0), (-1, -1), "HeiseiKakuGo-W5", 8),
                    ("BOX", (0, 0), (-1, 13), 1, colors.black),
                    ("INNERGRID", (0, 0), (-1, 13), 1, colors.black),
                    ("LINEABOVE", (3, 11), (-1, 18), 1, colors.black),
                    ("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
                    ("ALIGN", (1, 0), (-1, -1), "RIGHT"),
                ]
            )
        )
        table.wrapOn(pdf_canvas, 17 * mm, 100 * mm)
        table.drawOn(pdf_canvas, 17 * mm, 100 * mm)

        pdf_canvas.drawString(17 * mm, 100 * mm, "<Bemerkungen>")

        table = Table(
            [[""]],
            colWidths=(180 * mm),
            rowHeights=90 * mm,
        )

        table.setStyle(
            TableStyle(
                [
                    ("FONT", (0, 0), (-1, -1), "HeiseiKakuGo-W5", 8),
                    ("BOX", (0, 0), (-1, -1), 1, colors.black),
                    ("INNERGRID", (0, 0), (-1, -1), 1, colors.black),
                    ("VALIGN", (0, 0), (-1, -1), "TOP"),
                ]
            )
        )
        table.wrapOn(pdf_canvas, 17 * mm, 5 * mm)
        table.drawOn(pdf_canvas, 17 * mm, 5 * mm)
        pdf_canvas.showPage()

        #PDF exportieren
        pdf_canvas.save()
        


Generierte PDF-Generierung

Referenz

Erstellen Sie ein PDF im Lebenslaufformat mit Python + Reportlab-Qiita python 2.7 - HTML to PDF on Google AppEngine - Stack Overflow

Recommended Posts

Zusammenfassung des Bibliotheksvergleichs zum Generieren von PDF mit Python
Konvertieren Sie PDF in Bilder (JPEG / PNG) mit Python
Versuchen Sie, Python-Dokumente automatisch mit Sphinx zu generieren
Konvertieren Sie das Bild in .zip mit Python in PDF
Stellen Sie mit Python eine Verbindung zu BigQuery her
Generieren Sie XML (RSS) mit Python
Stellen Sie mit Python eine Verbindung zu Wikipedia her
Post to Slack mit Python 3
Integrieren Sie PDF-Dateien in Python
Schalten Sie Python mit Alternativen auf 2.7 um
Schreiben Sie mit Python in csv
[AWS] Versuchen Sie, die Python-Bibliothek mit SAM + Lambda (Python) zur Ebene hinzuzufügen.
Wahrscheinlich der einfachste Weg, um mit Python 3 ein PDF zu erstellen
Experimentieren Sie mit Python, um ein PDF für Selbstversorger für Kindle zu erstellen
20200329_Einführung in die Datenanalyse mit Python 2nd Edition Personal Summary
Konvertieren Sie Bilder mit PIL (Python Imaging Library) in Sepia.
[Road to Intermediate Python] Aktiviert Vergleichsoperationen mit Originalklassen
Python: So verwenden Sie Async mit
Link, um mit Python zu beginnen
Einführung in die Python Numerical Calculation Library NumPy
Konvertieren Sie Markdown in Python in PDF
[Python] Mit Python in eine CSV-Datei schreiben
Schön dich mit Python zu treffen
Versuchen Sie, Facebook mit Python zu betreiben
Verwendung von Anfragen (Python Library)
Ausgabe in eine CSV-Datei mit Python
Konvertieren Sie die Liste mit Python in DataFrame
MP3 → WAV-Konvertierung mit Python
[Python] Kopierskript zum Generieren eines Kopierprotokolls
Schwanzrekursion mit Python2 durchführen
Erste Schritte mit Python
Was tun mit PYTHON Release?
[Python] Generiere ein Passwort mit Slackbot
[HyperledgerIroha] Abfrage mit Python-Bibliothek
So berechnen Sie das Datum mit Python
[Einführung in die Udemy Python3 + -Anwendung] Zusammenfassung
Konvertieren Sie PDF in Image mit ImageMagick
Mit Python 3 einfach auf Twitter posten
Ich möchte mit Python debuggen
Generieren Sie das Display-Abzeichen für die Download-Anzahl der Python-Bibliotheken
Generieren Sie einen Fehlerkorrekturcode, um die Datenbeschädigung mit der zfec-Bibliothek wiederherzustellen
Ich habe eine Bibliothek erstellt, die Konfigurationsdateien mit Python einfach lesen kann
Konvertieren Sie in Python usw. geschriebene Dateien in PDF mit Syntax-Hervorhebung
[Python] Zusammenfassung der Verwendung von Pandas
Python-Zusammenfassung
Versuchen Sie, sich mit Python bei qiita anzumelden
Ändern Sie die Python 64-Bit-Umgebung mit Anaconda in eine 32-Bit-Umgebung
Englische Spracherkennung mit Python [Rede zu Text]
Konvertieren Sie Memos sofort mit Python 2to3
HTML-Mail mit Bild zum Senden mit Python
Memo, um nach KPI mit Python zu fragen
Python nur mit Hallo, Welten zu erinnern
Geben Sie Farbzeichen mit Python zu hübsch aus
Generieren Sie japanische Testdaten mit Python faker
Konvertieren Sie mit pdfplumber von PDF in CSV