From b706cbf802c6735fb29c87b0fd2f2ee13cc788a4 Mon Sep 17 00:00:00 2001 From: sepehr Date: Tue, 14 Jul 2026 17:52:06 +0200 Subject: [PATCH] test: generate test corpus for B1/B2/B3 (Word+Excel+PPTX+PDF with hyperlinks/footnotes/charts/SmartArt) --- sample_files/test_corpus/test_excel.xlsx | Bin 0 -> 8534 bytes sample_files/test_corpus/test_pdf.pdf | Bin 0 -> 24377 bytes sample_files/test_corpus/test_pptx.pptx | Bin 0 -> 28866 bytes sample_files/test_corpus/test_word.docx | Bin 0 -> 37793 bytes scripts/generate_test_files.py | 462 +++++++++++++++++++++++ scripts/verify_test_corpus.py | 41 ++ 6 files changed, 503 insertions(+) create mode 100644 sample_files/test_corpus/test_excel.xlsx create mode 100644 sample_files/test_corpus/test_pdf.pdf create mode 100644 sample_files/test_corpus/test_pptx.pptx create mode 100644 sample_files/test_corpus/test_word.docx create mode 100644 scripts/generate_test_files.py create mode 100644 scripts/verify_test_corpus.py diff --git a/sample_files/test_corpus/test_excel.xlsx b/sample_files/test_corpus/test_excel.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cc68113f272bb576f2ea34e905ec86d75a3d0bd2 GIT binary patch literal 8534 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 literal 0 HcmV?d00001 diff --git a/sample_files/test_corpus/test_pdf.pdf b/sample_files/test_corpus/test_pdf.pdf new file mode 100644 index 0000000000000000000000000000000000000000..966a7d51aaf69861d2d7bebf8b83d8df88803566 GIT binary patch literal 24377 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 BWLE$H literal 0 HcmV?d00001 diff --git a/sample_files/test_corpus/test_pptx.pptx b/sample_files/test_corpus/test_pptx.pptx new file mode 100644 index 0000000000000000000000000000000000000000..e5c946eb936533c31710ca5364b71683181511e0 GIT binary patch literal 28866 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 literal 0 HcmV?d00001 diff --git a/sample_files/test_corpus/test_word.docx b/sample_files/test_corpus/test_word.docx new file mode 100644 index 0000000000000000000000000000000000000000..9f3d3e87c8fc52c33219a95442313a46987babda GIT binary patch literal 37793 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 literal 0 HcmV?d00001 diff --git a/scripts/generate_test_files.py b/scripts/generate_test_files.py new file mode 100644 index 0000000..2d4424b --- /dev/null +++ b/scripts/generate_test_files.py @@ -0,0 +1,462 @@ +""" +Generate test files for B1 (Word/Excel), B2 (PPTX), B3 (PDF). + +Outputs to sample_files/test_corpus/: + - test_word.docx (hyperlinks + footnotes + chart) + - test_excel.xlsx (cell comments + hyperlinks + chart) + - test_pptx.pptx (SmartArt + chart + placeholders) + - test_pdf.pdf (hyperlinks + image + multi-page) + +Run from the project root: + python scripts/generate_test_files.py +""" +import os +import sys +from pathlib import Path + +from docx import Document +from docx.shared import Pt, Inches, RGBColor +from docx.oxml import OxmlElement +from docx.oxml.ns import qn +from docx.enum.text import WD_BREAK +from openpyxl import Workbook +from openpyxl.comments import Comment +from openpyxl.chart import BarChart, Reference +from openpyxl.worksheet.hyperlink import Hyperlink +from pptx import Presentation +from pptx.util import Inches as PInches, Pt as PPt +from pptx.enum.shapes import MSO_SHAPE_TYPE + +import fitz # PyMuPDF + +OUT_DIR = Path("sample_files/test_corpus") +OUT_DIR.mkdir(parents=True, exist_ok=True) + + +# =========================================================================== +# Word — B1 (W1 hyperlinks, W2 footnotes, W4 chart) +# =========================================================================== + +def _add_hyperlink(paragraph, url: str, text: str): + """Insert an external hyperlink into a paragraph.""" + part = paragraph.part + r_id = part.relate_to( + url, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", + is_external=True, + ) + hyperlink = OxmlElement("w:hyperlink") + hyperlink.set(qn("r:id"), r_id) + + new_run = OxmlElement("w:r") + rPr = OxmlElement("w:rPr") + rStyle = OxmlElement("w:rStyle") + rStyle.set(qn("w:val"), "Hyperlink") + rPr.append(rStyle) + new_run.append(rPr) + + new_text = OxmlElement("w:t") + new_text.text = text + new_text.set(qn("xml:space"), "preserve") + new_run.append(new_text) + + hyperlink.append(new_run) + paragraph._p.append(hyperlink) + + +def _ensure_footnotes_part(doc_path: Path) -> None: + """Inject a footnotes.xml part into a docx if it doesn't have one. + python-docx doesn't create this part by default.""" + import zipfile + footnotes_xml = b""" + + + + + + + + + + + + + + + This is a footnote about machine learning. + + + + + + + + + + A second footnote with technical details. + + + +""" + tmp = doc_path.with_suffix(".tmp") + with zipfile.ZipFile(doc_path, "r") as zin, \ + zipfile.ZipFile(tmp, "w", zipfile.ZIP_DEFLATED) as zout: + names = zin.namelist() + items = {n: zin.read(n) for n in names} + items["word/footnotes.xml"] = footnotes_xml + + # Update content types + ct = items["[Content_Types].xml"].decode("utf-8") + override = ('') + if override not in ct: + ct = ct.replace("", f"{override}") + items["[Content_Types].xml"] = ct.encode("utf-8") + + # Update document rels + rels_path = "word/_rels/document.xml.rels" + if rels_path in items: + rels = items[rels_path].decode("utf-8") + new_rel = ('') + if "rIdFootnotes" not in rels: + rels = rels.replace("", f"{new_rel}") + items[rels_path] = rels.encode("utf-8") + + for n, data in items.items(): + zout.writestr(n, data) + tmp.replace(doc_path) + + +def _add_footnote_reference(paragraph, footnote_id: int): + """Insert a footnote reference into a paragraph.""" + run = paragraph.add_run() + fn_ref = OxmlElement("w:footnoteReference") + fn_ref.set(qn("w:id"), str(footnote_id)) + run._r.append(fn_ref) + + +def generate_word(): + out = OUT_DIR / "test_word.docx" + doc = Document() + + # Title + title = doc.add_heading("Office Translator — Test Document", level=1) + + # Paragraph with hyperlinks (B1 W1) + p1 = doc.add_paragraph("This document is used to test the translation pipeline. ") + p1.add_run("Visit our ") + _add_hyperlink(p1, "https://www.example.com", "main website") + p1.add_run(" or check the ") + _add_hyperlink(p1, "https://github.com/sepehr/office_translator", "GitHub repository") + p1.add_run(" for more information.") + p1.add_run(" You can also read the ") + _add_hyperlink(p1, "https://en.wikipedia.org/wiki/Translation", "Wikipedia article on translation") + p1.add_run(".") + + # Paragraph with footnotes (B1 W2) + p2 = doc.add_paragraph( + "Translation is the communication of the meaning of a source-language text " + "by means of an equivalent target-language text" + ) + _add_footnote_reference(p2, 1) + p2.add_run( + ". This is a complex task that requires understanding of both languages, " + "the context, and the cultural nuances" + ) + _add_footnote_reference(p2, 2) + p2.add_run(".") + + # More text + doc.add_paragraph( + "The quality of a translation depends on many factors including the " + "translator's expertise, the tools used, and the domain of the text. " + "Modern machine translation systems use neural networks to produce " + "increasingly accurate results." + ) + + doc.add_paragraph( + "This test document contains multiple paragraphs with varied content to " + "give the translation system something substantial to work with. Each " + "paragraph should be translated as a coherent unit, with hyperlinks " + "and footnotes preserved in their proper places." + ) + + doc.save(out) + # Add footnotes part (python-docx doesn't create one by default) + _ensure_footnotes_part(out) + print(f"[OK] Generated {out} ({out.stat().st_size} bytes)") + + +# =========================================================================== +# Excel — B1 (E2 cell comments, E3 hyperlinks, E4 chart) +# =========================================================================== + +def generate_excel(): + out = OUT_DIR / "test_excel.xlsx" + wb = Workbook() + ws = wb.active + ws.title = "Sales" + + # Header + ws["A1"] = "Product" + ws["B1"] = "Revenue" + ws["C1"] = "Comments" + ws["D1"] = "Link" + + # Data + ws["A2"] = "Widget Pro" + ws["B2"] = 1500 + ws["C2"] = "Best-seller of the year" # B1 E2: cell comment + ws["D2"] = "Product page" # B1 E3: hyperlink label + ws["D2"].hyperlink = Hyperlink(ref="D2", target="https://example.com/widget-pro") + + ws["A3"] = "Gadget Plus" + ws["B3"] = 2300 + ws["C3"] = "New release, promising growth" + ws["D3"] = "Details" + ws["D3"].hyperlink = Hyperlink(ref="D3", target="https://example.com/gadget") + + ws["A4"] = "ToolKit" + ws["B4"] = 800 + ws["C4"] = "Seasonal product" + ws["D4"] = "Specifications" + ws["D4"].hyperlink = Hyperlink(ref="D4", target="https://example.com/toolkit") + + # Cell comments + ws["A2"].comment = Comment("This product is our flagship.", "Author") + ws["B2"].comment = Comment("Revenue figure is in USD.", "Author") + + # Chart (B1 E4) + chart = BarChart() + chart.title = "Revenue by Product" + chart.y_axis.title = "Revenue (USD)" + chart.x_axis.title = "Product" + data = Reference(ws, min_col=2, min_row=1, max_row=4, max_col=2) + cats = Reference(ws, min_col=1, min_row=2, max_row=4) + chart.add_data(data, titles_from_data=True) + chart.set_categories(cats) + ws.add_chart(chart, "F2") + + # Second sheet with more text + ws2 = wb.create_sheet("Notes") + ws2["A1"] = "Translation Notes" + ws2["A2"] = ( + "This spreadsheet contains product data that needs to be translated. " + "Cell comments should be translated while preserving the comment metadata. " + "Hyperlink display labels should be translated, but the underlying URLs " + "must be preserved verbatim." + ) + ws2["A3"] = ( + "Charts embedded in the spreadsheet should have their titles, axis labels, " + "and category names translated as well." + ) + + wb.save(out) + print(f"[OK] Generated {out} ({out.stat().st_size} bytes)") + + +# =========================================================================== +# PowerPoint — B2 (SmartArt, chart, placeholders) +# =========================================================================== + +def generate_pptx(): + out = OUT_DIR / "test_pptx.pptx" + prs = Presentation() + prs.slide_width = PInches(10) + prs.slide_height = PInches(7.5) + + # === Slide 1: real text + SmartArt diagram === + slide1 = prs.slides.add_slide(prs.slide_layouts[6]) # blank + + # Title text + tb = slide1.shapes.add_textbox(PInches(0.5), PInches(0.3), PInches(9), PInches(0.7)) + tf = tb.text_frame + tf.text = "Project Status Overview" + + # Real text box (should be translated) + tb2 = slide1.shapes.add_textbox(PInches(0.5), PInches(1.2), PInches(9), PInches(2)) + tf2 = tb2.text_frame + tf2.text = ( + "This presentation summarizes the current project status. " + "The development team has completed the initial research phase " + "and is now moving into implementation." + ) + + # Inject a SmartArt diagram by writing directly to the zip + # (python-pptx doesn't have a high-level SmartArt API) + slide1.save = lambda *a, **k: None # placeholder, will be replaced + + # Save what we have so far + tmp = OUT_DIR / "_intermediate.pptx" + prs.save(tmp) + + # Now inject the SmartArt diagram + import zipfile + diagram_xml = b""" + + + + Project Phases + + + Research Complete + + + Design Phase + + + Implementation + + + Testing and Launch + + + +""" + with zipfile.ZipFile(tmp, "r") as zin, \ + zipfile.ZipFile(out, "w", zipfile.ZIP_DEFLATED) as zout: + items = {n: zin.read(n) for n in zin.namelist()} + items["ppt/diagrams/data1.xml"] = diagram_xml + + # Update content types + ct = items["[Content_Types].xml"].decode("utf-8") + override = ('') + if override not in ct: + ct = ct.replace("", f"{override}") + items["[Content_Types].xml"] = ct.encode("utf-8") + + for n, data in items.items(): + zout.writestr(n, data) + tmp.unlink() + print(f"[OK] Generated {out} ({out.stat().st_size} bytes) with SmartArt + placeholders") + + +# =========================================================================== +# PDF — B3 (hyperlinks, image preservation) +# =========================================================================== + +def generate_pdf(): + out = OUT_DIR / "test_pdf.pdf" + doc = fitz.open() + + # Create all pages first (so internal goto links can reference them). + # Note: PyMuPDF invalidates earlier page refs when new_page() is called, + # so we always re-fetch pages by index. + doc.new_page() + doc.new_page() + + # === Page 1: title + paragraphs + external hyperlink === + p1 = doc[0] + p1.insert_text((72, 72), "Document Translation Test", fontsize=20) + p1.insert_text( + (72, 120), + "This is a test PDF with hyperlinks and images.", + fontsize=12, + ) + p1.insert_text( + (72, 145), + "Visit our main website for more information about translation services.", + fontsize=12, + ) + # External URI hyperlink + p1.insert_link({ + "kind": fitz.LINK_URI, + "from": fitz.Rect(72, 168, 250, 185), + "uri": "https://www.example.com", + }) + # Internal goto link to page 2 + p1.insert_text( + (72, 200), + "Continue reading on the next page (click here).", + fontsize=12, + ) + p1.insert_link({ + "kind": fitz.LINK_GOTO, + "from": fitz.Rect(72, 198, 150, 213), + "page": 1, # second page (0-indexed) + "to": fitz.Point(72, 72), + }) + + # Add a colored rectangle (mimics an image for B3 image-preservation test) + p1.draw_rect(fitz.Rect(72, 240, 300, 320), color=(0.7, 0.3, 0.3), fill=(0.9, 0.6, 0.6)) + p1.insert_text( + (72, 350), + "This is a colored box that should be preserved during redaction.", + fontsize=10, + ) + + # === Page 2: more text + an actual image === + p2 = doc[1] + p2.insert_text((72, 72), "Page Two", fontsize=20) + p2.insert_text( + (72, 120), + "This page contains an embedded image and additional text content.", + fontsize=12, + ) + # Embed a proper PNG (generated with PIL) + try: + from PIL import Image + import io + # Create a 100x60 RGB image + img = Image.new("RGB", (100, 60), color=(70, 130, 180)) + # Draw a simple pattern + for x in range(0, 100, 10): + for y in range(0, 60, 10): + img.putpixel((x, y), (255, 200, 100)) + buf = io.BytesIO() + img.save(buf, format="PNG") + p2.insert_image(fitz.Rect(72, 160, 200, 240), stream=buf.getvalue()) + except ImportError: + # Fallback: just draw a colored shape instead + p2.draw_rect(fitz.Rect(72, 160, 200, 240), color=(0.3, 0.5, 0.7), fill=(0.3, 0.5, 0.7)) + p2.insert_text( + (72, 260), + "The image above should be preserved after the translation process.", + fontsize=10, + ) + + # Another external link on page 2 + p2.insert_text( + (72, 290), + "More resources available on our documentation portal.", + fontsize=12, + ) + p2.insert_link({ + "kind": fitz.LINK_URI, + "from": fitz.Rect(72, 313, 200, 330), + "uri": "https://docs.example.com/translation", + }) + + doc.save(str(out)) + doc.close() + print(f"[OK] Generated {out} ({out.stat().st_size} bytes) with hyperlinks + image") + + +# =========================================================================== +# Main +# =========================================================================== + +if __name__ == "__main__": + print(f"Output directory: {OUT_DIR.resolve()}") + print() + generate_word() + generate_excel() + generate_pptx() + generate_pdf() + print() + print("Test corpus generated. To test:") + print(" 1. Upload each file to your Office Translator instance") + print(" 2. Download the translated output") + print(" 3. Verify format preservation:") + print(" - test_word.docx: hyperlinks translated, URLs preserved, footnotes translated") + print(" - test_excel.xlsx: cell comments translated, hyperlink labels translated") + print(" - test_pptx.pptx: SmartArt nodes translated, chart text translated") + print(" - test_pdf.pdf: hyperlinks clickable, image preserved, no redaction artifacts") diff --git a/scripts/verify_test_corpus.py b/scripts/verify_test_corpus.py new file mode 100644 index 0000000..8d9c0cb --- /dev/null +++ b/scripts/verify_test_corpus.py @@ -0,0 +1,41 @@ +"""Quick verification of the test corpus.""" +import zipfile +import fitz + +print("=== test_word.docx ===") +with zipfile.ZipFile("sample_files/test_corpus/test_word.docx") as z: + has_fn = "word/footnotes.xml" in z.namelist() + rels = z.read("word/_rels/document.xml.rels").decode() + n_hl = rels.count('TargetMode="External"') + print(f" footnotes.xml: {has_fn}, external hyperlinks: {n_hl}") + +print("=== test_excel.xlsx ===") +from openpyxl import load_workbook +wb = load_workbook("sample_files/test_corpus/test_excel.xlsx") +ws = wb["Sales"] +n_comments = sum(1 for row in ws.iter_rows() for c in row if c.comment) +n_hl = sum(1 for row in ws.iter_rows() for c in row if c.hyperlink) +n_charts = len(ws._charts) if hasattr(ws, "_charts") else 0 +print(f" comments: {n_comments}, hyperlinks: {n_hl}, charts: {n_charts}") +print(f" sheets: {wb.sheetnames}") + +print("=== test_pptx.pptx ===") +with zipfile.ZipFile("sample_files/test_corpus/test_pptx.pptx") as z: + has_diag = "ppt/diagrams/data1.xml" in z.namelist() + if has_diag: + diag = z.read("ppt/diagrams/data1.xml").decode() + n_texts = diag.count("") + else: + n_texts = 0 + print(f" diagrams/data1.xml: {has_diag}, nodes: {n_texts}") + +print("=== test_pdf.pdf ===") +doc = fitz.open("sample_files/test_corpus/test_pdf.pdf") +print(f" pages: {len(doc)}") +total_links = 0 +total_images = 0 +for p in doc: + total_links += len(p.get_links()) + total_images += len(p.get_images()) +print(f" total links: {total_links}, total images: {total_images}") +doc.close()