Résumé de la comparaison des bibliothèques pour générer des PDF avec Python

Objectif de cet article

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

Comment installer

$ 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"

PDF généré

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.

xhtml2pdf / django-xhtml2pdf

Comment installer

$ pipenv install django_xhtml2pdf

SampleCode

from django_xhtml2pdf.views import PdfMixin

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

PDF généré

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

PDF généré

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

Comment installer

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


Génération de PDF générés

référence

Créer un CV au format PDF avec python + reportlab-Qiita python 2.7 - HTML to PDF on Google AppEngine - Stack Overflow

Recommended Posts

Résumé de la comparaison des bibliothèques pour générer des PDF avec Python
Convertir un PDF en image (JPEG / PNG) avec Python
Essayez de générer automatiquement des documents Python avec Sphinx
Convertissez l'image au format .zip en PDF avec Python
Connectez-vous à BigQuery avec Python
Générer du XML (RSS) avec Python
Connectez-vous à Wikipedia avec Python
Publiez sur Slack avec Python 3
Intégrez des fichiers PDF avec Python
Basculer python vers 2.7 avec des alternatives
Écrire en csv avec Python
[AWS] Essayez d'ajouter la bibliothèque Python à la couche avec SAM + Lambda (Python)
Probablement le moyen le plus simple de créer un pdf avec Python 3
Expérimentez pour créer un PDF indépendant pour Kindle avec Python
20200329_Introduction à l'analyse de données avec Python 2nd Edition Personal Summary
Convertir des images en sépia avec PIL (Python Imaging Library)
[Road to Intermediate Python] Permet des opérations de comparaison pour des classes uniques
Python: comment utiliser async avec
Lien pour commencer avec python
Introduction à la bibliothèque de calcul numérique Python NumPy
Convertir Markdown en PDF en Python
[Python] Ecrire dans un fichier csv avec Python
Ravi de vous rencontrer avec python
Essayez d'exploiter Facebook avec Python
Comment utiliser les requêtes (bibliothèque Python)
Sortie vers un fichier csv avec Python
Convertir la liste en DataFrame avec python
Conversion MP3 → WAV avec Python
[python] Script de copie pour générer un journal de copie
Pour faire une récursion avec Python2
Comment démarrer avec Python
Que faire avec la sortie de PYTHON?
[Python] Générer un mot de passe avec Slackbot
[HyperledgerIroha] Requête avec la bibliothèque Python
Comment calculer la date avec python
[Introduction à l'application Udemy Python3 +] Résumé
Convertir un PDF en image avec ImageMagick
Publiez facilement sur Twitter avec Python 3
Je veux déboguer avec Python
Générer un badge d'affichage du nombre de téléchargements de la bibliothèque Python
Générer un code de correction d'erreur pour restaurer la corruption des données avec la bibliothèque zfec
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
Convertir des fichiers écrits en python, etc. en pdf avec la coloration syntaxique
[Python] Résumé de l'utilisation des pandas
Résumé Python
Essayez de vous connecter à qiita avec Python
Changer l'environnement Python 64 bits en environnement 32 bits avec Anaconda
Reconnaissance vocale en anglais avec python [speech to text]
Convertir un mémo à la fois avec Python 2to3
mail html avec image à envoyer avec python
Mémo pour demander des KPI avec python
python à retenir uniquement avec bonjour, mondes
Sortir les caractères de couleur en joli avec python
Générer des données de test japonais avec Python Faker
Convertir de PDF en CSV avec pdfplumber