web-dev-qa-db-fra.com

Exporter Pandas DataFrame dans un fichier PDF en utilisant Python

Quel est un moyen efficace de générer PDF pour les trames de données dans Pandas?

14
b8con

Eh bien, une façon consiste à utiliser le démarque. Vous pouvez utiliser df.to_html(). Cela convertit la trame de données en une table html. De là, vous pouvez mettre le code HTML généré dans un fichier de démarque (.md) (voir http://daringfireball.net/projects/markdown/basics ). De là, il existe des utilitaires pour convertir le markdown en pdf ( https://www.npmjs.com/package/markdown-pdf ).

Un outil tout-en-un pour cette méthode consiste à utiliser Atom éditeur de texte ( https://atom.io/ ). Là, vous pouvez utiliser une extension, recherchez "markdown to pdf", qui fera la conversion pour vous.

Remarque: Lors de l'utilisation de to_html() récemment, j'ai dû supprimer des caractères '\ n' supplémentaires pour une raison quelconque. J'ai choisi d'utiliser Atom -> Find -> '\n' -> Replace "".

Dans l'ensemble, cela devrait faire l'affaire!

3
wgwz

Voici comment je le fais à partir de la base de données sqlite en utilisant sqlite3, pandas and pdfkit

import pandas as pd
import pdfkit as pdf
import sqlite3

con=sqlite3.connect("baza.db")

df=pd.read_sql_query("select * from dobit", con)
df.to_html('/home/linux/izvestaj.html')
nazivFajla='/home/linux/pdfPrintOut.pdf'
pdf.from_file('/home/linux/izvestaj.html', nazivFajla)
4
Dalibor

Première table de traçage avec matplotlib puis générer un pdf

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages

df = pd.DataFrame(np.random.random((10,3)), columns = ("col 1", "col 2", "col 3"))

#https://stackoverflow.com/questions/32137396/how-do-i-plot-only-a-table-in-matplotlib
fig, ax =plt.subplots(figsize=(12,4))
ax.axis('tight')
ax.axis('off')
the_table = ax.table(cellText=df.values,colLabels=df.columns,loc='center')

#https://stackoverflow.com/questions/4042192/reduce-left-and-right-margins-in-matplotlib-plot
pp = PdfPages("foo.pdf")
pp.savefig(fig, bbox_inches='tight')
pp.close()

référence:

Comment puis-je tracer uniquement une table dans Matplotlib?

Réduire les marges gauche et droite dans le graphique matplotlib

2
user3226167

Il s'agit d'une solution avec un fichier pdf intermédiaire.

Le tableau est assez imprimé avec un peu de CSS.

La conversion pdf se fait avec weasyprint. Tu dois pip install weasyprint.

# Create a pandas dataframe with demo data:
import pandas as pd
demodata_csv = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv'
df = pd.read_csv(demodata_csv)

# Pretty print the dataframe as an html table to a file
intermediate_html = '/tmp/intermediate.html'
to_html_pretty(df,intermediate_html,'Iris Data')
# if you do not want pretty printing, just use pandas:
# df.to_html(intermediate_html)

# Convert the html file to a pdf file using weasyprint
import weasyprint
out_pdf= '/tmp/demo.pdf'
weasyprint.HTML(intermediate_html).write_pdf(out_pdf)

# This is the table pretty printer used above:

def to_html_pretty(df, filename='/tmp/out.html', title=''):
    '''
    Write an entire dataframe to an HTML file
    with Nice formatting.
    Thanks to @stackoverflowuser2010 for the
    pretty printer see https://stackoverflow.com/a/47723330/362951
    '''
    ht = ''
    if title != '':
        ht += '<h2> %s </h2>\n' % title
    ht += df.to_html(classes='wide', escape=False)

    with open(filename, 'w') as f:
         f.write(HTML_TEMPLATE1 + ht + HTML_TEMPLATE2)

HTML_TEMPLATE1 = '''
<html>
<head>
<style>
  h2 {
    text-align: center;
    font-family: Helvetica, Arial, sans-serif;
  }
  table { 
    margin-left: auto;
    margin-right: auto;
  }
  table, th, td {
    border: 1px solid black;
    border-collapse: collapse;
  }
  th, td {
    padding: 5px;
    text-align: center;
    font-family: Helvetica, Arial, sans-serif;
    font-size: 90%;
  }
  table tbody tr:hover {
    background-color: #dddddd;
  }
  .wide {
    width: 90%; 
  }
</style>
</head>
<body>
'''

HTML_TEMPLATE2 = '''
</body>
</html>
'''

Merci à @ stackoverflowuser2010 pour la jolie imprimante, voir la réponse de stackoverflowuser2010 https://stackoverflow.com/a/47723330/362951

Je n'ai pas utilisé pdfkit, car j'ai eu quelques problèmes avec celui-ci sur une machine sans tête. Mais weasyprint est génial.

1
mit