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:
+17
-5
@@ -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}")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user