A tool to create quickly a pdf, through html, with python and pdfkit. It’s a work in progress and this is the code until now.
import tkinter as tk
import pdfkit
import os
def html_to_pdf(input, output, type='string'):
"""Convert HTML/webpage to PDF. For linux, install: sudo apt-get install wkhtmltopdf.
Args:
input (str): HTML Text, URL or file.
output (str): Output file (.pdf).
type (str): Types can be 'string', 'url' or 'file'.
"""
if type == 'url':
pdfkit.from_url(input, output)
elif type == 'file':
pdfkit.from_file(input, output)
else:
pdfkit.from_string(input, output)
def style():
s = """
<style>
body {
padding:20;
margin:20px;
color: white;
background: black;
font-size: 2em;
}</style>"""
return s
def pdf():
options = {
'page-size': 'Letter',
'margin-top': '0.0in',
'margin-right': '0.0in',
'margin-bottom': '0.0in',
'margin-left': '0.0in',
'encoding': "UTF-8",
'custom-header': [
('Accept-Encoding', 'gzip')
],
'cookie': [
('cookie-name1', 'cookie-value1'),
('cookie-name2', 'cookie-value2'),
],
'outline-depth': 10,
}
x = "my.pdf"
content = txbx.get("0.0", tk.END)
content = style() + content
pdfkit.from_string(content, x, options=options)
print("pdf created")
os.startfile("my.pdf")
class MyDialog:
def __init__(self, parent, tag):
self.tag = tag
top = self.top = tk.Toplevel(parent)
l = tk.Label(top, text="Value")
l.pack()
self.e = tk.Entry(top, width=90)
self.e.pack(padx=5)
self.e.focus()
self.e.bind("<Return>", lambda x: self.ok())
b = tk.Button(top, text="OK", command=self.ok)
b.pack(pady=5)
def ok(self):
print("value is", self.e.get())
txbx.insert(tk.END, f"<{self.tag}>{self.e.get()}</{self.tag}>\n")
self.top.destroy()
root = tk.Tk()
root.title("Pdf generator 0.2 wip")
# WIDGETS: text box => Text class of tkinter (tk)
label = tk.Label(root, text="CTRL + b to make a page (use also html)")
label.pack()
txbx = tk.Text(root, height=20, insertbackground="white")
txbx['font'] = "Arial 14"
txbx['bg'] = "black"
txbx['fg'] = "white"
txbx['borderwidth'] = 2
txbx.pack(fill=tk.BOTH, expand=1)
txbx.focus()
txbx.bind("<Control-b>", lambda x: pdf())
txbx.bind("<Control-h>", lambda x: add_tag("h1"))
txbx.bind("<Control-p>", lambda x: add_tag("p"))
def add_tag(tag):
if tag == "br":
txbx.insert(tk.END, "<br>")
elif tag == "img":
txbx.insert(tk.END, "<img src='' />")
else:
MyDialog(root, tag)
menu = tk.Menu()
menu.add_command(label="<H1>", command=lambda: add_tag("h1"))
menu.add_command(label="<P>", command=lambda: add_tag("p"))
menu.add_command(label="<br>", command=lambda: add_tag("br"))
menu.add_command(label="<img>", command=lambda: add_tag("img"))
menu.add_command(label="PDF", command=pdf)
root.configure(menu=menu)
root.mainloop()
Video
Subscribe to the newsletter for updates
Tkinter templatesTwitter: @pythonprogrammi - python_pygame
Claude's Games
1. Memory gameVideos
Speech recognition gamePygame's Platform Game