PDF Erstellung mit Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Thomas_Lindinger
User
Beiträge: 5
Registriert: Montag 23. Juli 2018, 12:23

Ich habe ein Python Programm geschrieben welches mir immer die aktuellen Daten aus verschiedenen Listen liefert.

Nun möchte ich dies gut formatiert in ein PDF darstellen. Wo auch fixe Texte enthalten sein sollen zu genaueren Erklärung die sich aber nicht ändern werden, ebenfalls müsste auch Tabellen erstellbar sein. ich habe jetzt schon viel im Internet gesucht bin leider nicht richtig fündig geworden.

Welches Tool bzw. Python Plugin würdet ihr empfehlen und gibt es dafür auch eine gute Anleitung bzw Tutorial.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`reportlab` oder LaTeX sind da glaube ich die beiden üblichen Antworten für.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ReportLab ist der de-facto Standard zum Bauen von PDF. ReportLab ist recht mächtig, mit Platypus hast du auch eine High-Level Möglichkeit, PDFs zu bauen.

Falls du LeTeX kannst das manuellen Bauen ein LeTeX Dokument ggf. über eine Template-Engine, sicher auch eine Möglichkeit.

Ich selber nutze ReportLab, mit ein bisschen Einarbeitung ist das ganz gut zu handhaben.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Es gäbe da noch die Report Markup Language (RML) für Reportlab, entweder kommerziell direkt von Reportlab, oder als alternative Implementierung: https://github.com/zopefoundation/z3c.rml
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Thomas_Lindinger
User
Beiträge: 5
Registriert: Montag 23. Juli 2018, 12:23

Gibt es eine gute Anleitung für Platypus weil habe ich habe es mal mit Canvas befehlen und drawString versucht. Aber da ich nicht weis wie lang die Texte sind hatte ich immer Probleme mit den Zeilen Umbrüchen da er über die Seite hinaus geschrieben hatte.

In Latex habe ich mein Dokument bis jetzt immer Manuel erstellt, wo ich die werte aus den Tabellen Manuel übertagen hatte. Dies wollte ich automatisieren, leider ändert sich immer die Anzahl der ganzen Werte und ich habe keine gute Möglichkeit gefunden mein Latex Dokument über Python zu füllen. Bei der installation von PythonTex bin ich nicht wirklich vorwärts gekommen.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Zum Füllen von LaTex-Dokumenten kannst Du eine beliebige Template-Engine benutzen, weil es sich ja nur um Text-Dateien handelt. Zeig doch einfach, was Du versucht hast, dann kann man da sicher einfach helfen.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Gibt es eine gute Anleitung für Platypus weil habe ich habe es mal mit Canvas befehlen und drawString versucht.
Diesen Weg willst du eigentlich auch nicht nutzen, weil zu low-level. Wie gesagt, nutz' Platypus aus ReportLab, das kümmert sich automatisch um Zeilenumbrüche, Abstände zwischen Absätzen, Seitenumbrüche etc. Die Nutzung ist in der ReportLab Doku erklärt.

Gruß, noisefloor
Thomas_Lindinger
User
Beiträge: 5
Registriert: Montag 23. Juli 2018, 12:23

Sirius3 hat geschrieben: Dienstag 24. Juli 2018, 07:56 Zum Füllen von LaTex-Dokumenten kannst Du eine beliebige Template-Engine benutzen, weil es sich ja nur um Text-Dateien handelt. Zeig doch einfach, was Du versucht hast, dann kann man da sicher einfach helfen.
Also dies ist mein Latex File was ich mal angelegt hatte. Die Items welche ich noch eintragen muss habe ich in einer Liste die ich mit python erstellt habe. Als kurzes beispiel ich habe den einen monat mal 10 dann auch mal 50 kunden diese sollen dann alle in der \section{Customers} aufgeführt sein usw.

\documentclass[11pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}

\begin{document}{%%ReqID}
\title{Customers and order situation}
\maketitle
\tableofcontents
\newpage

\section{Introduction}
What is required?

\section{Customers}
Lists of all relevant Costomers for this month. Required information:
\begin{itemize}
\item ID :
\item prename:
\item name:
\item order type:
\item LAST ACTIVITY:
\end{itemize}


\section{Ordes}
Lists of all relevant orders for this month.
\begin{itemize}
\item Order ID:
\item Order Description:
\item Costomer:
\item executor:
\end{itemize}


\section{Traceability}

\\\\
\begin{tabular}{|c|c|c|}
excecutor & Order ID & occupancy \\
\hline
exec1 & OrID & occ \\
exec1 & OrID & Occ \\
\end{tabular}
\\\\

