修复PDF归档长字段排版错乱

This commit is contained in:
汤学会
2026-06-12 18:02:06 +08:00
parent 64e7ac346d
commit 06c7b800fc
2 changed files with 146 additions and 13 deletions
@@ -43,6 +43,7 @@ from app.services.document_archives import ( # noqa: E402
get_latest_archive,
render_pdf_archive,
_archive_table_columns,
_draw_archive_page_frame,
_draw_cell,
_draw_archive_footer,
)
@@ -732,6 +733,77 @@ class DocumentArchiveServiceTest(unittest.TestCase):
rendered_width = pdfmetrics.stringWidth(line, fake_pdf.font_name, fake_pdf.size)
self.assertLessEqual(rendered_width, 54)
def test_draw_archive_page_frame_wraps_long_metadata_inside_columns(self) -> None:
class FakePdf:
def __init__(self) -> None:
self.font_name = "Helvetica"
self.size = 10
self.drawn_texts: list[tuple[float, float, str, str, int]] = []
def setFillColorRGB(self, *args, **kwargs) -> None:
_ = args, kwargs
def rect(self, *args, **kwargs) -> None:
_ = args, kwargs
def setStrokeColor(self, *args, **kwargs) -> None:
_ = args, kwargs
def setStrokeColorRGB(self, *args, **kwargs) -> None:
_ = args, kwargs
def setFillColor(self, *args, **kwargs) -> None:
_ = args, kwargs
def setFont(self, font_name, size) -> None:
self.font_name = font_name
self.size = size
def drawRightString(self, x, y, text) -> None:
_ = x, y, text
def drawCentredString(self, x, y, text) -> None:
_ = x, y, text
def drawString(self, x, y, text) -> None:
self.drawn_texts.append((x, y, text, self.font_name, self.size))
def rotate(self, *args, **kwargs) -> None:
_ = args, kwargs
fake_pdf = FakePdf()
context = ArchiveContext(
document_type=DOCUMENT_TYPE_SALES_ORDER,
business_id=100,
document_no="生产领料-JH_不锈钢板-用于测试00101_0001-苹果电脑后盖-超长批次-客户特殊版本-返工追溯链路",
title="生产领料出库单归档",
partner_label="生产产品",
partner_name="苹果电脑后盖-测试",
document_date=date(2026, 6, 11),
due_date_label="生产台账",
due_date=2,
status="在生产",
tax_rate=0,
total_amount=636,
contact_name="",
contact_phone="",
address="原材料库",
)
table_y = _draw_archive_page_frame(fake_pdf, context, "Helvetica", "Helvetica-Bold", 1, 1)
metadata_lines = [
(text, font_name, size)
for x, y, text, font_name, size in fake_pdf.drawn_texts
if x == 42 and y > A4[1] - 190
]
document_no_lines = [text for text, _, _ in metadata_lines if "单据编号" in text or "返工追溯" in text]
self.assertGreaterEqual(len(document_no_lines), 2)
self.assertLess(table_y, A4[1] - 190)
for text, font_name, size in metadata_lines:
rendered_width = pdfmetrics.stringWidth(text, font_name, size)
self.assertLessEqual(rendered_width, 288)
def test_generate_archive_failed_row_uses_free_version_after_collision(self) -> None:
order = self._seed_sales_order()