Convertir Markdown en PDF en Python

Ce que j'ai fait

En Python, j'ai gratté une page Web contenant une notation markdown, je l'ai sortie en markdown, puis j'ai converti le markdown en HTML, puis en PDF. (Compliqué) J'ai utilisé «Beautiful Soup» pour gratter, mais je vais l'omettre cette fois. Il n'y avait pas beaucoup d'informations sur Markdown → HTML → PDF, donc je l'ai résumé.

Markdown → HTML a utilisé Markdown, et HTML → PDF utilisé pdfkit.

environnement

L'environnement est le suivant.

Dans le cas d'un environnement Windows, il est nécessaire d'installer wkhtmltopdf avant d'utiliser pdfkit. Installez la version 64 bits à partir de ce site. Vous pouvez utiliser le chemin, ou vous pouvez spécifier le chemin du fichier exécutable directement dans le code Python comme nous le faisons cette fois.

Nous utilisons également Pygments pour mettre en évidence les blocs de code.

La structure des dossiers est la suivante.

   app
    |- file
    |   |- source
    |   |   └─ source.md ← Markdown original
    |└─ pdf ← Destination de sortie PDF
    |- app.py
    └─requirements.txt

Installez chaque bibliothèque.

requirements.txt


Markdown==3.2.1
pdfkit==0.6.1
Pygments==2.6.1
> pip install -r requirements.txt

La démarque qui est la source de conversion est la suivante.

source.md


#Titre

##Sous-titre

Texte de démarque.

###liste

1.Liste numérotée
    1.Liste numérotée imbriquée
1.Liste numérotée

###texte

c'est*italique*C'est une description de.
c'est**Accentuation**C'est une description de.
c'est[Lien](https://qiita.com/)C'est une description de.

###Code source

- Java