\end{document}
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann machst Du Dir einfach eine Schleife, in der Du jeweils einen \begin{itemize}...\end{itemize} -Block ausgibst.
Thomas_Lindinger
User
Beiträge: 5
Registriert: Montag 23. Juli 2018, 12:23

Sirius3 hat geschrieben: Dienstag 24. Juli 2018, 13:15 Dann machst Du Dir einfach eine Schleife, in der Du jeweils einen \begin{itemize}...\end{itemize} -Block ausgibst.
Das habe ich mir schon so vorgestellt aber dies ist ja rein Latex und wie kann ich dies dort einfach machen.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Nimm eine Template Engine. Die liefert immer Text aus. Ob das jetzt html oder latex ist, ist unerheblich. Vielleicht möchtest Du Dir mal Jinja2 anschauen (oder Mako, um auch eine Alternative zu nennen).
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Thomas_Lindinger: Das Stichwort Template-Engine wurde ja schon erwähnt. Ich persönlich mag Jinja2. Da müsste man die Begrenzer ändern weil die Voreinstellung für LaTeX etwas ungünstig ist. :-)

Ich habe es selbst noch nicht verwendet, aber das `latex`-Package sieht vielversprechend aus: https://pypi.org/project/latex/
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mit Jinja2 und dem `latex`-Package könnte das dann beispielsweise so aussehen:

Code: Alles auswählen

\documentclass[11pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}

\begin{document}{%%ReqID}
\title{Customers and order situation}
\maketitle
\tableofcontents
\newpage

\section{Introduction}
What is required?

\section{Customers}
Lists of all relevant customers for this month. Required information:
\begin{itemize}
    %- for customer in customers
        \item ID: \VAR{customer.id}
        \item prename: \VAR{customer.prename}
        \item name: \VAR{customer.name}
        \item order type: \VAR{customer.order_type}
        \item LAST ACTIVITY: \VAR{customer.last_activity}
    %- endfor
\end{itemize}


\section{Orders}
Lists of all relevant orders for this month.
\begin{itemize}
    %- for order in orders
        \item Order ID: \VAR{order.id}
        \item Order Description: \VAR{order.description}
        \item Customer: \VAR{order.customer}
        \item Executor: \VAR{order.executor}
    %- endfor
\end{itemize}


\section{Traceability}

\\\\
\begin{tabular}{|c|c|c|}
excecutor & Order ID & occupancy \\
\hline
%- for spam in things_that_need_better_names
    \VAR{spam.executor} & \VAR{spam.order_id} & \VAR{spam.occupancy} \\
    %# Oder alternativ wenn die `spam`-Objekte die `order`-Objekte aus
    %# dem Orders-Abschnitt als Attribute haben:
    \VAR{spam.executor} & \VAR{spam.order.id} & \VAR{spam.occupancy} \\
%- endfor
\end{tabular}
\\\\

\end{document}
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

Minibeispiel mit ReportLab:

Code: Alles auswählen

from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Paragraph,Table, \
    ListFlowable, ListItem, Spacer, TableStyle
from reportlab.lib import colors
    
all_data = [[1, 'foo', 'mail'], [2, 'bar', 'online']]

doc = SimpleDocTemplate('test.pdf')
styles = getSampleStyleSheet()
story = []
story.append(Paragraph('ein bisschen Einleitungstext', styles['Normal']))
for data in all_data:
    list_elements = []
    for item in data:
        list_elements.append(ListItem(Paragraph(str(item),
                                                styles['Normal']),
                                                leftIndent=25))
    story.append(ListFlowable(list_elements,
                              bulletType='bullet',
                              start='·',
                              leftIndent=10))
    story.append(Spacer(10, 10))
table = Table(all_data)
table.setStyle((TableStyle([('BOX',( 0,0), (-1,-1), 0.5, colors.black),
                            ('INNERGRID', (0,0), (-1,-1), 0.5, colors.black)])))
story.append(table)
doc.build(story)
Gruß, noisefloor
LisaM
User
Beiträge: 5
Registriert: Sonntag 8. November 2020, 19:02

Hallo zusammen,

ich hefte mich mal an diesen Thread.

Verzweifelt versuche ich pythontex in LaTeX zu verwenden.
Habe auch schon das Paket pythontex in MikTex installiert.
Dennoch funktioniert es in TexMaker nicht und \usepackage{pythontex} wir rot unterstrichen.

Über einen hilfreichen Ratschlag würde ich mich sehr freuen.

Für Windows 10 64
Antworten