Add duplex PDF build targets with pdftk page interleaving

- Add pdftk-java to Docker image for PDF page manipulation
- Extend generate_backside() to repeat back content num_pages times so
  front and back PDFs have matching page counts for pdftk shuffle
- Add build-duplex and build-blanko-duplex Makefile targets that combine
  front and back PDFs with alternating pages (front1, back1, front2, back2)
- Document duplex targets in README

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Peter Adam
2026-05-05 16:16:20 +02:00
parent f811c3fd80
commit ca995a1c1f
4 changed files with 51 additions and 7 deletions
+17 -5
View File
@@ -59,7 +59,7 @@ def apply_event_placeholders(text, config):
return text
def generate_backside(template, config):
def generate_backside(template, config, num_pages=1):
"""Fill back side template with cell content from event config."""
cells = config.get('backside', {})
result = template
@@ -71,7 +71,18 @@ def generate_backside(template, config):
if content is None:
content = ""
result = result.replace(placeholder, content.strip())
return result
if num_pages <= 1:
return result
# Repeat body between \begin{document} and \end{document} num_pages times
begin_marker = '\\begin{document}\n'
end_marker = '\\end{document}'
begin_idx = result.find(begin_marker) + len(begin_marker)
end_idx = result.rfind(end_marker)
preamble = result[:begin_idx]
body = result[begin_idx:end_idx].rstrip()
return preamble + ('\n\n\\newpage\n\n').join([body] * num_pages) + '\n' + result[end_idx:]
def generate_card_from_template(template, data):
@@ -142,7 +153,7 @@ def main():
blanko_output_file.write_text(blanko_output, encoding='utf-8')
print(f"Generated {blanko_output_file}")
backside_template = backside_template_file.read_text(encoding='utf-8')
backside_output = generate_backside(backside_template, event_config)
backside_output = generate_backside(backside_template, event_config, num_pages=1)
backside_output_file.write_text(backside_output, encoding='utf-8')
print(f"Generated {backside_output_file}")
return
@@ -179,10 +190,11 @@ def main():
output_file.write_text(''.join(document_parts), encoding='utf-8')
print(f"Generated {output_file}")
# Generate personalized back side
# Generate personalized back side (one page per front page for duplex)
num_pages = (len(participants) + 1) // 2
print(f"Reading back side template from {backside_template_file}...")
backside_template = backside_template_file.read_text(encoding='utf-8')
backside_output = generate_backside(backside_template, event_config)
backside_output = generate_backside(backside_template, event_config, num_pages=num_pages)
backside_output_file.write_text(backside_output, encoding='utf-8')
print(f"Generated {backside_output_file}")