\```java

class HelloWorld {

    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

\```

- Python

\```python

class HelloWorld:
    def __init__(self, id, name):
        self.id = id
        self.name = name

if __name__=='__main__':
    hello = HelloWorld(1, 'python')

\```

###Frontière

***

---

* * *

###table

| Table Header | Table Header | Table Header |
| :-- | :--: | --: |
| Body | Body | Body |
| Left | Center | Right |


Markdown → HTML

Utilisez la bibliothèque Markdown pour convertir du markdown en HTML. Activez l'extension «codehilite» et mettez en surbrillance le code source avec «Pygments».

app.py


import markdown
from pygments import highlight
from pygments.formatters import HtmlFormatter

def mark_to_html():
    #Lire le fichier de démarque
    f = open('file/source/source.md', mode='r', encoding='UTF-8')
    with f:
        text = f.read()
        #Créer des feuilles de style pour les reflets avec Pygments
        style = HtmlFormatter(style='solarized-dark').get_style_defs('.codehilite')
        # #Markdown → Convertir le HTML
        md = markdown.Markdown(extensions=['extra', 'codehilite'])
        body = md.convert(text)
        #Ajuster au format HTML
        html = '<html lang="ja"><meta charset="utf-8"><body>'
        #Importer des feuilles de style créées avec Pygments
        html += '<style>{}</style>'.format(style)
        #Ajouter un style pour ajouter une bordure à la balise Table
        html += '''<style> table,th,td { 
            border-collapse: collapse;
            border:1px solid #333; 
            } </style>'''
        html += body + '</body></html>' 
        return html

Markdown a les extensions suivantes que vous pouvez spécifier sous forme de liste lors de la création d'un objet.

md = markdown.Markdown(extensions=["Extension"])

Seuls ceux qui peuvent être utilisés sont extraits. Pour toutes les extensions ci-dessous.

https://python-markdown.github.io/extensions/#officially-supported-extensions

Expansion une fonction
extra Convertissez la notation de démarque de base telle que les éléments d'abréviation, les listes, les blocs de code, les citations, les tableaux, etc. en HTML
admonition Une note peut être sortie
codehilite Vous pouvez ajouter les surlignages de syntaxe définis dans Pygments à vos blocs de code. Nécessite des pygments.
meta Vous pouvez obtenir les méta-informations du fichier
nl2br Code de saut de ligne<br>Convertir en tag
sane_lists Prend en charge les listes avec sauts de ligne et listes numérotées à partir de numéros spécifiés
smarty ",>Prend en charge les caractères spéciaux HTML tels que
toc Créer automatiquement une table des matières à partir de la composition des titres
wikilinks [[]]Correspond à la notation de lien dans

Vous pouvez également utiliser des extensions tierces.

https://github.com/Python-Markdown/markdown/wiki/Third-Party-Extensions

Les pygments que j'essaie de mettre en évidence dans mon code spécifient le style et les noms de classe à appliquer.

style = HtmlFormatter(style="Nom du style").get_style_defs("nom de la classe")

Les styles applicables peuvent être obtenus à partir de l'outil de ligne de commande Pygments.

> pygmentize -L styles

Le nom de la classe est affiché sous la forme <code class =" codehilite "> lorsque codehilite est activé dans markdown, alors réglez-le sur codehilite.

HTML → PDF

Il utilise une bibliothèque appelée pdfkit pour convertir du HTML en PDF. Puisque cette bibliothèque utilise wkhtmltopdf en interne, vous devez passer le chemin vers la variable d'environnement ou spécifier le chemin du fichier exécutable au moment de l'exécution.

app.py


import pdfkit

def html_to_pdf(html:str):
    """
    html : str HTML
    """
    #Spécifiez le fichier de sortie
    outputfile = 'file/pdf/output.pdf'
    #Spécifier le chemin du fichier d'exécution de wkhtmltopdf
    path_wkhtmltopdf = r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'
    config = pdfkit.configuration(wkhtmltopdf=path_wkhtmltopdf)
    #Effectuer la conversion HTML → PDF
    pdfkit.from_string(html, outputfile, configuration=config)

Cette fois, la chaîne de format MTML est convertie en fichier PDF, mais vous pouvez également convertir le site Web en PDF en spécifiant l'URL. Dans ce cas, utilisez la fonction from_url. De plus, si vous souhaitez convertir un fichier HTML en PDF, utilisez from_file.

Code source

<détails>

Code source global </ summary>

import markdown
import pdfkit
from pygments import highlight
from pygments.formatters import HtmlFormatter

def mark_to_html():
    #Lire le fichier de démarque
    f = open('file/source/source.md', mode='r', encoding='UTF-8')
    with f:
        text = f.read()
        #Créer des feuilles de style pour les reflets avec Pygments
        style = HtmlFormatter(style='solarized-dark').get_style_defs('.codehilite')
        # #Markdown → Convertir le HTML
        md = markdown.Markdown(extensions=['extra', 'codehilite'])
        body = md.convert(text)
        #Ajuster au format HTML
        html = '<html lang="ja"><meta charset="utf-8"><body>'
        #Importer des feuilles de style créées avec Pygments
        html += '<style>{}</style>'.format(style)
        #Ajouter un style pour ajouter une bordure à la balise Table
        html += '''<style> table,th,td { 
            border-collapse: collapse;
            border:1px solid #333; 
            } </style>'''
        html += body + '</body></html>' 
        return html

def html_to_pdf(html: str):
    #Spécifiez le fichier de sortie
    outputfile = 'file/pdf/output.pdf'
    #Spécifier le chemin du fichier d'exécution de wkhtmltopdf
    path_wkhtmltopdf = r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe'
    config = pdfkit.configuration(wkhtmltopdf=path_wkhtmltopdf)
    #Effectuer la conversion HTML → PDF
    pdfkit.from_string(html, outputfile, configuration=config)

if __name__=='__main__':
    html = mark_to_html()
    html_to_pdf(html)

Résultat de la conversion

Le résultat de l'exécution de la fonction ci-dessus et de sa conversion est le suivant.

output.png

Le résultat de sortie du démarquage peut être converti en PDF. Le bloc de code est également mis en évidence. Je ne l'ai pas inclus dans l'exemple cette fois, mais vous pouvez sortir l'image sans aucun problème.

Résumé

J'ai utilisé les bibliothèques Python Markdown et pdfkit pour convertir le markdown en PDF. Si vous créez un modèle, vous pouvez rapidement convertir les minutes en PDF, ce qui est pratique. J'espère que vous pourrez l'utiliser comme matériau pour améliorer l'efficacité du travail.

Recommended Posts

Convertir Markdown en PDF en Python
Convertir de Markdown en HTML en Python
Convertissez l'image au format .zip en PDF avec Python
Convertir un fichier psd en png en Python
Convertir une URL absolue en URL relative en Python
Pixelliser un PDF avec Python
Gérer le démarquage avec python
Convertir des fichiers écrits en python, etc. en pdf avec la coloration syntaxique
Convertir le fichier FBX en ASCII <-> BINARY en Python
Convertir un PDF en image (JPEG / PNG) avec Python
Convertissez des PDF en images en masse avec Python
Conversion par lots de fichiers PSD du répertoire en PDF
Convertir un float exponentiel en str en Python
Convertir le code de maillage cubique en WKT en Python
Je souhaite convertir une table convertie en PDF en Python en CSV
[python] Convertir la date en chaîne
Pour vider stdout en Python
Convertir numpy int64 en python int
[Python] Convertir la liste en Pandas [Pandas]
Connectez-vous au site Web en Python
OCR à partir de PDF en Python
Convertir le projet Scratch en Python
[Python] Convertir Shift_JIS en UTF-8
Convertir la notation CIDR en Python
Parler avec Python [synthèse vocale]
Comment développer en Python
Convertir le code python 3.x en python 2.x
Publier sur Slack en Python
Convertir la date et l'heure zonées en temps Unixtime dans Python2.7
Comment convertir / restaurer une chaîne avec [] en python
Convertir le tableau NumPy "ndarray" en lilt en Python [tolist ()]
Convertir le masque de réseau de notation CIDR en notation décimale à points en Python
[Python] Convertir le texte PDF en CSV pour chaque page (2/24 postscript)
Comment convertir des nombres à virgule flottante en nombres binaires en Python
Convertir l'API asynchrone de style callback en async / await en Python
Comment ajouter des numéros de page à un fichier PDF (en Python)
Convertir / renvoyer des objets de classe au format JSON en Python
[Python] Création d'une méthode pour convertir la base en 1 seconde
Convertir le type d'entité Webpay en type Dict (récursivement en Python)
[Python] Comment faire PCA avec Python
Convertir un PDF en documents par OCR
Convertir un PDF A4 en A3 toutes les 2 pages
Comment collecter des images en Python
Comment utiliser SQLite en Python
Workflow pour convertir une formule (image) en python
Dans la commande python, python pointe vers python3.8
Convertir la liste en DataFrame avec python
Essayez de calculer Trace en Python
Comment convertir 0,5 en 1056964608 en un seul coup
Python> liste> Convertir une double liste en une seule liste
Conversion de pdf en txt 2 [pyocr]
Comment utiliser Mysql avec python
Comment envelopper C en Python
Comment utiliser ChemSpider en Python
6 façons d'enchaîner des objets en Python
Comment utiliser PubChem avec Python
[Python] Convertit les nombres naturels en nombres ordinaux
Convertir l'image passée à Jason Stay Samlike en Python en ASCII Art
Convertir décimal en n-aire [python]
Convertir un PDF en image avec ImageMagick