Added character portraits from @vincentmalloy.

Merge https://github.com/canismarko/dungeon-sheets/pull/100
This commit is contained in:
Mark Wolfman
2021-07-21 17:18:31 -05:00
parent ee7d5de601
commit 5183a6301d
10 changed files with 73 additions and 13 deletions
+49 -10
View File
@@ -2,9 +2,11 @@ import os
import subprocess
import logging
import warnings
import io
import pdfrw
from fdfgen import forge_fdf
from reportlab.pdfgen import canvas
from dungeonsheets.forms import mod_str
@@ -175,10 +177,10 @@ def create_character_pdf_template(character, basename, flatten=False):
# Prepare the actual PDF
dirname = os.path.join(os.path.dirname(os.path.abspath(__file__)), "forms/")
src_pdf = os.path.join(dirname, "blank-character-sheet-default.pdf")
return make_pdf(fields, src_pdf=src_pdf, basename=basename, flatten=flatten)
return make_pdf(fields, src_pdf=src_pdf, basename=basename, flatten=flatten, portrait="")
def create_personality_pdf_template(character, basename, flatten=False):
def create_personality_pdf_template(character, basename, portrait_file="", flatten=False):
# Prepare the list of fields
fields = {
"CharacterName 2": character.name,
@@ -199,7 +201,7 @@ def create_personality_pdf_template(character, basename, flatten=False):
# Prepare the actual PDF
dirname = os.path.join(os.path.dirname(os.path.abspath(__file__)), "forms/")
src_pdf = os.path.join(dirname, "blank-personality-sheet-default.pdf")
return make_pdf(fields, src_pdf=src_pdf, basename=basename, flatten=flatten)
return make_pdf(fields, src_pdf=src_pdf, basename=basename, flatten=flatten, portrait=portrait_file)
def create_spells_pdf_template(character, basename, flatten=False):
@@ -484,10 +486,10 @@ def create_spells_pdf_template(character, basename, flatten=False):
# Make the actual pdf
dirname = os.path.join(os.path.dirname(os.path.abspath(__file__)), "forms/")
src_pdf = os.path.join(dirname, "blank-spell-sheet-default.pdf")
make_pdf(fields, src_pdf=src_pdf, basename=basename, flatten=flatten)
make_pdf(fields, src_pdf=src_pdf, basename=basename, flatten=flatten, portrait="")
def make_pdf(fields: dict, src_pdf: str, basename: str, flatten: bool = False):
def make_pdf(fields: dict, src_pdf: str, basename: str, flatten: bool = False, portrait = ""):
"""Create a new PDF by applying fields to a src PDF document.
Parameters
@@ -506,17 +508,17 @@ def make_pdf(fields: dict, src_pdf: str, basename: str, flatten: bool = False):
"""
try:
_make_pdf_pdftk(fields, src_pdf, basename, flatten)
_make_pdf_pdftk(fields, src_pdf, basename, flatten, portrait)
except FileNotFoundError:
# pdftk could not run, so alert the user and use pdfrw
warnings.warn(
f"Could not run `{PDFTK_CMD}`, using fallback; forcing `--editable`.",
RuntimeWarning,
)
_make_pdf_pdfrw(fields, src_pdf, basename, flatten)
_make_pdf_pdfrw(fields, src_pdf, basename, flatten, portrait)
def _make_pdf_pdfrw(fields: dict, src_pdf: str, basename: str, flatten: bool = False):
def _make_pdf_pdfrw(fields: dict, src_pdf: str, basename: str, flatten: bool = False, portrait = ""):
"""Backup make_pdf function in case pdftk is not available."""
template = pdfrw.PdfReader(src_pdf)
# Different types of PDF fields
@@ -575,7 +577,7 @@ def _make_pdf_pdfrw(fields: dict, src_pdf: str, basename: str, flatten: bool = F
pdfrw.PdfWriter().write(f"{basename}.pdf", template)
def _make_pdf_pdftk(fields, src_pdf, basename, flatten=False):
def _make_pdf_pdftk(fields, src_pdf, basename, flatten=False, portrait=""):
"""More robust way to make a PDF, but has a hard dependency."""
# Create the actual FDF file
fdfname = basename + ".fdf"
@@ -585,7 +587,12 @@ def _make_pdf_pdftk(fields, src_pdf, basename, flatten=False):
fdf_file.write(fdf)
fdf_file.close()
# Build the final flattened PDF documents
dest_pdf = basename + ".pdf"
if portrait != "":
dest_pdf = basename + "-temp.pdf"
image_pdf = basename + "_image_tmp.pdf"
make_image_pdf(portrait, image_pdf)
else:
dest_pdf = basename + ".pdf"
popenargs = [
PDFTK_CMD,
src_pdf,
@@ -597,5 +604,37 @@ def _make_pdf_pdftk(fields, src_pdf, basename, flatten=False):
if flatten:
popenargs.append("flatten")
subprocess.call(popenargs)
# stamp with image
if portrait != "":
src_pdf = dest_pdf
stamped_pdf = basename + ".pdf"
popenargs = [
PDFTK_CMD,
src_pdf,
"stamp",
image_pdf,
"output",
stamped_pdf,
]
popenargs.append("flatten")
subprocess.call(popenargs)
# Clean up
os.remove(image_pdf)
os.remove(dest_pdf)
# Clean up temporary files
os.remove(fdfname)
def make_image_pdf(src_img:str, dest_pdf:str):
packet = io.BytesIO()
can = canvas.Canvas(packet)
x_start = 10
y_start = 240
can.drawImage(src_img, x_start, y_start, width=175, preserveAspectRatio=True, mask='auto')
can.showPage()
can.save()
#move to the beginning of the StringIO buffer
packet.seek(0)
new_pdf = pdfrw.PdfReader(packet)
pdfrw.PdfWriter().write(dest_pdf, new_pdf)