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).
$ 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"
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.
$ pipenv install django_xhtml2pdf
SampleCode
from django_xhtml2pdf.views import PdfMixin
class Xhtml2pdfSampleView_(PdfMixin, TemplateView):
template_name = "pdf_sample/sample.html"
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).
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
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
$ 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()
Erstellen Sie ein PDF im Lebenslaufformat mit Python + Reportlab-Qiita python 2.7 - HTML to PDF on Google AppEngine - Stack Overflow
Recommended Posts