Une histoire sur la conversion de HTML en PDF avec WeasyPrint + matplotlib et l'intégration de graphiques [Les débutants apprennent python avec un livre de référence]

introduction

Utilisation de Takashi Otaka, "Apprendre en bougeant! Introduction au développement Python Django" Je suis un débutant qui a commencé à apprendre python et Django.

J'étudie la programmation depuis environ 4 mois en utilisant ruby / rails, Quand j'ai changé de travail en tant qu'ingénieur, j'ai décidé d'utiliser python, alors j'ai commencé à étudier avec ce livre d'une main.

Puisque je suis un amateur de première classe, je vous serais très reconnaissant si vous pouviez commenter les suppléments et les suggestions.

Aperçu

Je souhaite convertir une page HTML en PDF et l'afficher. Je souhaite également créer un graphique avec «matplotlib» et le mettre au format PDF en tant qu'image.

① HTML → Parcours PDF

HTML↓

from django.shortcuts import render

def html_view(request):
             .
             .
             .
  #Empaquetez les variables en contexte et passez au HTML
    context = {
        "hoge": hoge,
        "fuga": fuga,
    }
    return render(request, 'hogefuga.html', context)

Conversion PDF ↓

from django.http import HttpResponse
from django.shortcuts import render
from weasyprint import HTML, CSS
from django.template.loader import get_template

def pdf_view(request):
             .
             .
             .
   #Spécifier le modèle et transmettre les variables
    html_template = get_template('hogefuga.html')
    html_str = html_template.render({
        "hoge": hoge,
        "fuga": fuga,
    }, request)

    #Conversion PDF
    pdf_file = HTML(string=html_str, encoding='utf-8').write_pdf(
        stylesheets=[
       #WeasyPrint ne sera appliqué que si vous spécifiez un fichier CSS ici.
            CSS('./static/css/hogefuga.css'),
        ],
    )
    response = HttpResponse(pdf_file, content_type='application/pdf')
    response['Content-Disposition'] = 'filename="hogefuga.pdf"'
    return response

② Créez un graphique avec matplotlib et affichez-le sur PDF

La sagesse de nos ancêtres est incroyable. J'ai réussi à lutter jusqu'à présent ...

Maintenant, créons également un graphique.

from django.http import HttpRespons
from django.shortcuts import render
from weasyprint import HTML, CSS
from django.template.loader import get_template
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('Agg')

def pdf_graph_view(request):

    x = [1, 2, 3, 4, 5]
    y = [1, 2, 3, 4, 5]

    fig = plt.figure(figsize=(4.0, 3.0))
    ax = fig.add_subplot(111)
    ax.plot(x, y)
    plt.savefig('static/img/graph.png', format='png', dpi=200)
             .
             .
             .
Identique au code PDF ci-dessous

En passant, si la description suivante n'est pas fournie, une erreur se produira. J'ai été privé de temps par cette simple description ... Cliquez ici pour la sagesse de l'ancêtre emprunté

mpl.use('Agg')

③ L'image (graphique) ne s'affiche pas dans le PDF

Maintenant, écrivez l'emplacement du fichier image en HTML et vous avez terminé.

hogefuga.html


<img src="{% static 'img/graph.png' %}">

Cependant, le grossiste ne le vend pas en gros. Pour une raison quelconque, l'image ne s'affiche pas au format PDF. Pourquoi.

Contre-mesure ①

pdf_file = HTML(string=html_str, base_url=request.build_absolute_uri(), encoding='utf-8')

changer en. Ensuite, le graphique s'affiche, mais les caractères sont déformés. Il semble que le PC sera enfin détruit. au revoir Jobs.

Contre-mesure ②

Si les caractères sont déformés pour le moment, Il n'y a pas d'autre choix que d'augmenter la priorité des polices par la force. (Cellule unique morte au cerveau)

hogefuga.css


font-family: 'msmincho'!important;

!! Quand j'ai ajouté important, les caractères déformés ont été résolus en toute sécurité. ~~ Cependant, ce n'est pas une solution fondamentale. Couvrez les choses laides. ~~

