You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.3 KiB
52 lines
1.3 KiB
import os
|
|
import asyncio
|
|
import tempfile
|
|
from pyppeteer import launch
|
|
|
|
|
|
def sync_wait(future):
|
|
loop = asyncio.get_event_loop()
|
|
return loop.run_until_complete(future)
|
|
|
|
|
|
def render_from_url(url, out=None):
|
|
if out is None:
|
|
out = "out.pdf"
|
|
out = os.path.join(os.getcwd(), out)
|
|
|
|
browser = sync_wait(launch())
|
|
page = sync_wait(browser.newPage())
|
|
sync_wait(page.goto(url))
|
|
sync_wait(page.pdf({
|
|
"displayHeaderFooter":False,
|
|
"printBackground": True,
|
|
"path": out,
|
|
"preferCSSPageSize": True,
|
|
}))
|
|
sync_wait(browser.close())
|
|
|
|
|
|
def render_from_file(s, out=None):
|
|
if s[0] != "/":
|
|
s = os.path.join(os.getcwd(), s)
|
|
f = 'file://' + s
|
|
render_from_url(f, out=out)
|
|
|
|
|
|
def render_from_string(s, out=None):
|
|
temp = tempfile.NamedTemporaryFile(suffix=".html", mode="w")
|
|
temp.write(s)
|
|
temp.flush()
|
|
render_from_file(temp.name, out=out)
|
|
temp.close()
|
|
|
|
|
|
def main():
|
|
import sys
|
|
import argparse
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("input", help="Input HTML file.")
|
|
parser.add_argument("-o", "--output", help="Output filename.", default="out.pdf")
|
|
args = parser.parse_args()
|
|
render_from_file(args.input, args.output)
|
|
print(f"{args.input} rendered into {args.output}")
|
|
|