Skip to content

Commit 0aa497c

Browse files
Add proper bates numbers support to ALExhibitDocument
Passes along all of the bates parameters through all of the exhibit document classes (ALExhibitDocument, ALExhibitList, ALExhibit).
1 parent 4c0a079 commit 0aa497c

File tree

2 files changed

+82
-8
lines changed

2 files changed

+82
-8
lines changed

docassemble/AssemblyLine/al_document.py

Lines changed: 81 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2770,9 +2770,14 @@ def as_pdf(
27702770
self,
27712771
*,
27722772
refresh: bool = False,
2773-
prefix: str = "",
27742773
pdfa: bool = False,
27752774
add_page_numbers: bool = True,
2775+
page_number_prefix: str = "",
2776+
page_number_digits: int = 5,
2777+
page_number_area=None,
2778+
page_number_font_size: float = 10,
2779+
page_number_offset_horizontal: float = 15,
2780+
page_number_offset_vertical: float = 15,
27762781
add_cover_page: bool = True,
27772782
filename: Optional[str] = None,
27782783
append_matching_suffix: bool = True,
@@ -2784,9 +2789,14 @@ def as_pdf(
27842789
27852790
Args:
27862791
refresh (bool): If True, forces the exhibit to refresh before generating the PDF. (unused, provided for signature compatibility)
2787-
prefix (str): Prefix for Bates numbering if 'add_page_numbers' is True.
27882792
pdfa (bool): If True, the generated PDF will be in PDF/A format.
27892793
add_page_numbers (bool): If True, apply Bates numbering starting from 'self.start_page'.
2794+
page_number_prefix (str): If add_page_numbers is True, this gets added to the beginning on the bates number each page (e.g. `EX-`).
2795+
page_number_digits (int): How many digits (i.e. leading 0s) that the bates number will have
2796+
page_number_area (str): Where on the page the bates number will go ("TOP_LEFT", "TOP_RIGHT", "BOTTOM_LEFT", "BOTTOM_RIGHT" (default))
2797+
page_number_font_size (float): How big the bates page number will be in points (default is 10).
2798+
page_number_offset_horizontal (float): The number of pixels that the bates page number is offset from the left / right of the page.
2799+
page_number_offset_vertical (float): The number of pixels that the bates page number is offset from the top / bottom of the page.
27902800
add_cover_page (bool): If True, prepend the exhibit with a cover page.
27912801
filename (Optional[str]): Custom filename for the generated PDF. Default is "exhibits.pdf".
27922802
append_matching_suffix (bool): If True, appends a suffix to the filename based on certain matching criteria.
@@ -2814,7 +2824,15 @@ def as_pdf(
28142824
)
28152825

28162826
if add_page_numbers:
2817-
concatenated_pages.bates_number(prefix=prefix, start=self.start_page)
2827+
concatenated_pages.bates_number(
2828+
start=self.start_page,
2829+
prefix=page_number_prefix,
2830+
digits=page_number_digits,
2831+
area=page_number_area,
2832+
font_size=page_number_font_size,
2833+
offset_horizontal=page_number_offset_horizontal,
2834+
offset_vertical=page_number_offset_vertical,
2835+
)
28182836

28192837
setattr(self._cache, safe_key, concatenated_pages)
28202838
return getattr(self._cache, safe_key)
@@ -2948,6 +2966,12 @@ def as_pdf(
29482966
filename="file.pdf",
29492967
pdfa: bool = False,
29502968
add_page_numbers: bool = False,
2969+
page_number_prefix: str = "",
2970+
page_number_digits: int = 5,
2971+
page_number_area=None,
2972+
page_number_font_size: float = 10,
2973+
page_number_offset_horizontal: float = 15,
2974+
page_number_offset_vertical: float = 15,
29512975
toc_pages: int = 0,
29522976
append_matching_suffix: bool = True,
29532977
) -> DAFile:
@@ -2958,6 +2982,12 @@ def as_pdf(
29582982
filename (str): Desired filename for the generated PDF.
29592983
pdfa (bool): If True, generates the PDF in PDF/A format.
29602984
add_page_numbers (bool): If True, adds page numbers to the generated PDF.
2985+
page_number_prefix (str): What the bates number added to each page should start with (e.g. `EX-`).
2986+
page_number_digits (int): How many digits (i.e. leading 0s) that the bates number will have
2987+
page_number_area (str): Where on the page the bates number will go ("TOP_LEFT", "TOP_RIGHT", "BOTTOM_LEFT", "BOTTOM_RIGHT" (default))
2988+
page_number_font_size (float): How big the bates page number will be in points (default is 10).
2989+
page_number_offset_horizontal (float): The number of pixels that the bates page number is offset from the left / right of the page.
2990+
page_number_offset_vertical (float): The number of pixels that the bates page number is offset from the top / bottom of the page.
29612991
toc_pages (int): Expected number of pages in the table of contents.
29622992
append_matching_suffix (bool): If True, appends matching suffix to the filename.
29632993
@@ -2969,12 +2999,19 @@ def as_pdf(
29692999
exhibit.cover_page
29703000
if self.include_table_of_contents and toc_pages != 1:
29713001
self._update_page_numbers(toc_guess_pages=toc_pages)
3002+
if not page_number_prefix and self.bates_prefix:
3003+
page_number_prefix = self.bates_prefix
29723004
return pdf_concatenate(
29733005
[
29743006
exhibit.as_pdf(
29753007
add_cover_page=self.include_exhibit_cover_pages,
29763008
add_page_numbers=add_page_numbers,
2977-
prefix=self.bates_prefix,
3009+
page_number_prefix=page_number_prefix,
3010+
page_number_digits=page_number_digits,
3011+
page_number_area=page_number_area,
3012+
page_number_font_size=page_number_font_size,
3013+
page_number_offset_horizontal=page_number_offset_horizontal,
3014+
page_number_offset_vertical=page_number_offset_vertical,
29783015
)
29793016
for exhibit in self
29803017
],
@@ -3107,12 +3144,19 @@ class ALExhibitDocument(ALDocument):
31073144
has_addendum: bool
31083145
auto_labeler: Callable
31093146
auto_ocr: bool
3147+
# Deprecated
31103148
bates_prefix: str
31113149
maximum_size: int
31123150
maximum_size_per_doc: int
31133151
suffix_to_append: str
31143152
exhibits: ALExhibitList
31153153
table_of_contents: DAFile
3154+
page_number_prefix: str
3155+
page_number_digits: int
3156+
page_number_area: str | None
3157+
page_number_font_size: float
3158+
page_number_offset_horizontal: float
3159+
page_number_offset_vertical: float
31163160

31173161
def init(self, *pargs, **kwargs) -> None:
31183162
"""Standard DAObject init method.
@@ -3127,8 +3171,6 @@ def init(self, *pargs, **kwargs) -> None:
31273171
self.exhibits.auto_labeler = self.auto_labeler
31283172
if hasattr(self, "auto_ocr"):
31293173
self.exhibits.auto_ocr = self.auto_ocr
3130-
if hasattr(self, "bates_prefix"):
3131-
self.exhibits.bates_prefix = self.bates_prefix
31323174
if hasattr(self, "include_exhibit_cover_pages"):
31333175
self.exhibits.include_exhibit_cover_pages = self.include_exhibit_cover_pages
31343176
else:
@@ -3146,13 +3188,30 @@ def init(self, *pargs, **kwargs) -> None:
31463188
else:
31473189
self.include_table_of_contents = True
31483190
self.exhibits.include_table_of_contents = True
3191+
if hasattr(self, "bates_prefix"):
3192+
self.exhibits.bates_prefix = self.bates_prefix
31493193
if not hasattr(self, "add_page_numbers"):
31503194
self.add_page_numbers = False
3195+
self._set_default_attributes()
31513196
self.has_addendum = False
31523197
if not hasattr(self, "suffix_to_append"):
31533198
# When the key is "preview", append it to the file name
31543199
self.suffix_to_append = "preview"
31553200

3201+
def _set_default_attributes(self) -> None:
3202+
if not hasattr(self, "page_number_prefix"):
3203+
self.page_number_prefix = ""
3204+
if not hasattr(self, "page_number_digits"):
3205+
self.page_number_digits = 5
3206+
if not hasattr(self, "page_number_area"):
3207+
self.page_number_area = None
3208+
if not hasattr(self, "page_number_font_size"):
3209+
self.page_number_font_size = 10
3210+
if not hasattr(self, "page_number_offset_horizontal"):
3211+
self.page_number_offset_horizontal = 15
3212+
if not hasattr(self, "page_number_offset_vertical"):
3213+
self.page_number_offset_vertical = 15
3214+
31563215
def has_overflow(self) -> bool:
31573216
"""
31583217
Check if there is any overflow in the document.
@@ -3227,19 +3286,34 @@ def as_pdf(
32273286
filename = base_name(self.filename) + ".pdf"
32283287

32293288
if len(self.exhibits):
3289+
self._set_default_attributes()
32303290
if self.include_table_of_contents:
32313291
toc_pages = self.table_of_contents.num_pages()
32323292
return pdf_concatenate(
32333293
self.table_of_contents,
32343294
self.exhibits.as_pdf(
3235-
add_page_numbers=self.add_page_numbers, toc_pages=toc_pages
3295+
add_page_numbers=self.add_page_numbers,
3296+
page_number_prefix=self.page_number_prefix,
3297+
page_number_digits=self.page_number_digits,
3298+
page_number_area=self.page_number_area,
3299+
page_number_font_size=self.page_number_font_size,
3300+
page_number_offset_horizontal=self.page_number_offset_horizontal,
3301+
page_number_offset_vertical=self.page_number_offset_vertical,
3302+
toc_pages=toc_pages,
3303+
pdfa=pdfa,
32363304
),
32373305
filename=filename,
32383306
pdfa=pdfa,
32393307
)
32403308
else:
32413309
return self.exhibits.as_pdf(
32423310
add_page_numbers=self.add_page_numbers,
3311+
page_number_prefix=self.page_number_prefix,
3312+
page_number_digits=self.page_number_digits,
3313+
page_number_area=self.page_number_area,
3314+
page_number_font_size=self.page_number_font_size,
3315+
page_number_offset_horizontal=self.page_number_offset_horizontal,
3316+
page_number_offset_vertical=self.page_number_offset_vertical,
32433317
filename=filename,
32443318
pdfa=pdfa,
32453319
)

docassemble/AssemblyLine/data/questions/test_aldocument.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ code: |
3131
---
3232
objects:
3333
# No addenda, all start enabled
34-
- multi_bundle_1: ALDocumentBundle.using(elements=[pdf_1, docx_1, notice_to_quit], title="Multiple docs 1", filename="multi_bundle_1" )
34+
- multi_bundle_1: ALDocumentBundle.using(elements=[pdf_1, docx_1, notice_to_quit], title="Multiple docs 1", filename="multi_bundle_1", add_page_numbers=True, page_numbers_font_size=20 )
3535
- single_pdf_bundle_1: ALDocumentBundle.using(elements=[pdf_1], title="One pdf", filename="single_pdf_1" )
3636
- single_docx_bundle_1: ALDocumentBundle.using(elements=[docx_1], title="One docx", filename="single_docx_1" )
3737
---

0 commit comments

Comments
 (0)