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
.
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 |
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
.
<détails> Le résultat de l'exécution de la fonction ci-dessus et de sa conversion est le suivant. 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. J'ai utilisé les bibliothèques Python
Recommended Posts
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
Résumé
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.