eptm_dashboard/.venv/lib/python3.12/site-packages/pypdfium2_cli/tile.py

83 lines
2.2 KiB
Python

# SPDX-FileCopyrightText: 2026 geisserml <geisserml@gmail.com>
# SPDX-License-Identifier: Apache-2.0 OR BSD-3-Clause
from enum import Enum
from pathlib import Path
import pypdfium2.raw as pdfium_c
import pypdfium2._helpers as pdfium
from pypdfium2_cli._parsers import add_input, get_input
class Units (Enum):
PT = 0
MM = 1
CM = 2
IN = 3
def units_to_pt(value, unit):
if unit is Units.PT:
return value
elif unit is Units.IN:
return value*72
elif unit is Units.CM:
return (value*72) / 2.54
elif unit is Units.MM:
return (value*72) / 25.4
else:
raise ValueError(f"Invalid unit type {unit}")
def attach(parser):
add_input(parser, pages=False)
parser.add_argument(
"--output", "-o",
required = True,
type = Path,
help = "Target path for the new document",
)
parser.add_argument(
"--rows", "-r",
type = int,
required = True,
help = "Number of rows (horizontal tiles)",
)
parser.add_argument(
"--cols", "-c",
type = int,
required = True,
help = "Number of columns (vertical tiles)",
)
# NOTE no short aliases for width and height since -h would conflict with argparse help
parser.add_argument(
"--width",
type = float,
required = True,
help = "Target width",
)
parser.add_argument(
"--height",
type = float,
required = True,
help = "Target height",
)
parser.add_argument(
"--unit", "-u",
default = Units.MM,
type = lambda string: Units[string.upper()],
help = "Unit for target width and height (pt, mm, cm, in)",
)
def main(args):
# Rudimentary page tiling, powered by pdfium
# A more sophisticated implementation could place XObjects rather than using PDFium's helper function, support merging and arranging on the fly, etc.
w = units_to_pt(args.width, args.unit)
h = units_to_pt(args.height, args.unit)
src_pdf = get_input(args)
raw_dest = pdfium_c.FPDF_ImportNPagesToOne(src_pdf, w, h, args.cols, args.rows)
dest_pdf = pdfium.PdfDocument(raw_dest)
dest_pdf.save(args.output)