Lors de la sortie de l'estimation au format PDF, j'ai essayé d'identifier les mérites de la bibliothèque associée. Le but de cet article est de présenter la méthode d'implémentation et la sortie dans la bibliothèque afin de pouvoir les comparer.
Cet article répertorie et compare les bibliothèques de sortie PDF des deux méthodes. La méthode et les diverses bibliothèques sont les suivantes.
Nous prêtons également attention aux points suivants concernant la comparaison.
--Entretien ――Est-il facile à entretenir?
TL;DR.
Je vais laisser une comparaison subjective personnelle.
Nom de la bibliothèque | facilité d'utilisation | Degré de liberté | Maintenabilité | Remarques |
---|---|---|---|---|
django-wkhtmltopdf | ○ | ○ | △ | |
django_xhtml2pdf | ○ | × | △ | |
WeasyPrint | ○ | △ | △ | |
reportlab | × | ◎ | ○ |
HTML to PDF django-wkhtmltopdf
Documentation documentation django-wkhtmltopdf 3.2.0
C'est une bibliothèque qui encapsule wkhtmltopdf, qui apparaît en haut de la recherche lorsque vous recherchez avec Python PDF
par recherche Google, pour django.
Il prend en charge la vue basée sur les classes de Django et est très facile à déployer.
Le PDF généré est également sorti proprement par défaut. Cependant, comme il est nécessaire d'installer le logiciel séparément, il semble qu'il sera difficile de l'installer dans AppEngine (vérification requise).
$ pipenv install django-wkhtmltopdf
L'installation du logiciel est requise séparément de wkhtmltopdf.
SampleCode
from wkhtmltopdf.views import PDFTemplateView
class PdfSampleView(PDFTemplateView):
filename = 'my_psdf.pdf'
template_name = "pdf_sample/sample.html"
django_xhtml2pdf
Une bibliothèque qui encapsule la bibliothèque django_xhtml2pdf
qui convertit le HTML en PDF avec Python pour Django.
Un mixin pour les vues basées sur les classes est fourni et facile à utiliser. Les décorateurs sont également pris en charge en standard.
Cependant, il existe peu de documents et peu d'options. De plus, probablement parce que l'interprétation CSS est unique, elle est sortie avec une structure différente du HTML normal.
$ pipenv install django_xhtml2pdf
SampleCode
from django_xhtml2pdf.views import PdfMixin
class Xhtml2pdfSampleView_(PdfMixin, TemplateView):
template_name = "pdf_sample/sample.html"
WeasyPrint
Outils de génération de PDF et bibliothèques proches de wkhtmltopdf. La documentation est complète. Bien qu'il ne soit pas aussi bon que wkhtmltopdf, il produit un PDF de meilleure qualité que xhtml. Il y a peu de différence dans la sortie avec HTML par rapport à xhtml. Cependant, en regardant la documentation d'installation, cela semble difficile pour AppEngine car il doit être installé séparément du package (nécessite une enquête).
Installer | Documentation WeasyPrint
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
C'est une bibliothèque qui est générée en spécifiant réellement la disposition sur le code Python. C'est forcément long car cela se passe sur le code y compris le style. La génération PDF peut être exécutée sans aucun problème. De plus, comme toutes les données peuvent être insérées dans le code, le degré de liberté de mise en œuvre est très élevé. Comme il existe de nombreuses options et documents, il est possible de créer un ensemble de livres.
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):
#Définir une police gothique pouvant utiliser le japonais
font_name = 'HeiseiKakuGo-W5'
pdfmetrics.registerFont(UnicodeCIDFont(font_name))
#Faire un portrait A4 en pdf
size = portrait(A4)
#Créer un endroit pour dessiner un pdf: L'origine du pdf se trouve en haut à gauche(bottomup=False)
pdf_canvas = canvas.Canvas(response)
#entête
font_size = 24 #taille de police
pdf_canvas.setFont("HeiseiKakuGo-W5", font_size)
pdf_canvas.drawString(93 * mm, 770, "Citation")
font_size = 10
pdf_canvas.setFont("HeiseiKakuGo-W5", font_size)
pdf_canvas.drawString(
150 * mm, 813, f"Date d'émission estimée: "
)
pdf_canvas.drawString(
150 * mm,
800,
"xxxxxxxxxxx-xxxxxxxxxx",
)
# (4)Nom de la compagnie
data = [
[f"Société Hogehoge", ""],
["Titre du projet", "Projet Hogehoge"],
["Durée de validité estimée: 30 jours à compter de la date d'émission", ""],
]
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, "Nous ferons une estimation comme suit")
# (4)Nom de la compagnie
data = [
["Montant total (taxes incluses)", f"1000 yens"],
]
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,
)
#Article
data = [["Contenu", "Mois de début", "Mois de fin", "Prix unitaire", "quantité", "Somme d'argent"]]
for idx in range(13):
data.append([" ", " ", " ", " ", " ", ""])
data.append([" ", " ", " ", "total", "", f"{1000:,}"])
data.append([" ", " ", " ", "taxe à la consommation", "", f"{1000 * 0.10:,.0f}"])
data.append([" ", " ", " ", "Montant total TTC", "", 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, "<Remarques>")
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()
#Exporter le pdf
pdf_canvas.save()
Créer un CV au format PDF avec python + reportlab-Qiita python 2.7 - HTML to PDF on Google AppEngine - Stack Overflow
Recommended Posts