import tempfile
import pathlib
import subprocess
import datetime
import requests
import pylatex
def get_comic():
print("Downloading metadata...")
r = requests.get("https://xkcd.com/info.0.json")
r.raise_for_status()
data = r.json()
print("Downloading comic...")
r = requests.get(data['img'])
r.raise_for_status()
return r.content, data
def write_pdf(title, alt, num, date, tmpdir, imgfile):
print("Writing PDF...")
geometry_options = {
"head": "40pt",
"margin": "0.5in",
"bottom": "0.6in",
"includeheadfoot": True
}
doc = pylatex.Document(default_filepath=str(tmpdir / 'xkcd'),
geometry_options=geometry_options)
for pkg in ['cmbright', 'caption']:
doc.packages.append(pylatex.Package(pkg))
doc.preamble.append(pylatex.Command('captionsetup', 'labelformat=empty'))
doc.preamble.append(pylatex.Command('title', title))
doc.preamble.append(pylatex.Command('author', f"https://xkcd.com/{num}/"))
doc.preamble.append(pylatex.Command('date', date.strftime('%Y-%m-%d')))
doc.append(pylatex.NoEscape(r'\maketitle'))
doc.append(pylatex.Command('thispagestyle', 'empty'))
with doc.create(pylatex.Figure(position='h!')) as img:
img.add_image(str(imgfile))
img.add_caption(alt)
doc.generate_pdf()
def print_pdf(filename):
print("Printing PDF...")
subprocess.run(['lpr', '-P', 'HSR_HP_Color_LaserJet_M651', str(filename)])
def main():
img, data = get_comic()
with tempfile.TemporaryDirectory() as tmpdir:
tmpdir = pathlib.Path(tmpdir)
imgfile = tmpdir / 'xkcd.png'
imgfile.write_bytes(img)
date = datetime.date(year=int(data['year']),
month=int(data['month']),
day=int(data['day']))
write_pdf(title=data['title'], alt=data['alt'], num=data['num'],
date=date, tmpdir=tmpdir, imgfile=imgfile)
print_pdf(tmpdir / 'xkcd.pdf')
if __name__ == '__main__':
main()
{"text":"text","html5":"html","css":"css","javascript":"javascript","php":"php","python":"python","ruby":"ruby","lua":"lua","bash":"sh","erlang":"erlang","go":"golang","c":"c_cpp","cpp":"c_cpp","diff":"diff","latex":"latex","sql":"sql","xml":"xml","0":"text","abap":"abap","actionscript":"actionscript","actionscript3":"actionscript","ada":"ada","apache":"apache_conf","applescript":"applescript","asm":"assembly_x86","autohotkey":"autohotkey","closure":"closure","cobol":"cobol","coffeescript":"coffee","cpp-winapi":"c_cpp","c_loadrunner":"c_cpp","c_mac":"c_cpp","c_winapi":"c_cpp","csharp":"csharp","d":"d","dart":"dart","dot":"dot","eiffel":"eiffel","fortran":"fortran","groovy":"groovy","haskell":"haskell","haxe":"haxe","ini":"ini","io":"io","java":"java","java5":"java","make":"makefile","matlab":"matlab","mysql":"mysql","objc":"objectivec","ocaml":"ocaml","pascal":"pascal","perl":"perl","perl6":"perl","postgresql":"pgsql","powershell":"powershell","prolog":"prolog","properties":"properties","rails":"ruby","rust":"rust","scala":"scala","scheme":"scheme","smarty":"smarty","tcl":"tcl","vala":"vala","vb":"vbscript","verilog":"verilog","vhdl":"vhdl","yaml":"yaml"}