finalement

Les ancêtres sont incroyables. L'ingénieur est incroyable. Envie de. Il semble qu'il faudra du temps pour sortir des débutants. Etudier tous les jours, n'est-ce pas? Pourquoi les caractères sont-ils déformés (CSS ne fonctionne pas)? Je dois le résoudre.

Excellent article de référence

Mémo de tirage inversé Matplotlib (édition cadre)Conseils pour dessiner avec matplotlib côté serveurSortie PDF facile avec Django2.0 + WeasyPrintLa sortie PDF utilisant Weasyprint n'affiche pas les images (Django)

Recommended Posts

Une histoire sur la conversion de HTML en PDF avec WeasyPrint + matplotlib et l'intégration de graphiques [Les débutants apprennent python avec un livre de référence]
Une histoire sur l'ajout d'une API REST à un démon créé avec Python
Une histoire que je ne savais pas charger de mixin lors de la création d'une façade avec l'application django [Débutant apprend python avec un livre de référence]
[Petite histoire] Comment enregistrer des graphiques matplotlib dans un lot avec Jupyter
Une histoire sur Python pop and append
[Python] Comment dessiner plusieurs graphiques avec Matplotlib
Une histoire sur la modification de Python et l'ajout de fonctions
Une histoire sur la façon dont les utilisateurs de Windows 10 ont créé un environnement pour utiliser OpenCV3 avec Python 3.5
Une histoire dont je voulais afficher le résultat de la division (%) sur HTML avec une application utilisant django [Débutant apprend python avec un livre de référence dans une main]
[Python] Comment dessiner un graphique linéaire avec Matplotlib
Une histoire d'essayer un monorepo (Golang +) Python avec Bazel
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
[Python] Comment dessiner un diagramme de dispersion avec Matplotlib
[Python] Road to the Serpent (5) Jouez avec Matplotlib
Une histoire que je voulais faire une fonction comme before_action utilisée dans les rails avec django [Débutant apprend python avec un livre de référence]
[Note] Une histoire sur la tentative de remplacer une méthode de classe avec deux barres inférieures dans la série Python 3.
Je veux faire un changeur de voix en utilisant Python et SPTK en référence à un site célèbre
À partir d'un livre que les programmeurs peuvent apprendre ... (Python): À propos du tri
Une histoire sur la façon de spécifier un chemin relatif en 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
Créons un diagramme PRML avec Python, Numpy et matplotlib.
Méthode d'apprentissage TensorFlow pour les professionnels des arts libéraux et les débutants en Python
Une histoire sur un amateur faisant une rupture de bloc avec python (kivy) ②
Essayez d'ouvrir une sous-fenêtre avec PyQt5 et Python
Une histoire sur la façon de traiter le problème CORS
Une histoire sur un amateur faisant une rupture de bloc avec python (kivy) ①
Générez dynamiquement des graphiques avec matplotlib et intégrez-les au PDF avec reporlab
Une histoire sur la tentative d'implémentation de variables privées en Python.
Une histoire à propos d'un débutant en python coincé avec aucun module nommé'ttp.server '
Une histoire sur tout, de la collecte de données au développement d'IA et à la publication d'applications Web en Python (3. développement d'IA)
Python # À propos de la référence et de la copie
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
Une histoire sur le développement d'un type logiciel avec Firestore + Python + OpenAPI + Typescript
Une histoire sur la tentative d'exécuter plusieurs versions de Python (édition Mac)
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
Passer la liste de Python vers C ++ par référence dans pybind11
J'ai exécuté GhostScript avec python, divisé le PDF en pages et l'ai converti en image JPEG.
Une histoire d'une personne qui voulait importer django depuis le shell interactif de python et enregistrer des choses dans la base de données
J'ai utilisé Python avec le minimum de connaissances nécessaires, mais j'ai acheté un livre de référence et étudié à nouveau pour résumer ce que j'ai appris de nouveau et ce que j'ai trouvé utile