mirror of
https://github.com/Threnklyn/dungeon-sheets.git
synced 2026-06-05 20:38:26 +02:00
Added character portraits from @vincentmalloy.
Merge https://github.com/canismarko/dungeon-sheets/pull/100
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user