Skip to main content

Contributing documents to the corpus

What to hand over, in what shape, and where to put it. The policy behind all this — why the corpus exists and what closing a milestone requires of it — is in docs/corpus.md.

Why your documents and not more of ours​

The corpus covers four producers we can drive in a container — Chromium's Skia backend, LibreOffice, ReportLab and qpdf — three office writers driven on Windows — Word's Save as PDF, the Microsoft Print to PDF driver and the PDF24 printer — and 146 third-party files found in public sources under attribution-only licenses: conformance fixtures from veraPDF and BFO, government documents from five countries and the EU, specimen invoices from ERP and invoicing tools, regression files from other PDF libraries, and the Open Preservation Foundation's own test files. Another 242 that we may use but not redistribute are fetched on demand and tested every night — 88 of them the iPRES 2017 hand-built set, copied out of its authors' archive. docs/corpus-sources.md says where each came from, which other libraries' corpora were examined, and why most of them could not be used.

What public sources cannot give us is what arrives in a real inbox: a bank statement out of a Java stack, a supplier's Factur-X straight from its ERP with real data, a contract signed through Yousign or Adobe Sign, a scan as the office copier wrote it, or a file that broke something last week. Those almost always carry someone's address or account details, so they cannot be found — only contributed, and anonymized. Each one that enters the corpus stays there, checked on every commit, for the life of the project.

The first three third-party files we added found a real defect within a minute — a validly compressed empty stream being read as a decoding failure. The search that brought the next seventy-six found a test that could not read a page count qpdf printed with a warning, and a reader that calls a sound stream truncated when its end falls just past an 8 KB window. The pass after it, eighty-two more, found the same window cutting objects longer than 8 KB — both since fixed —, and each cross-reference section read through a window of up to 64 KB, whatever its size. The fourth, the Open Preservation Foundation's format-corpus, found a /Prev a few bytes off that makes the reader drop a whole cross-reference section without a word. That is the return on this.

What is wanted​

Priority 1 blocks a milestone, 2 materially improves one, 3 is opportunistic.

Every row with something still wanted has an issue labeled help wanted, linked from its number: say there what you have — never attach a confidential file to an issue, which is as public as this repository —, or offer it through the Document contribution issue form. This file stays the reference for what is wanted; an issue closes when its row has nothing left to want. Each is filed under the first milestone of its Unblocks column that has not started, and that milestone does not close before it.

#DocumentWhy it mattersUnblocksPriority
W01Microsoft Word → PDF, both variants: "Save as PDF" and "Microsoft Print to PDF"Two different writers, both ubiquitous; the print driver in particular produces structures nothing else doesM01, M021
W02Adobe output: Acrobat, Distiller or an InDesign exportThe reference implementation's own conventions, including its take on object streams and metadataM01, M02, M231
W03A scan from your office copier (Xerox, Canon, Ricoh, Konica…), ideally one with an OCR text layer and one withoutImage-only pages, CCITT and JPEG encodings, and the invisible-text layer OCR adds — extraction must tell them apart, and orientation, blank-page detection and recompression must meet a copier's own outputM01, M02, M07, M15, M21, M22, M231
W04An invoice or statement received from a supplier or bankThese come out of Java stacks (iText, JasperReports, SAP, Crystal) we cannot run here, and they are the highest-volume documents the library will readM01, M02, M10, M12, M15, M241
W05A PDF signed electronically (Yousign, DocuSign, Universign, a qualified provider…)The only way to prove that conservative repair, incremental update and a countersignature leave a signature intact, and that our verdict agrees with EU DSS on signatures we did not makeM03, M04, M05, M21, M26, M271
W06Anything that broke one of your tools — failed to open, opened wrong, printed wrongImpossible to synthesize faithfully, and the most valuable file in any corpusM01, M02, M051
W07A real Factur-X or ZUGFeRD invoice from a supplier's ERPReal ones differ from published samples in the details that matter: attachment relationship, XMP extension schema, PDF/A-3 claimM10, M142
W08An interactive form you actually use — an administrative form, a Cerfa, an internal oneField appearances, calculated fields, and the XFA forms that Adobe's tooling still emitsM10, M16, M17, M202
W09A document in a non-Latin script: Arabic or Hebrew (right to left), Greek, Cyrillic, or CJKShaping, bidirectional text and CID font handling cannot be judged on French aloneM08, M11, M12, M13, M15, M16, M302
W10An old archive document, PDF 1.2 to 1.4, ideally pre-2005Encodings, font formats and structures that no current producer emits but that archives are full ofM01, M02, M062
W11A very large document: a heavy scan, a catalog, a planMemory behavior is a promise, and promises need a document that would break a careless implementationM18, M23, M253
W12A PDF/A produced by someone else's tooling, with its validation report if you have oneAn independent opinion on conformance, to check ours againstM09, M14, M203
W13Image files as pieces arrive: a phone photograph (a JPEG with its EXIF orientation), a multi-page TIFF from a scanning service or a fax server; and the public test sets — JPEGs in all eight EXIF orientations, PngSuiteImages become pages without re-encoding, and orientation, color type and strip layout are what a synthetic file gets wrong; the corpus holds images only inside PDFsM07, M221
W14A document reviewed in a real annotation tool — Acrobat first, then Foxit, PDF-XChange, macOS Preview, pdf.js, Okular: highlights, notes with replies and review states, free text, stamps, shapes, ink, carets; Acrobat's print-only watermark; annotations with NoZoom or NoRotate on a rotated pageFlattening and removal must meet what reviewers' tools write — their appearances, rich text, quad order —, and the committed corpus holds one highlight, one note and one file attachmentM111
W15A Word document as its DOCX, with the PDF made from that very version: a publisher's DOCX beside its PDF (GOV.UK, data.gouv.fr), a DOCX from Google Docs, ONLYOFFICE or Pages, a French memorandum or conclusions with footnotesThe DOCX route is judged against Word's own PDF of the same file, and Word's footnote layout is what French legal readers expect; the corpus holds Word's PDFs but not one DOCXM12, M311
W16E-invoice reference material: standalone CII, UBL and XRechnung files (KoSIT's test suite, the CEN, FeRD and FNFE-MPE examples), Factur-X 1.08 and 1.09 and EXTENDED-CTC-FR samples, an XRechnung beside KoSIT's own visualization of itThe rule differential and the readable rendition need XML inputs and the current versions; the corpus holds invoice XML only inside hybridsM141
W17An e-mail as your mail client exports it — .eml from Thunderbird, Apple Mail or Gmail, .msg from Outlook, with attachments and a forwarded message, anonymized; and an e-mail printed to PDFEach client writes MIME its own way, and an Outlook .msg can only come from Outlook; the corpus holds no message at allM18, M211
W18Conformance test suites and declared documents: veraPDF's pass and fail fixtures per clause for PDF/A-1 to 4, PDF/UA-1, PDF/UA-2 and Well-Tagged PDF; BFO's PDF/A-2 suite; Isartor; the PDF/UA Reference Suite members no pass has screened; publications that declare Well-Tagged PDFA profile of a hundred-odd rules needs a pass and a fail per rule, written by someone other than the profile's authorM20, M281
W19ICC profiles we may redistribute: the ICC's sRGB v2 and v4, CMYK output profiles in v2 and v4 (one FOGRA-characterized), gray and Lab profiles, a device link, a named-color profilePDF/A conversion needs the CMYK profile a caller would supply, and color transforms must be measured on more than the one v2 CMYK profile read out of a committed documentM21, M291
W20Codec and OCR reference material: the ITU-T T.88 JBIG2 test bitstream and the conformance streams of jbig2dec's and pdf.js's suites; ALTO from a commercial OCR engine beside its page image (the Library of Congress's Chronicling America)JBIG2's refinement, halftone and Huffman paths — where the FORCEDENTRY class of fault lives — are in no committed document, and the ALTO reader otherwise knows Tesseract's dialect onlyM221
W21Print-ready files: a PDF/X-4 from InDesign, Acrobat or a RIP with its preflight report; a PDF/X-1a or X-3 from a producer other than Photoshop; PDF/VT from a variable-data tool; an invoice or statement exactly as an outsourced print provider receives it; a page with a CMYK photograph under an output intentThe PDF/X and PDF/VT profiles need third-party files to agree with the referee on; the corpus's one print claim is a remote PDF/X-3 pageM25, M291
W22A tagged, accessible document from a producer other than InDesign, PDFlib and AbleDocs: a PDF/UA-1 claim veraPDF upholds, ideally with tagged markup annotations, a custom role map, or text in Arabic or HebrewMerging tagged documents, tagged annotations and right-to-left actual text are otherwise checked on two producers or on our own outputM06, M11, M132
W23What legal practice tools produce: exhibits stamped by Kleos, Hub-Avocat or Acrobat's stamp tool, with their bordereau; a set Bates-numbered by Acrobat or an e-discovery platform; /Redact marks Acrobat left unapplied, and the same document after applying them; a filing a court portal refused, with its messageStamp positions, numbering conventions, portal presets and the redaction users compare ours with come from these tools' documentation today, not from their outputM09, M15, M18, M192
W24A PDF 2.0 document from a real producer: tagged, ideally PDF/UA-2; with structure destinations, page-level output intents, or a tree mixing the PDF 1.7 and 2.0 namespacesThe 2.0-only artifact subtypes, structure destinations and role maps across namespaces are otherwise read on hand-written examples and our own outputM09, M19, M282
W25Engineering and multimedia content: 3D models (U3D, PRC) or RichMedia, ideally in a PDF/A-4e that veraPDF upholds; an A1 or A0 drawing from a CAD or GIS toolSanitization, PDF/A conversion and PDF/A-4e meet 3D and rich media in one remote portfolio only, and fitting to A4 meets huge pages only remotelyM09, M19, M21, M282
W26HTML templates made for print, with the PDF their engine made: WeasyPrint's samples, Paged.js examples, Prince, PDFreactor or Antenna House outputThe declared CSS level must meet templates we did not write, and paged-media semantics need a second peer where WeasyPrint and the specification leave roomM122
W27Protected documents from the tools that protect them: Acrobat's certificate security, its attachments-only encryption and a password with accents; a Microsoft Purview-protected file with fictitious content; an empty signature field prepared in Acrobat with seed values (/SV) and a lock; a signature made with a European eID card (ECDSA on a Brainpool curve)These are otherwise proven on pyHanko's, pikepdf's and our own fixtures, never on the writer the documents in the wild come fromM16, M262
W28Two versions of one document: a contract draft and the version the counterparty signed and returnedThe daily redlining case; every pair in the corpus is constructed or one-sidedM242
W29A PDF whose links open a PDF attached to it (GoToE)Resolving embedded go-to actions has no real inputM073
W30Typography the generators do not reach: text set from a TrueType collection member, a face whose license restricts embedding (OS/2 fsType), a Chinese Ming face that needs its hinting instructions, an article with mathematics from LaTeX or WordEach case is designed for and met in no documentM08, M15, M253

W13 onwards were drawn on 2026-09-27 from the milestones' own gaps (Gaps by milestone, below): each gathers, once, what only a contribution or a public source can bring. Several are public material we fetch ourselves — W16, W18, W19, W20 —, where a pointer to a source under an attribution-only license is worth as much as the file. The image files, DOCX, standalone XML and messages of W13, W15, W16 and W17 enter the corpus through the manifest's format field, which the maintainer decided on 2026-09-27 and M07 adds for every format at once — images, XML invoices, FDF and XFDF, messages, DOCX (docs/corpus.md).

Nothing here needs to be pretty, recent, or a good example. A file is interesting because of how it was made, not because of what it says.

What is already in, and what is still missing​

After three passes over public sources on 2026-09-24, and a fourth over the Open Preservation Foundation's format-corpus on 2026-09-25 (docs/corpus-sources.md), the corpus holds something for every line, and for most of them several producers. The third pass followed the leads held back by their license, so most of what it found is remote: fetched on demand, never committed (ADR 32). What is still wanted is what only a contribution can bring: documents that went through a real inbox, and that we may commit.

#In the corpusStill wanted
W01Word 2010, 2019 and Microsoft 365 Save as PDF; Word for Mac through Quartz; Print to PDF from Word and from Excel, untouched; our own invoice through Save as PDF, the print driver and PDF24; remote: Word 2010 and 2019 pages signed in PAdES, a Word for Microsoft 365 form finished in Acrobat, an Excel for Office 365 sheet under 24 signatures, a Print to PDF poster that an Adobe tool later updated; the OPF's Pages '09 through Quartz—
W02PDFMaker 5, 9.1, 10, 21 and 25 for Word; Distiller 2 to 10; InDesign; PageMaker; Illustrator; LiveCycle Designer; Acrobat Pro DC and Reader X re-saves; usage rights; remote: PDFMaker 8.1, 11 and 23, FrameMaker through Distiller 6 and 10, Web Capture, Image Conversion, Photoshop, InDesign CS6, an Acrobat 9 portfolio with 3D models, dynamic XFA from LiveCycle ES 9 and 10; the OPF's PDFMaker 7, 8, 10.1 and 11 and Acrobat 11 Image Conversion, InDesign CS (3.0), and from the remote corpus IBM ID Workbench, Xyvision and PageMaker 6.5—
W03Two Xerox copiers with their own OCR layer, Xerox JBIG2 without text, an HP MFP with Acrobat's OCR, a scanner's CCITT G3 file, a 1999 CCITT import, ABBYY FineReader 8 OCR under CCITT G4 pages, a JBIG2 scan completed in DocuSign; remote: a Konica Minolta bizhub scan untouched, with the copier's own OCR, a Ricoh MP C3003 scan through 3-Heights, a Ricoh MP 5054 scan completed in DocuSign, a Canon scanner's own OCR in a damaged file, Kodak Capture and Epson scans, OmniPage and AbleDocs OCR in tagged scansA copier file untouched since the copier wrote it that we may commit: the Xerox ones were later re-saved, and the Konica, Canon and Epson files are remote, the Canon one damaged
W04JasperReports 7 on OpenPDF, iText 2.1.7 then PDFBox (weclapp), PDFBox 3 (Swiss QR-bill), PDFlib's Java binding, Apache FOP, PDFMaker 21 (a UK government sample invoice) — all with fictitious data; remote, real output: SAP NetWeaver (a statement and an invoice), Axapta, Scoro, a card statement from PDFlib on z/OS, a bank's AFP batch processor, a central bank's JasperReports on iText 2.1.0A real invoice or statement from a supplier or bank we may commit: every real one found is remote. Crystal Reports and Oracle: the two Oracle invoices found each gave a person's phone number
W05A GPO certification, DILA's Dictao signature, a qualified seal renewed by timestamps over two years, a PAdES B-LTA seal, two Acrobat Reader signatures, DocuSign's envelope seal on a GSA contract form, node-signpdf's signature and unsigned placeholder; remote: Adobe Sign, Yousign's qualified seal, DocuSign twice more, Universign document timestamps, Foxit PhantomPDF certification and approval signatures, PAdES B-B to B-LTA, Slovak and Hungarian qualified seals, the Spanish gazette's seal, 24 signatures and a timestamp in one file, a certified dynamic XFA form, legacy adbe.x509.rsa_sha1 and MD5 referencesA Yousign, Universign or Adobe Sign signature we may commit: those found are remote, Universign's only as timestamps. A signature under a person's own certificate: those examined carried an e-mail address, a phone number or an identity number
W06A really damaged GovDocs1 file, a GovDocs1 error file, a scanner file that broke pikepdf, forms that broke pdf.js, SafeDocs lexer and dialect tests, a signature /Reason that broke node-signpdf; remote: files that broke pdf.js, PDFBox, PDFium, pdfplumber, PdfPig, OCRmyPDF and EU DSS — truncations, a zeroed block, junk after %%EOF, a stale tail, object-stream indexes wrapped at 16 bits, corrupt Flate data and fonts; the OPF's Cabinet of Horrors (a byte missing, a header naming PDF 1.8, an image's /Height altered, an image pointing nowhere) and GovDocs1 files qpdf cannot finish; remote: 45 files filed against JHOVE under the error it raised — a MacBinary header, a data: URI prefix, a null kid, kids pointing at missing objects, a lost tail —, a fact sheet broken throughout by a text-mode transfer; remote: the iPRES 2017 hand-built set, 88 files each with one deviation from ISO 32000-1's structureAnything that broke your own tools
W07Factur-X from weclapp and from Dynamics 365 (demo data), ZUGFeRD from GnuAccounting and from the Mustang library, the factur-x Python library's output; remote: the FNFE-MPE's French example, intarsys's EN 16931 and XRECHNUNG samples, DWC's generator through WeasyPrint, Symtrax, Konik, 4s4u's additional data, an Order-X purchase order, a UBL payload made hybrid by iText 9A Factur-X a supplier's ERP actually sent, anonymized: the two found, from Oracle Reports and from Business Central, carried a person's contact details
W08Blank XFA forms (IRS, USCIS, DoD, a Cerfa), JavaScript AcroForms (USCIS I-9, HMRC), a calculation order, an OmniForm form, tagged forms; remote: dynamic XFA from LiveCycle ES 9 and 10, encrypted, one of them certified, OPM's OF-306 with date JavaScript and signature fields, an Acrobat radio-button form with NULs in its names, an XFA form filled with fictitious values inside a portfolioA form that is filled in — with fictitious values — that we may commit
W09Arabic, Russian, Greek, Traditional Chinese (2004 and 2017), vertical Japanese without ToUnicode; remote: Hebrew (a US Census guide, a USDA fact sheet), Arabic shaped into CID fonts by WeasyPrint, Chinese font names in GBK bytes, PDF 2.0 UTF-8 stringsKorean; Hebrew and shaped Arabic we may commit
W10PDF 1.2 to 1.4 from 1995–2004: PDFWriter 3.02 and 4.05, Distiller 2, 3 (Windows and Mac), 4 and 6, PDFMaker 5, Acrobat 3, RC4-40; remote: a 1998 PDFWriter 3.02 file with its line ends stripped; the OPF's GovDocs1 files from Distiller 4 and 5 and groff; remote: Xyvision's Parlance Publisher, and the 1994 Transportation Statistics report, whose /Producer names Distiller 1.0.2 for Macintosh over a PDF 1.3 updateA file from before 1996, PDF 1.0 or 1.1
W11Nothing committed, by design; remote: the US Code's Title 42 (9,302 pages), a USGS topographic map (one 63 MB page) and USGS Professional Paper 1 (147 MB of JPEG 2000 scans), fetched and tested every night; beside them a 4.7 MB portfolio, a 10.6 MB tagged scan, a CCITT image that decodes to 153 MB, 24 signatures in 48 updates— (the map is read whole under a raised decoding limit, readerLimits, since ADR 34)
W12PDF/A from PDFlib, Antenna House, Distiller, 3-Heights, BFO, Mustang, Aspose, OpenOffice and Word via PDFMaker, and two false claims, one from the factur-x Python library, each with veraPDF's verdict; remote: PDF/A-1a from callas pdfaPilot and Oracle Outside In, PDF/A-1b from Ghostscript, PDF/A-3 from Symtrax, Konik, intarsys and iText 9, PDF/A-4f and PDF/A-3u from WeasyPrint, claims veraPDF rejects from PDFMaker 11 and a gazette decree re-signed through iText, PDF/X-3 from Photoshop, PDF/UA-1 from AbleDocs and InDesign; the OPF's OpenOffice.org 3.2 PDF/A-1a and Acrobat 11 Image Conversion PDF/A-1bA PDF/A-3 from a real ERP with its validation report, that we may commit

W13 onwards have no row here: the documents nearest to each are named in the milestone tables under Gaps by milestone.

What makes a usable sample​

  • Small, preferably. One to five pages is plenty, and a few hundred kilobytes is ideal: everyone who clones the repository downloads the committed corpus. It is a recommendation, never a reason to turn a document down. A file over 2 MB is simply not committed: it joins the remote corpus, fetched from its public URL (below), so it has to be online somewhere first. The private corpus is for confidential documents, never for heavy ones. For W11 the weight is the point.
  • Whole. Do not re-save it, do not "clean" it in Acrobat, do not run it through another tool. The producer's original bytes are the entire value; a file re-saved by another program is a sample of that other program.
  • Accompanied by a sentence. What it is, where it came from, and — for W06 — what went wrong and in which tool. Two lines are enough, and they become the manifest entry.

Before you hand anything over​

This repository is public. Everything committed to tests/corpus/documents or tests/corpus/vendor is published, indexed and irrevocable. Run through this list first:

  • Visible content: no one's phone number, postal address or e-mail address, no account or identity numbers, no health data, and no amounts you would not print in a newspaper. A person's name alone is acceptable, and so is an image of a handwritten signature, which counts as a name. Fabricated or specimen data is always fine, an invented e-mail address at a real domain included; so is an anonymous photograph, even captioned with a health condition, and a software library's copyright line compiled into the file, even with its author's e-mail address. Redacting in a PDF viewer often only draws a black rectangle over text that is still there — check by selecting the text underneath, or by extracting it.
  • Metadata: /Info and XMP carry author, company, the local file path and sometimes the template used. Say so if you want them stripped; I will do it and record that the file was modified. A print driver writes its own: Microsoft Print to PDF puts the display name of the Windows account that printed into /Author, whatever the document's properties say; Ghostscript-based printers such as PDF24 copy the account's user name from the PostScript into /Author and the XMP; and Word's Save as PDF copies the document's Author property, which defaults to the Office user's name.
  • Hidden material: attachments, annotations and their authors, form field values, layers turned off, earlier versions kept by incremental updates. A PDF can hold several years of edits: two public files turned down for this corpus named a civil servant only in an /Info dictionary a later revision had replaced. An XFA form also keeps its designer's file paths — C:\Users\<name>\… — in its configuration packet.
  • License and permission: you must be entitled to publish it. A supplier's invoice is your document but their layout — when in doubt, it goes in the private corpus instead.

If any box cannot be ticked, the file is still useful: put it in the private corpus, which is never published.

Where to put it​

Public — the file can be published​

tests/corpus/documents/<use-case>/<producer>-<what-it-is>.pdf

Use cases are invoice, report, contract, form, scan, archival, damaged, stress. Names are lower case with hyphens, and name the producer first: word-print-driver-invoice.pdf, acrobat-contract-signed.pdf.

Then describe it in tests/corpus/manifest.json — by hand: the build script replaces only the entries it writes itself, marked builtBy — and run build_corpus.py --committed-only to record the referee's verdict (tests/corpus/README.md has the one-line container command). Or tell me the two lines about the file and I will write the entry, establish the expectations with an independent tool, and add it to the acceptance tests.

A third party's file — a sample from another project's test suite, a public-domain government document — goes under tests/corpus/vendor/<source>/ instead, described in the same manifest, and only under an attribution-only license recorded in tests/corpus/NOTICE (ADR 23).

An image file, an XML invoice, an FDF or XFDF file, an e-mail or a DOCX goes in the same places, under the same rules, once M07 has given the manifest its format field; until then, hand it over and say what it is. A stylesheet, an HTML template, a test suite or an ICC profile someone else wrote is an input rather than a document: it goes under tests/corpus/sources/third-party/<name>/, as docs/corpus.md says.

Public but not redistributable — fetched on demand​

A file anyone can download but nobody may republish — a bug-report attachment, a vendor's sample, a ShareAlike document, any file over 2 MB whatever its license — is not committed at all. It is described in tests/corpus/manifest.json with origin remote, its URL and its SHA-256, fetched by build/fetch_remote.py, and tested every night by the Remote corpus workflow (ADR 32). Terms that restrict reuse do not keep a file out — conditions beyond attribution, non-commercial reproduction only, fair use only, no modification or commercial use — but "educational use only" does. Send the URL rather than the file; tests/corpus/README.md says how an entry is written. A document of yours that is not public belongs in the private corpus, not here: the manifest is published, and it lists only files anyone can already download.

Private — the file cannot be published​

tests/corpus/private/<anything>.pdf described by tests/corpus/private.json

Both are ignored by git. The test suite merges them when they are present and runs on the public corpus when they are not, so a private corpus never breaks anyone else's build. Same manifest format.

Handing files over​

Committing them on a branch is simplest. Attaching them in conversation also works — I will place them, write the entries and run the acceptance suite. From outside the project, the Document contribution issue form, or a comment on the row's issue, offers a public file or its URL; a confidential one is described there, never attached. Either way, say which of the two destinations applies: I will not publish a file into the public corpus on my own judgment.

The manifest entry​

One entry per document. expect is what the tests assert; readerLimits, when there is one, is how the document is opened; everything else is provenance. tests/corpus/manifest.schema.json gives every field its type, its allowed values and a description, and an editor that reads JSON Schema applies it as you type.

{
"file": "documents/invoice/word-print-driver-invoice.pdf",
"title": "Invoice printed through the Microsoft PDF print driver",
"useCase": "invoice",
"producer": "Microsoft Print to PDF, Windows 11 24H2",
"origin": "contributed",
"license": "Owned by AdCodicem, published with permission",
"features": ["xref-table", "type0-subset", "print-driver"],
"expect": {
"pages": 2,
"clean": true,
"indexRebuilt": false,
"requiredDiagnostics": [],
"refereeCheckSucceeds": true,
"textContains": ["Facture", "Total TTC"]
}
}

Rules about expect:

  • refereeCheckSucceeds is filled in by the build script, which runs the very command the integration tests run — qpdf --check — rather than guessing what it ought to say. Damage and rejection differ: junk before the header shifts every offset and qpdf adjusts without complaint, while an encrypted document it has no password for is refused although nothing is wrong with it.
  • Establish the rest with an independent tool, never with our own reader. An expectation derived from the code under test proves nothing. pikepdf, qpdf --check and pdftotext are the referees in use.
  • findings lists the validation rules the document earns (M02), by identifier, and is left out when it earns none — which a sound document should. Establish each from the file itself: file.eof-missing when no %%EOF lies in its last 1,024 bytes. The test holds every document to exactly its list.
  • catalogRecoverable: false is for a file with no catalog at all — no object in it is one, and the referee finds none either. The tests then expect the reader to open the file and hand back no catalog rather than invent one. Every other entry leaves the field out.
  • A valid document that exceeds a default reader limit gets readerLimits, not unsupported. Establish the size that crosses the limit independently — the referee reads the document whole, and zlib or qpdf measures what a stream decodes to —, then give the smallest round value that reads it: 512 MB for a 313 MB image, never Unbounded. The field sits beside expect, since it is a setting rather than an observation (ADR 34).
  • Never weaken it to make a test pass. Either the library is wrong and gets fixed, or the expectation was wrong and gets corrected with the reason in the commit message.

For a W06 file — one that broke something — say what the correct behavior is, even if we cannot reach it yet. An expectation the library fails today is recorded as unsupported, with the milestone that will address it. Silence is what we are trying to avoid.

What happens next​

A contributed document is added to the manifest, runs in the acceptance suite from that commit onwards, and is named in docs/status.md if it changes anything. If it finds a defect, the fix and a regression test land with it. If it exposes something out of scope for the current milestone, it becomes a recorded expectation pointing at the milestone that owns it.

Gaps by milestone (identified 2026-09-26 and 2026-09-27)​

When the roadmap was revised, each milestone's specification said what its acceptance needs that the corpus does not hold yet: the "Corpus" section of each file in docs/milestones/. The tables below gather them for every milestone that has a specification, M01 to M31, M12's by sub-milestone; where a table and its milestone file differ, the file is the reference. None has been added yet: this is the list to work from, milestone by milestone, not a record of work done. "Generate here" means one of the producers the container runs (Chromium, LibreOffice, ReportLab, qpdf and the Python producers); "Generate on Windows" means build/build_word.ps1; "Public source" means a document found under an attribution-only license (ADR 23); "Remote corpus" means a document that may be used but not redistributed (ADR 32); "Contribution" means one only an inbox holds. The one maintainer decision these gaps asked for — formats other than PDF in the manifest — was taken on 2026-09-27 and is M07's to deliver. A gap another milestone fills first names it, as "(M16's gap)". Priority follows the scale above. What only a contribution or a public source can bring is gathered once, across milestones, in rows W13 onwards of What is wanted.

M01​

The milestone is closed, so nothing here blocks: these widen what the reader is proven on.

NeedWhyNearest in the corpus todaySourcePriority
A copier's file untouched since the copier wrote itEvery committed scan has been through another tool since, and copiers write index shapes of their ownvendor/us-federal/xerox-workcentre-treasury-imf-report-scan.pdf, xerox-workcentre-5335-ocr-hud-fonsi-linearized.pdf, xerox-workcentre-5755-ocr-hud-fonsi-mrc.pdf (re-saved since); remote/ecan/konica-bizhub-c554e-letter-scan.pdfContribution3
A supplier's or a bank's invoice or statement from a Java stack, committedThe real ones are in the remote corpus only, so the main CI job never reads themremote/pdfminer/sap-netweaver-invoice-issue1062.pdf, remote/pdfminer/afp-batch-processor-bank-statement-2b.pdf; vendor/jasper-modular/openpdf-jasperreports-financial-statement.pdf (fictitious data)Contribution3
A real document of 300,000 objects or more, soundThe memory budget on opening such an index (#193) holds a generated file; the largest corpus document has 65,564 objects, damaged, and the largest sound one 43,487remote/pdfjs/cairo-firefox-objstm-index-overflow-bug1978317.pdf (damaged); remote/opf-format-corpus/jhove-hul-110-pdfmaker101-word-transit-coordination-report.pdfPublic source3

M02​

NeedWhyNearest in the corpus todaySourcePriority
A structurally sound file whose Flate stream lost its tail, and one whose LZW stream uses a code it never defined, as derived variants of our invoiceT32's fix and the 'filters decodable' rule meet these only in unit tests: the committed damage cuts a whole file, not a stream inside a sound onedocuments/damaged/invoice-truncated-tail.pdf (the whole file cut); the committed LZW documents (vendor/us-federal/acrobat3-import-irs-1040-1988-scan.pdf, distiller3-irs-ss4-1995-form.pdf, pdfwriter3-copyright-office-dmca-summary-1998-rc4-40.pdf)Generate here2
An object stream whose /DecodeParms names an object stored inside it, hand-built and marked as suchSince M02's third slice the reader reports it (stream.self-reference) and so does the validator (xref.object-stream-circular), but on hand-built test files onlynoneGenerate here3
A widget that belongs to no field, and a destination naming a page the file lacks, from a real producerThe annotation rules meet these only in hand-written and damaged filesnone from a real producerContribution3

M03​

NeedWhyNearest in the corpus todaySourcePriority
A signed twin of our own contract (documents/contract/chromium-contract-fr.pdf): a PAdES B-B approval signature and a DocMDP P=2 certification, from a fictitious test PKI, as a derived variantThe roadmap's M03 acceptance says the corpus's contract is unsigned and lets its signed twin join with M04; the vendored signed files carry the behavior, yet none is a modern signature over a document we can regeneratevendor/us-federal/itext-govinfo-us-code-certified.pdf, vendor/fr-licence-ouverte/fop-dictao-dila-signed-joafe-notice.pdf, vendor/pyhanko/acrobat-reader-signed-twice.pdf, vendor/node-signpdf/skia-chrome74-node-signpdf-reason-contains-trailer.pdf, vendor/lu-legilux/*, vendor/us-federal/docusign-pdfkit-gsa-sf30-contract-modification.pdf (all useCase contract)Generate here2
A committed PDF 2.0 document with UTF-8 text strings in /Info, outline titles and page labels, and an ISO_ developer-extension entryExercises the 2.0 input path, #36 and the /Extensions union on committed files; the only UTF-8 file is remote (CC BY-SA) and the committed 2.0 fixtures carry little metadataremote/pdf20examples/handwritten-pdf20-utf8-strings.pdf (remote), vendor/verapdf/pdfa4-metadata-pass.pdf, vendor/verapdf/pdf20-version-mismatch.pdfGenerate here2
A committed incremental update glued to the %%EOF marker (no line end), and a committed signed hybrid-reference fileThe incremental writer must append a line end first and follow a hybrid file's shape; both cases exist only in the remote corpus, which the main CI job never seesremote/pdfcpu/word2019-diia-test-pades-b-b.pdf, -b-lt.pdf, -b-lta.pdfGenerate here3
A committed document with one encoded stream larger than the writer's 1 MB copy buffer (about 1.2 MB, incompressible image)The piecewise copy of stream data meets a real stream past its buffer only in remote documentsremote/usgs/us-topo-washington-west-2023.pdf (14.9 MB image), remote/usgs/omnipage-usgs-professional-paper-1-1902.pdfGenerate here3

M04​

NeedWhyNearest in the corpus todaySourcePriority
Crafted attack fixtures derived from a signed document by recorded transformations: shadow hide, replace (by font and by form-field appearance), hide-and-replace; an incremental saving attack after an approval signature; signature wrapping (gap larger than /Contents); universal signature forgery (/ByteRange or /Contents missing, null, empty)The roadmap's M04 acceptance names crafted shadow-attack fixtures, and no real corpus document carries a forbidden post-signature changenone; the published PDF-Insecurity exploit files (pdf-insecurity.org, Ruhr-Universität Bochum) are a second source whose license is unverified, so remote at bestGenerate here1
Certified documents with later changes, allowed and forbidden: DocMDP P=2 then a field filled and a countersignature; P=1 then a DSS and a document time stamp; an annotation added under P=2 and under P=3; a FieldMDP-locked field changed beside an unlocked oneNo committed certification is followed by any change (the GPO certification closes the last revision), so allowed-versus-forbidden classification has no real test materialvendor/us-federal/itext-govinfo-us-code-certified.pdf (certification is the last revision); remote/canada/livecycle-es10-ircc-imm1344-certified-dynamic-xfa.pdf (only usage rights added after certification)Generate here1
pyHanko's verdicts recorded in the manifest for every committed and remote entry: revision count, and per signature the revision closed, the coverage level and the modification level of what follows (new expect.revisions and expect.signatures fields)Acceptance must compare against an independent referee's opinion recorded in advance, never against our own readernone (refereeCheckSucceeds holds qpdf's verdict only)Generate here1
The pyHanko-signed twin of documents/contract/chromium-contract-fr.pdf (shared with M03)The reproducible base from which every crafted M04 fixture is deriveddocuments/contract/chromium-contract-fr.pdf (unsigned)Generate here1
A real document annotated or countersigned in Acrobat after someone else signed itAcrobat rewrites /Info and XMP on every save, so real updates mix change classes (metadata with annotations or signatures) that crafted fixtures keep apart; the classification must not call real countersigned files tamperedvendor/pyhanko/acrobat-reader-signed-twice.pdf; remote/eu-dss/excel365-nowina-25-signatures-dss-vri.pdfContribution2
A signature dictionary stored inside an object streamIts coverage (Malformed) and the signature.dictionary-in-object-stream rule are designed but met in no filenoneGenerate here3

M05​

NeedWhyNearest in the corpus todaySourcePriority
Third-party damaged documents whose undamaged original is known: build_corpus.py's damage applied to LibreOffice, ReportLab and vendored documents whose license allows derivatives'Repaired equals original' can be asserted only on our own damaged copies today; every other damaged document is judged against qpdf alonedocuments/damaged/invoice-no-xref.pdf, invoice-shifted-offsets.pdf, invoice-truncated-tail.pdf, invoice-junk-prefix.pdf, invoice-lying-length.pdf (all derived from our Chromium invoice)Generate here1
A signed document that needs a repair, damaged after its signed revision, with its intact twinConservative repair of a signed revision is the acceptance row most likely to go wrongnone; the pyHanko-signed contract twin M03 and M04 plan is its natural baseGenerate here1
A real document damaged in transit: a truncated e-mail attachment, a file cut by a portal's size limitThe damage users meet most, and the one tools disagree ontruncations filed as bug reports, remote: remote/pdfbox/distiller10-truncated-lost-catalog-pdfbox3949.pdf, remote/pdfbox/word2010-truncated-page-tree-pdfbox3950.pdf, remote/pdfbox/amyuni-truncated-linearized-pdfbox3208.pdfContribution2

M06​

NeedWhyNearest in the corpus todaySourcePriority
Two fillings of one AcroForm with different, fictitious valuesThe roadmap acceptance 'merging two forms that both define a field of the same name keeps both values' needs values; no committed form is filled, let alone filled twicedocuments/form/reportlab-subscription-form.pdf (blank); the real name collisions between vendor/fr-licence-ouverte/libreoffice-cerfa-13983-form.pdf and pdfmaker-acrobat-cerfa-12156-form.pdf (unfilled)Generate here1
The decrypted twin of vendor/us-federal/livecycle-uscis-ar11-xfa-form.pdfThe only committed layers whose state differs between screen and print are AES-128-encrypted, which the reader opens in M16, and the merge's layer row needs them nowvendor/us-federal/livecycle-uscis-ar11-xfa-form.pdf (encrypted)Generate here (M11's gap)1
A contract whose appendices are third-party PDFs, with bookmarks and cross-references between body and appendicesThe roadmap's 'contract appendices' do not exist: chromium-contract-fr.pdf has no appendix, no link and no bookmark; the acceptance substitutes a set of separate filesdocuments/contract/chromium-contract-fr.pdf, vendor/uk-ogl/word2019-ccs-contract-schedule.pdf, vendor/pdf-association/indesign13-pdfua1-german-book-chapter.pdfGenerate here2
A page tree that inherits /Rotate, /CropBox and /Resources from intermediate /Pages nodesOnly MediaBox is inherited in the committed corpus, in two files, one of them damagedvendor/opf-format-corpus/pdfmaker9-word-distiller-pdfa1b-test-document.pdf (MediaBox on the root), vendor/opf-format-corpus/distiller3-dea-cfr-damaged.pdf (MediaBox on intermediate nodes)Public source2
Page labels in upper roman and letters, with real prefixes (A-1, Annexe 2-)Committed labels are decimal or lower roman; letters and prefixes are what case files usevendor/opf-format-corpus/word9-distiller405-usgs-nwql-volatile-organics-methods.pdf, vendor/pdf-association/handwritten-utf16le-strings.pdfGenerate here2
Two tagged documents whose role maps map one custom type differently, and colliding class namesThe role-map and class-map collision rules have no real caseindesign13-pdfua1-german-book-chapter.pdf, indesign15-pdfua1-form.pdf, pdfmaker9-word-distiller-pdfa1b-test-document.pdf (role and class maps that do not conflict)Contribution3
A document with a catalog /URI base and relative URI linksThe rule resolving a part's relative links against its own base before merging has no real casenoneGenerate here3
An intact document with article threadsThreads exist only in a damaged remote fileremote/pdfbox/distiller6-zeroed-object-stream-pdfbox3947.pdf (damaged)Public source3
A PDF/UA-1 document from a producer other than InDesign and PDFlibThe merged-structure acceptance rests on two producerspdflib-pps-kraxi-pdfa2a-pdfua1-invoice.pdf, indesign13-pdfua1-german-book-chapter.pdf, indesign15-pdfua1-form.pdf; remote AbleDocs membersPublic source3

M07​

NeedWhyNearest in the corpus todaySourcePriority
Image files (not PDFs) as corpus documents, and a manifest and schema that can describe themThe roadmap acceptance 'every image file in the corpus becomes a page' has no image file to run on; manifest.schema.json admits only .pdf paths until M07's format field, decided on 2026-09-27 for every formatnone as files; 56 JPEG, 70 CCITT and one JP2 stream inside committed PDFsGenerate here1
JPEGs in all eight EXIF orientations, with and without JFIF densityOrientation by matrix (mirrored values included) has no input; the corpus's only orientation tag says uprightthe EXIF-tagged JPEG in vendor/fr-licence-ouverte/fop-dictao-dila-signed-joafe-notice.pdf (orientation 1)Public source1
PNGs of every color type, bit depth, interlacing and transparency (PngSuite)PNG IDAT pass-through and its lossless paths have no input at allnonePublic source1
Multi-frame TIFFs: CCITT G3 1-D/2-D, G4, Modified Huffman, LZW, Deflate with predictor, PackBits, several strips, FillOrder 2, MinIsBlack, JPEG in TIFFTIFF is what copiers deliver; only CCITT strips taken out of PDFs existCCITT streams of finereader8-frb-sr0115-examiner-guidance.pdf, acrobat3-import-irs-1040-1988-scan.pdf, pikepdf/scanner-ccitt-endofline.pdfGenerate here1
A set of pieces cross-linked by GoToR (page and named destinations) and by relative or file: URIs with #page= and #nameddest=The GoToR/URI rewrite has no real input; only one Launch-to-PDF pair existsvendor/opf-format-corpus/pdfmaker9-word-distiller-external-link.pdf (Launch to text_only_pdfa1b.pdf = pdfmaker9-word-distiller-pdfa1b-test-document.pdf)Generate here1
CMYK and YCCK JPEGs with an Adobe APP14 marker, and a JPEG with a multi-chunk ICC profileThe inverted /Decode and ICCBased paths have no input; corpus JPEGs are RGB or grayscale without profilesthe 56 RGB/grayscale JPEG streams in committed PDFsGenerate here2
JPEG 2000 files: a raw codestream, a JP2 with alpha, a JPX-branded fileOne committed JP2 cannot cover color and alpha casesvendor/opf-format-corpus/imagemagick-false-pdfa1b-jpx.pdf; remote acrobat8-jpx-precincts-issue5475.pdf and omnipage-usgs-professional-paper-1-1902.pdfGenerate here2
A committed portfolio with folders, a schema, PDF and non-PDF membersThe only portfolio is remote, so unpacking is tested nightly only, and the committed-portfolio row needs oneremote/opf-format-corpus/acrobat9-portfolio-signed-3d.pdfGenerate here1
A scan batch with blank separator pagesThe separator strategy has no real batch, and the separator row needs onecommitted CCITT scans (qpdf can insert empty pages as a derived variant)Generate here1
A real single-sided duplex scan delivered as fronts and reversed backsCollation is proven only on halves qpdf derives at test timevendor/us-federal/finereader8-frb-sr0115-examiner-guidance.pdf, acrobat3-import-irs-1040-1988-scan.pdfContribution3
A document with GoToE links into an attached PDFGoToE resolution has no real inputnone (bfo-pdfa2b-embedded-pdf.pdf carries a PDF attachment but no GoToE)Contribution3

M08​

NeedWhyNearest in the corpus todaySourcePriority
The roadmap's acceptance sample (accented French with fi/fl ligatures, CJK, a Cyrillic name, a supplementary-plane character, U+202F before a colon) as Chromium and LibreOffice render itM08's first acceptance is judged on our own output alone; a real producer's rendering of the same text says what 'extracts exactly' means for them and whether their ligature ToUnicode and fallbacks do better than oursdocuments/invoice/chromium-invoice-fr.pdf (accents, type0-subset), vendor/us-federal/indesign-irs-pub1-russian.pdf (Cyrillic), vendor/us-federal/indesign-irs-pub1-chinese-traditional.pdf (CJK)Generate here2
A committed document embedding a CFF-flavored OpenType face from a current producerOnly the GPO's Myriad Pro is FontFile3 /OpenType; the 12 CID-keyed CFF programs come from InDesign, Distiller and PDFMaker, so the CFF subsetter's CID-keyed output has no modern peer to compare withvendor/us-federal/itext-govinfo-us-code-certified.pdf; vendor/us-federal/indesign-irs-pub1-chinese-traditional.pdf; vendor/opf-format-corpus/indesign-cs-puppet-guild-event-flyer.pdfGenerate here2
Glyphs of the supplementary planes embedded with a ToUnicode that writes surrogate pairsOnly strings, not glyphs, carry supplementary-plane characters in the corpus, and the one emoji font is remoteremote/pdf20examples/handwritten-pdf20-utf8-strings.pdf (strings only); remote/us-states/powerbi-pdfium-acrobat-covid-dashboard-nine-updates.pdf (emoji-font)Generate here2
A document whose text came from a TrueType collection (.ttc) memberCollections are a registry feature; nothing shows how producers subset and embed a collection membernoneContribution3
A document with a restricted-license (OS/2 fsType bit 1) face that a producer embedded anyway, or refused toThe embedding-permission rule has no real case to be compared withvendor/eu-publications/pdflib-oj-exchange-rates-greek.pdf (EUAlbertina embedded in full under an editable-embedding permission)Public source3

M09​

NeedWhyNearest in the corpus todaySourcePriority
A rotated page carrying internal links, a markup annotation with its popup, and a form fieldThe roadmap's 'flatten /Rotate with annotations and links transformed alike' has no committed page that is both rotated and annotated: the four rotated documents carry nothing but DocuSign's signed widgetvendor/opf-format-corpus/pdfmaker7-powerpoint-va-cancer-database-course.pdf (53 pages at 90°, no annotations); vendor/us-federal/docusign-pdfkit-gsa-sf30-contract-modification.pdf (270°, one widget); vendor/opf-format-corpus/reader10-openoffice32-annotated-object-streams.pdf and documents/report/chromium-report-fr.pdf (annotations and links, unrotated)Generate here1
A letterhead page on its own (logo, address block, colored band) to underlayThe overlay/underlay acceptance needs the business case it exists for; no corpus document is a letterhead alonenone (the generated invoices carry a header, not a separate letterhead)Generate here1
A document whose pages share one content streamLegal, a known trap for anything that edits content in place; the wrapper must keep it shared, and the committed corpus has none (pikepdf survey)noneGenerate here2
A PDF/A document veraPDF upholds with a CMYK output intentThe one committed CMYK intent sits on a claim veraPDF rejects, so refusing RGB marks is tested only on an already non-conforming documentvendor/eu-publications/distiller10-eu-consolidated-regulation-2015.pdf (CMYK intent, claim rejected); remote/ocrmypdf/photoshop-cc2015-pdfx3-cmyk.pdf (PDF/X-3, not PDF/A)Public source2
A tagged PDF 2.0 document, ideally PDF/UA-2The PageNum and Bates artifact subtypes exist only in PDF 2.0 output; no committed tagged document is 2.0vendor/verapdf/pdfa4-metadata-pass.pdf (PDF 2.0, PDF/A-4, not a tagged business document); remote/pdf20examples/handwritten-pdf20-utf8-strings.pdfPublic source2
An exhibit stamped by the tools French lawyers use (Kleos, Hub-Avocat, Acrobat's stamp tool)Position, wording and per-piece numbering conventions are taken from the tools' documentation, not their output; M18's presets want the real thingnoneContribution3
A document Bates-numbered by AcrobatAcrobat marks its Bates numbers with its own /PieceInfo and artifacts; our removal must leave them, and the corpus has only Acrobat headers and footers (remote) and PDFStamp (remote)remote/us-states/powerbi-pdfium-acrobat-covid-dashboard-nine-updates.pdf; remote/opf-format-corpus/jhove-hul-28-dvipdfm-pdfstamp-physics-article.pdfContribution3
A committed large-format page (A1, A0) from a CAD or GIS producerFit to A4 meets huge pages only in the remote corpusremote/usgs/us-topo-washington-west-2023.pdf; remote/pdfjs/aspose-cad-stale-tail-issue9418.pdf; vendor/opf-format-corpus/imagemagick-false-pdfa1b-jpx.pdf (2717 × 3701 pt)Public source3

M10​

NeedWhyNearest in the corpus todaySourcePriority
The reference payload set the roadmap's first M10 acceptance condition names (every symbology, QR level and mode, Data Matrix encodation and shape, PDF417 level, numeric/text/binary/UTF-8 payloads, each at capacity), as test data in tests/AdCodicem.Pdf.TestSupport — decided on 2026-09-27: written from the standards, not received, so not a corpus documentThe roadmap writes the acceptance against 'a reference set of payloads' that does not existnoneGenerate here1
Swiss QR-bills in every variant: QRR with a QR-IBAN, SCOR, NON, EUR, no amount, no debtor (corner marks), each heading language, one with billing information and two alternative schemesOne specimen cannot exercise the reference-type matrix, blank fields or headings; each of our slips must be compared with an independent producer'svendor/swissqrbill/pdfbox-swiss-qr-bill-a4.pdf (one specimen, SCOR-less alternative-procedure bill from SwissQRBill through PDFBox 3)Generate here1
An invoice carrying an EPC (GiroCode) QR code from a real invoicing system or ERPPayload parity with segno proves the guideline, not the field choices and placement real invoices usenone: no committed invoice carries a code (documents/invoice/, vendor/zugferd/, vendor/docentric/*)Contribution2
Linear and 2D codes painted by other producers: ReportLab's barcode module (Code 128, EAN-13, QR, Data Matrix), LibreOffice's QR/barcode generator, a GS1-128 parcel labelA document already carrying a code is the case a stamp must not disturb, and the input any later barcode recognition would start fromvendor/swissqrbill/pdfbox-swiss-qr-bill-a4.pdf onlyGenerate here3
A government form whose pages carry a printed PDF417 (e.g. a USCIS paper-forms barcode), public domain, screened for personal dataThe commonest received document with a 2D code; stamping beside it must leave it readablevendor/us-federal/livecycle-uscis-ar11-xfa-form.pdf and designer-distiller23-uscis-i9-javascript-form.pdf (no barcode field; no XFA <barcode> in any committed form, checked 2026-09-26)Public source3

M11​

NeedWhyNearest in the corpus todaySourcePriority
Documents annotated in real reviewing tools with every markup subtype — underline, strike-out, squiggly, free text (plain, callout, typewriter), stamps (standard, custom, image), square, circle, line with endings, polygon, polyline, ink, caret, replies and review states — from Acrobat first, then Foxit, PDF-XChange, macOS Preview, pdf.js's editor, Okular. Fallbacks: PDFium's BSD hand-written .in fixtures (annots, ink_annot, line_annot, polygon_annot, links_highlights_annots, annotation_highlight_rollover_ap), LibreOffice's comment export, pdf.js's editor driven in ChromiumThe committed corpus has one highlight, one note and one file attachment; flattening and removal must meet what reviewers' tools write (their appearances, /RC, quad order), not only our own outputvendor/opf-format-corpus/reader10-openoffice32-annotated-object-streams.pdf, pdfmaker10-word-file-attachment-annotation.pdf, pdfmaker9-word-distiller-embedded-quicktime.pdf; remote quartz-word-samhsa-prevention-pathways-fact-sheet.pdf (damaged)Contribution1
Third-party annotations WITHOUT appearance streams, of several subtypes: PDFium's hand-written annotation_markup_multiline_no_ap.in (BSD), pypdf's annotation classes (which write none), and the committed annotations with /AP removed by a recorded pikepdf transformation'Appearance streams generated for every subtype' must be proven on others' annotations; M21 relies on the same generatornone: every committed markup annotation has an appearance (popups excepted, legally)Generate here1
A decrypted twin of vendor/us-federal/livecycle-uscis-ar11-xfa-form.pdf, derived with qpdf --decrypt and recorded in build_corpus.pyIts PrintOnly/ViewOnly groups with /BaseState /OFF and /AS, and its two links on a layer, are the only committed layers whose state differs between screen and print — but the file is AES-128 encrypted, readable only from M16vendor/uk-ogl/pdfmaker21-ozev-sample-invoice.pdf (Acrobat Watermark group with /AS, same state for every event)Generate here1
Acrobat's own print-only watermark (shown when printing, hidden on screen) and a Watermark annotation with /FixedPrintBoth print-only forms M11 writes should be checked against the reference implementation's own output; the committed Acrobat watermarks show and print alikevendor/uk-ogl/pdfmaker21-ozev-sample-invoice.pdf, vendor/uk-ogl/indesign-acrobat-hmcts-n208-form.pdfContribution2
Layers with visibility expressions (/VE), radio-button groups, locked groups, alternate configurations (/Configs) and a nested /Order with labelsNone is committed; the PDFMaker memberships use /OCGs and /P onlythe five PDFMaker 7/8 files with OCMDs; remote remote/usgs/us-topo-washington-west-2023.pdf (31 layers, /Order to be examined)Generate here2
A DocMDP P=3 certification followed by an annotation, and one without (the same crafted pyHanko fixtures M04 lists)The allowed case of M04's permission table has no document; M11's 'annotations allowed where the certification allows them' row depends on itvendor/us-federal/itext-govinfo-us-code-certified.pdf (P=1); remote remote/eu-dss/pdfmaker11-nbu-sk-qualified-seal-docmdp-fieldmdp.pdf (P=2)Generate here1
A tagged document whose markup annotations are tagged (Annot elements with OBJR)Removal and flattening inside the structure tree are otherwise proven on our own tagging only; committed tagged annotations are linksvendor/pdf-association/indesign13-pdfua1-german-book-chapter.pdf (tagged links with OBJR)Contribution2
Annotations with NoZoom and NoRotate on rotated pages, from AcrobatFlattening's counter-rotation is otherwise proven on the unrotated Reader X page and our own rotated pages onlyvendor/opf-format-corpus/reader10-openoffice32-annotated-object-streams.pdf (flags 28 on an unrotated page)Contribution3
Free text and stamps in right-to-left and complex scripts, written by AcrobatM08's draw-and-report path for unshaped text should be checked against what arrives; M12.6's HTML-rendered stamps will need a referencenoneContribution3

M12​

NeedWhyNearest in the corpus todaySourcePriority
The three reference sources rendered by WeasyPrint 70 and committedA second engine's output of the same content, committed; the corpus's WeasyPrint files are remote (ShareAlike or unlicensed)remote/py-pdf-sample-files/weasyprint-arabic.pdf, remote/mustang/dwc-weasyprint-facturx-extended-pdfa4f.pdfGenerate here2

M12.1​

NeedWhyNearest in the corpus todaySourcePriority
Third-party HTML templates made for paged media with the PDF their own engine made (e.g. the WeasyPrint project's samples, Paged.js examples)Real templates we did not write are the only test of the declared CSS level against what template authors usenone (only our three sources exist)Public source2

M12.2, M12.6​

NeedWhyNearest in the corpus todaySourcePriority
A paged-media edition of the report (running header with the section title, 'page X sur Y', table of contents with target-counter() and dotted leader(), a named landscape annex, page groups, a break-before: right chapter) with WeasyPrint's renderingChromium implements no GCPM, so the three reference sources exercise none of M12.2's paged media or M12.6's cross-references; WeasyPrint is the independent paged-media engine a container can runtests/corpus/sources/report-fr.html and documents/report/chromium-report-fr.pdf (linked TOC without page numbers, no running content)Generate here1

M12.2​

NeedWhyNearest in the corpus todaySourcePriority
A seeded, repeatable long report source for 10, 100 and 1,000 pages, as a streamed source and as one stringThe memory acceptance needs a document whose length is a parameterdocuments/stress/reportlab-journal-1000-pages.pdf (a PDF, no HTML source)Generate here1
A French invoice source with Arabic and Hebrew client names and addresses, an IBAN and amounts inside right-to-left paragraphs, dir=auto cells, in OFL Noto faces, with Chromium's rendering committedThe bidi acceptance otherwise rests on manifest strings alone; W09 still lacks Hebrew and shaped Arabic that may be committedvendor/us-federal/indesign-irs-pub1-arabic.pdf; remote/census/indesign-census-2020-hebrew-guide.pdf; remote/usda/pdfmaker23-usda-title-vi-fact-sheet-hebrew.pdf; remote/py-pdf-sample-files/weasyprint-arabic.pdfGenerate here1
The contract justified and hyphenated (hyphens: auto, French and German) as Chromium and WeasyPrint set itHyphenation has no real rendering to compare with; Pyphen is the only refereedocuments/contract/chromium-contract-fr.pdf (justified, not hyphenated)Generate here2
Korean text, and a CJK paragraph long enough to exercise line-break: strictW09 still lacks Korean; CJK line-breaking strictness has no real textvendor/us-federal/indesign-irs-pub1-chinese-traditional.pdfContribution3

M12.3​

NeedWhyNearest in the corpus todaySourcePriority
A multi-page invoice source (120+ lines over 3+ pages, repeated thead/tfoot, carried-forward subtotals, fixed footer, per-invoice page X of Y) with Chromium and LibreOffice renderingsThe long-invoice case is absent; the corpus invoice is one page, so repeated footers and carried-forward subtotals have nothing to be accepted ontests/corpus/sources/invoice-fr.html, documents/invoice/chromium-invoice-fr.pdf (1 page)Generate here1
A real multi-page invoice or statement from an ERP report writer that carries subtotals forward (a reporter / report / Übertrag)Shows the convention our -adc-sum vendor extension imitates, as ERPs actually print itvendor/jasper-modular/openpdf-jasperreports-financial-statement.pdf, remote/pdfminer/afp-batch-processor-bank-statement-2b.pdf (neither known to carry subtotals forward)Contribution2

M12.5​

NeedWhyNearest in the corpus todaySourcePriority
Charts as chart libraries write them in SVG (matplotlib's SVG backend, a Vega-Lite chart via vl-convert) with Chromium's renderingThe SVG acceptance needs real tool output: nested groups, transforms, clip paths, text labelsnone (no SVG-sourced chart in the corpus)Generate here1
Image files as HTML meets them: WebP lossy and lossless, animated GIF, BMP, PNG with alpha / 16-bit / interlaced, CMYK JPEG with ICC profileThe Skia path and M07 pass-through need files, not streams inside PDFs (EXIF orientations are already M07's gap)dct-image, flate-image and jpx streams inside corpus PDFsGenerate here2

M12.6​

NeedWhyNearest in the corpus todaySourcePriority
One thousand seeded invoice records (JSON Lines) with varied line counts for the invoice templateThe CI-enforced throughput budget of the roadmap needs a batchnone (invoice-fr.html is a single record)Generate here1
A one-page letterhead PDF (vector logo, address block, colored band)The @page background and <img src=...pdf> rows need the business case they exist for (also M09's gap)noneGenerate here1
Puppeteer probes: the invoice and report printed by Chromium through pinned Puppeteer with header/footer templates and each option combination the mapping namesThe page.pdf() mapping is accepted against what Puppeteer actually printsdocuments//chromium--fr.pdf (printed with --print-to-pdf, no header/footer templates)Generate here1

M12.7​

NeedWhyNearest in the corpus todaySourcePriority
A legal memorandum source with footnotes (per-page numbering, a note long enough to continue, notes in a table) with WeasyPrint's renderingM12.7's footnotes have no source; WeasyPrint is the peer that implements GCPM footnotesnoneGenerate here1
General terms of sale in three small-print columns over two pages with spanning headings, and Chromium's renderingThe standard back-of-invoice multicol case, beyond the report's short two-column annexdocuments/report/chromium-report-fr.pdf page 4 (two-column-text annex)Generate here1
A real French memorandum or 'conclusions' with footnotes exported by WordWord's footnote layout is what French legal readers expectdocuments/invoice/word-invoice-fr.pdf (Word, no footnotes)Contribution2
Output of commercial paged-media engines (Prince, PDFreactor, Antenna House) on the paged-media reportA second peer for GCPM semantics where WeasyPrint and the specification leave room (footnotes, page groups)noneContribution3

M13​

NeedWhyNearest in the corpus todaySourcePriority
Our engine's renderings of the three reference sources (documents/invoice/adcodicem-invoice-fr.pdf, documents/report/adcodicem-report-fr.pdf, documents/contract/adcodicem-contract-fr.pdf), committed untagged by M12, then regenerated tagged by M13Every M13 acceptance row (veraPDF PDF/UA-1, structure order vs source order, two-column annex reading order) is written against themdocuments/invoice/chromium-invoice-fr.pdf, documents/report/chromium-report-fr.pdf, documents/contract/chromium-contract-fr.pdf (Chromium's, untagged)Generate here1
An accessibility reference source (sources/accessibility-fr.html + images): img with and without alt, SVG with <title>, figure/figcaption, nested ul/ol/dl, a table with caption, rowspan, colspan, scope and headers breaking across pages, footnotes, a target-counter() contents, links broken across lines, abbr, q, code, blockquote, lang passages in English, German and Arabic, generated content with and without alt text, a barcodeThe three existing sources have no image, figure, footnote, nested list, complex table, abbreviation or foreign-language passage; 'every image carries alternative text' cannot be tested on themsources/report-fr.html (nav list of links, thead table, ol, two-column annex); sources/invoice-fr.htmlGenerate here1
A layout-div version of the invoice (sources/invoice-fr-divs.html) with the -adc- stylesheet that tags itThe CSS-override acceptance compares its structure with the semantic invoice'ssources/invoice-fr.htmlGenerate here1
A set of faulty templates derived from the reference sources: no alt, h1 then h3, empty link, no <title>, no lang, a remapped standard typePDF/UA-1 conflicts under Refuse and RemoveClaim must be shown exactly on documents a template author would writenoneGenerate here1
veraPDF's PDF/UA-1 verdict recorded in the manifest for every document claiming PDF/UA (claimsUa and uaConformanceValid, beside claimsConformance and conformanceValid, which cover PDF/A only; M13's slice 9)The referee's pinned container must be calibrated on third-party UA claims before it judges ours; the three upheld claims are stated in prose onlyvendor/pdf-association/pdflib-pps-kraxi-pdfa2a-pdfua1-invoice.pdf, indesign13-pdfua1-german-book-chapter.pdf, indesign15-pdfua1-form.pdf (claims, no recorded UA verdict)Generate here2
The reference sources rendered tagged by Chromium and exported by LibreOffice 24.2 with its PDF/UA optionOther producers' tagging decisions on the same content, to compare ours with and to arbitrate when veraPDF and poppler disagreedocuments//chromium--fr.pdf and documents//libreoffice--fr.pdf (untagged)Generate here2
A committed PDF/UA-1 document from a producer other than Adobe, PDFlib and AbleDocsThe structure reader's calibration and M06's merge of tagged outputs rest on two committed producersthe three vendor/pdf-association PDF/UA-1 files (PDFlib, InDesign x2)Generate here3
A tagged PDF/UA-1 document in a right-to-left script (Arabic or Hebrew)The slice-7 decision on right-to-left ActualText is checked on our output onlyvendor/us-federal/indesign-irs-pub1-arabic.pdf (tagged, /Lang wrongly en-US, no UA claim)Public source3

M14​

NeedWhyNearest in the corpus todaySourcePriority
Factur-X facts per hybrid in the manifest (expect.facturx, M14's slice 7): flavor, profile, version or Unknown, attachment name, AFRelationship, SHA-256 of the embedded XMLAcceptance must compare with expectations established from the file and independent tools (Akretion's factur-x, qpdf --show-attachment), not from our reader; today only expect.attachments names are recordedexpect.attachments on the 16 hybrids; features such as factur-x-en16931, zugferd-1, xrechnung-profileGenerate here1
Our own Factur-X invoices for each profile (MINIMUM to EXTENDED, XRECHNUNG) and current version, at PDF/A-3b and 3a+UA-1, plus our renditions of received XML, committedWhat we produce must be as readable as what we consume; M15, M19, M26 accept on themdocuments/invoice/qpdf-invoice-with-facturx-xml.pdf (a stub: undeclared ram: prefix, no PDF/A claim, no /AF)Generate here1
Standalone XML invoices: CII (D16B and later), UBL 2.1 invoices and credit notes, XRechnung 3 in CII and UBL, ZUGFeRD 1 — described through M07's xml formatThe rule differential against the KoSIT validator and the UBL rendition need XML inputs the corpus holds only inside PDFsthe XMLs embedded in the corpus hybrids (mostly CII; one UBL payload in remote/zugferd-corpus/itext9-facturx-ubl-payload.pdf)Public source1
Negative XML variants, one per rule family (BR-CO totals, VAT categories, BR-CL code lists, BR-DEC, BR-FR, BR-DE, each profile's restrictions), derived by recorded editsA differential harness fed only valid invoices proves only that both sides stay silentnone (the weclapp one-cent gap is between page and XML, not an XML rule failure)Generate here1
Factur-X 1.08/1.09 (ZUGFeRD 2.4/2.5) samples and an EXTENDED-CTC-FR sampleThe current versions, the French reform's profile, and the elements only they defineremote/mustang/dwc-weasyprint-facturx-extended-pdfa4f.pdf and -no-fx-xmp.pdf (2025)Remote corpus2
A Factur-X actually sent by a supplier's ERP, anonymized, that may be committed (W07)Every real ERP hybrid found carried personal data or is remote; a committed one keeps acceptance in the main CI jobvendor/zugferd/itext-pdfbox-weclapp-facturx-en16931-invoice.pdf (test tenant), vendor/docentric/aspose-d365-facturx-extended-invoice.pdf (demo data)Contribution2
An XRechnung XML together with KoSIT's own visualization of itTo compare the rendition's field coverage with the official visualization, field by fieldvendor/zugferd/fop26-xrechnung-visualization.pdf (no XML beside it)Public source2
veraPDF's PDF/UA-1 verdict recorded in the manifest for every PDF/UA claimThe dual PDF/A-3a and PDF/UA-1 claim needs its referee calibrated on PDFlib's invoice and the other claimsthe three committed vendor/pdf-association PDF/UA-1 claims, no UA verdict recordedGenerate here (M13's gap)2
A PDF/A-3a with PDF/UA-1 Factur-X from another producerThe dual claim is otherwise compared only with PDFlib's A-2a+UA-1 invoice and Symtrax's A-3a without UAvendor/pdf-association/pdflib-pps-kraxi-pdfa2a-pdfua1-invoice.pdf; remote/zugferd-corpus/symtrax-itextsharp-zugferd21-minimum-pdfa3a.pdfContribution3
A PDF/A-3 with non-XML associated files (a source office document, a CSV) from another producerAssociated files other than invoice XML are checked on our output onlyvendor/verapdf/pdfa3b-embedded-pass.pdf, vendor/bfo/bfo-pdfa2b-embedded-pdf.pdfGenerate here3

M15​

NeedWhyNearest in the corpus todaySourcePriority
An untagged twin of the two-column report (Chromium's printToPDF with generateTaggedPDF false, or the tagged file with its structure tree stripped by a recorded pikepdf transformation), plus untagged multi-column pages with a known order (two and three columns, full-width headings between column sets)Every committed multi-column page is tagged, so the roadmap's two-column acceptance would test the structure tree and never the layout analysis; the only untagged two-column article is remotedocuments/report/chromium-report-fr.pdf (two-column-text, tagged); remote/opf-format-corpus/jhove-hul-129-latex-distiller705-journal-article.pdf (untagged, remote)Generate here1
Text inside an optional-content group that is off by default, and inside a group shown only when printing'Hidden layers honored' has nothing to hide: the committed hidden groups draw boxes, the committed Watermark and HeaderFooter groups are onvendor/pdf-association/handwritten-utf16le-strings.pdf (two groups off, boxes only); vendor/uk-ogl/pdfmaker21-ozev-sample-invoice.pdf (Watermark, on); remote handwritten-pdf20-utf8-strings.pdf and the USGS topo map's 31 layers (to be examined)Generate here1
Documents with hyphenated line breaks (hard hyphens at line ends and soft hyphens) in French and English: LibreOffice with automatic hyphenation from an ODT source, Chromium from HTML with ­Search across hyphenated line breaks is a roadmap deliverable and acceptance, and no committed document hyphenatesremote/pdf-association/indesign-cs6-pdfua1-brochure.pdf (soft-hyphen-in-extracted-text, remote)Generate here1
Manifest fields M15 reads: expect.readingOrder, expect.tables, expect.images (from pdfimages -list), expect.hiddenText, expect.textlessPages, written by build_corpus.py or recorded from a person's reading with its reasonExpectations must come from the file and an independent tool, never from our reader; textContains and hasExtractableText alone cannot state order, tables, images or mixed scanned/text documentsexpect.textContains, expect.hasExtractableText, expect.attachmentsGenerate here1
The decrypted twin (qpdf --decrypt, a recorded transformation) of vendor/jp-nta/indesign-distiller18-nta-gift-tax-vertical.pdf, with textContains recorded from MuPDF and confirmed by a readerThe only vertical Japanese document without ToUnicode, the case the predefined CMaps exist for, is AES-128-encrypted under an empty user password (unreadable until M16) and has no text expectationvendor/jp-nta/indesign-distiller18-nta-gift-tax-vertical.pdf (encrypted, no textContains)Generate here1
textContains for the 22 committed documents that have none, the 1000-page journal among them'Text matches the manifest' asserts nothing on themdocuments/stress/reportlab-journal-1000-pages.pdf, the qpdf derivatives, the veraPDF fixturesGenerate here2
Korean text, and CJK text in non-embedded fonts through predefined CMaps, that may be committedThe Adobe-Korea1 map has no committed case; the non-embedded CJK fonts are Foxit's, remotevendor/us-federal/indesign-irs-pub1-chinese-traditional.pdf (CID-keyed CFF); remote/pdfium-tests/foxit-phantompdf-certification-signature-visible.pdf (non-embedded CJK)Contribution2
Tables with merged cells, ruled and unruled, untagged; and a tagged table with RowSpan/ColSpan attributesSpans are where table detection fails, and no committed table has themdocuments/invoice/chromium-invoice-fr.pdf, vendor/pdf-association/pdflib-pps-kraxi-pdfa2a-pdfua1-invoice.pdf, vendor/jasper-modular/openpdf-jasperreports-financial-statement.pdf (no spans)Generate here2
A real supplier invoice or bank statement, untagged, with a line-item table, that may be committedLine-item detection is proven on our own invoice and published samples; every real one found is remoteremote SAP NetWeaver, Axapta, Scoro, AFP statement; committed JasperReports and weclapp samplesContribution2
Text made invisible by other means than render mode: white on white, outside the crop box, clipped awayThe visibility flags feed M19's sanitization and guard against prompt injection hidden in documents sent to language models; the corpus only has render modes 3 and 7OCR layers in render mode 3 (hp-mfp-acrobat-ocr, Xerox copiers); remote photoshop-cc2015-pdfx3-cmyk.pdf (mode 7)Generate here2
Bates numbers applied by another tool (Acrobat, an e-discovery platform)Chunk anchors are proven on M09's own marks onlynone (M09 generates ours)Contribution3
A math-heavy article with inline formulae, from LaTeX and from WordFormula extraction is not promised, but its failure mode (order and spacing) should be observedremote pdfTeX dissertations (jhove-hul-138, jhove-hul-80)Public source3

M16​

NeedWhyNearest in the corpus todaySourcePriority
Decrypted twins of the six committed encrypted documents that have no unencrypted sibling: IRS 9465 (RC4-40), the PDFWriter 3 DMCA summary (RC4-40), HMRC IHT205 (RC4-128), the NTA gift-tax return, USCIS AR-11 and DoD DD 293 (AES-128)The roadmap's 'content matches the unencrypted twin it was derived from' has nothing to compare with on these six; M11 already lists the AR-11's twin as its own priority-1 gapvendor/us-federal/distiller2-irs-9465-1996-rc4-40.pdf, vendor/us-federal/pdfwriter3-copyright-office-dmca-summary-1998-rc4-40.pdf, vendor/uk-ogl/pagemaker-distiller5-hmrc-iht205-form.pdf, vendor/jp-nta/indesign-distiller18-nta-gift-tax-vertical.pdf, vendor/us-federal/livecycle-uscis-ar11-xfa-form.pdf, vendor/pikepdf/livecycle-dod-dd293-aes128-xfa.pdf (the encrypted originals); qpdf --decrypt as a recorded build_corpus.py transformationGenerate here1
A document encrypted with the public-key security handler (adbe.pkcs7.s4 and s5; RC4-128, AES-128, AES-256), with its fictitious test certificate and key, and its unencrypted twinThe roadmap's acceptance 'a public-key-encrypted one is reported, never misread' has no document; the key-source seam and M26's decryption need the same fixturenone; pyHanko's MIT test data (to be screened for a public-key file), otherwise generated with pyHanko's public-key handler over its fictitious PKI; an Acrobat certificate-security file as a contributionPublic source1
AES-256-GCM (ISO/TS 32003) and integrity-MAC (ISO/TS 32004) documents, standalone and attached to a signature, their twins, and copies tampered by a recorded byte flip inside and outside an encrypted stringReading GCM and the MAC is a deliverable; invariant 10 wants it proven on files another implementation wrote, and the tampered copies prove content is withheld when a tag failsnoneGenerate here1
AES-256 R6 documents under non-ASCII passwords (accented, German sharp s, CJK, and one SASLprep maps)SASLprep and the UTF-8 password path of R6 are otherwise untested; the only R6 file uses an ASCII passworddocuments/secured/qpdf-invoice-aes256.pdf (R6, password 'corpus')Generate here1
Filled versions of the committed AcroForms (subscription form, SS-4, N208, Cerfa 13983, Cerfa 12156, InDesign PDF/UA form, I-9) with fictitious values, filled by an independent tool (pdftk-java fill_form from a recorded XFDF); the hybrid XFA forms filled through their AcroForm only by pypdf, leaving the XFA staleThe roadmap's XFDF acceptance needs 'a filled corpus form'; flattening needs third-party fills; the stale hybrids are form.xfa-out-of-step's documentsthe blank committed AcroForms; the filled XFA form inside remote/opf-format-corpus/acrobat9-portfolio-signed-3d.pdf (remote, XFA only)Generate here1
A DocMDP P=2 certified form filled after certification, one with a FieldMDP lock over some fields, and the same before the fillPermitted and forbidden fills of a certified form have no document; M04 records the same gapvendor/us-federal/itext-govinfo-us-code-certified.pdf (P=1, no fillable field); remote/eu-dss/pdfmaker11-nbu-sk-qualified-seal-docmdp-fieldmdp.pdf (P=2 with a lock, no form to fill)Generate here1
An AES-256 R5 document (Adobe extension level 3)R5 is read but never written; no file exercises its SHA-256 key derivationdocuments/secured/qpdf-invoice-aes256.pdf (R6)Generate here2
Committed documents with attachments-only encryption (/EFF), a /Crypt filter on a single stream, and EncryptMetadata falseThe crypt-filter read paths and the write options need committed documents; only the remote Adobe Sign file covers EncryptMetadata false and the Identity filter, on the nightly runremote/pdfcpu-issues/adobe-sign-certified-aes128-test-agreement.pdfGenerate here2
An unencrypted wrapper document (ISO 32000-2 §7.6.7, Table 28), shaped as Microsoft Purview writes them, ideally a real Purview-protected file with fictitious contentWrapper recognition and payload exposure must be proven on a file shaped by the real producer, not only oursnoneGenerate here2
The 1000-page journal encrypted under AES-256 and RC4-128Decryption's memory and throughput budgets need a large encrypted documentdocuments/stress/reportlab-journal-1000-pages.pdfGenerate here2
Forms with multi-select list boxes, push buttons carrying SubmitForm and ResetForm, a rich-text field with a value, password and file-select fields, and AFPercent, AFTime, AFRange_Validate, AFSpecial_KeystrokeEx scriptsNo committed form has a list box, and these field types and formats are otherwise tested on synthetic fixtures onlythe committed AcroForms (text, check, radio, combo, push, signature; AFNumber, AFDate, AFSpecial, AFSimple_Calculate)Generate here2
A Reader-extended form filled and saved by Adobe Reader, and a hybrid XFA form filled and saved by AcrobatWhether an incremental fill within UR3 grants keeps Reader's features, and whether Acrobat re-merges datasets it did not write, are asserted structurally only; no container runs Reader or Acrobatvendor/uk-ogl/indesign-acrobat-hmcts-n208-form.pdf, vendor/us-federal/livecycle-irs-1040-2022-xfa-ur3.pdf (blank)Contribution2
FDF and XFDF exchange files written by Acrobat and by pdftk-java, beside the forms they belong toThe exchange formats have no committed samples; they enter the manifest through M07's fdf and xfdf formats, beside the forms they belong tononeGenerate here2
A form whose calculation uses Acrobat's simplified field notation (/** BVCALC … EVCALC **/)Recognizing it is deferred until a real document carries onevendor/uk-ogl/pagemaker-distiller5-hmrc-iht205-form.pdf (17 custom calculation scripts)Contribution3
Right-to-left and CJK values in text and comb fields of a third-party formThe shaping report of M16's core appearance generator is checked on our own fills onlyvendor/jp-nta/indesign-distiller18-nta-gift-tax-vertical.pdf (CJK, no fields)Contribution3
A form of ten thousand fieldsFill and appearance budgets need a form larger than Cerfa 12156's 419 widgetsvendor/fr-licence-ouverte/pdfmaker-acrobat-cerfa-12156-form.pdfGenerate here3

M17​

NeedWhyNearest in the corpus todaySourcePriority
Three HTML form templates: sources/subscription-form-fr.html (the ReportLab form's fields and labels), sources/onboarding-pack-fr.html (every mapped and unsupported control, fieldsets, every label source, required/readonly/disabled/maxlength, a password with a value, non-ASCII radio values, a multi-select, optgroups, reset and submit buttons, a rotated control, a textarea taller than a page, an unlabeled control), and the contract template (sources/contract-fr.html with two signature blocks and initials in a running footer)Every M17 acceptance row is written against them; no corpus source contains a single form controltests/corpus/sources/contract-fr.html; documents/form/reportlab-subscription-form.pdfGenerate here1
Static renderings of the three templates by our engine as approved reference images, and their interactive renderings committedThe visual rows compare interactive with static output; M12's approved references contain no controldocuments//adcodicem--fr.pdf (M12's reference renderings, no controls)Generate here1
The same templates rendered by WeasyPrint with pdf_formsA second HTML engine's fields to compare names, types and rectangles with, and a third-party generated form for M16 to readnoneGenerate here2
A PDF/UA-1 form from an authoring tool with a list box, a push button and a signature field, whose claim veraPDF upholdsThe tagging shape of those three field types is otherwise checked on our own output onlyvendor/pdf-association/indesign15-pdfua1-form.pdf (text, combo, check, radio)Contribution2
Chromium's print of the three templatesHow a browser prints the same controls statically, beside M12's renderingnoneGenerate here3
A form template with right-to-left values and dir="rtl" controls (Arabic, Hebrew)Alignment (/Q) and shaped values in right-to-left scripts are checked on unit fixtures onlyM13's accessibility reference source (Arabic passage), not yet committedGenerate here3

M18​

NeedWhyNearest in the corpus todaySourcePriority
EML messages covering every construct the converter handles: HTML and text alternatives, inline cid: images, PDF, image and office attachments, a forwarded message/rfc822, encoded-word subjects in UTF-8 and ISO-8859-1, quoted-printable and base64, format=flowed, a remote tracking image, a multipart/signed messageThe roadmap's acceptance 'the corpus e-mails convert to pieces' has nothing to run on: the corpus holds PDFs onlynoneGenerate here1
Outlook MSG files with an HTML body, an RTF-encapsulated HTML body, and a plain-text body, with attachments and an embedded messageMSG parsing (MS-CFB, MS-OXMSG, LZFu, RTF de-encapsulation) needs real Outlook output as oracle inputnonePublic source1
A manifest and schema able to describe non-PDF inputs (.eml, .msg) with expectations of their own: headers, body strings, attachment names and digests; and a message use caseDone by M07 for every format (decided 2026-09-27); M18 adds the message category to the use-case enum with its first messagesM07's gap for image filesGenerate here (M07's slice 8)1
French pleadings (conclusions) citing pieces in every form: 'pièce n° 12', 'pièces nos 3 à 5', '(pièce 2.1)', '12 bis', across line breaks and hyphens, in a table and a footnote, beside 'pièce adverse n° 4' and 'pièces justificatives', from Chromium, LibreOffice and Word, with the expected references recordedLinking references to pieces is a roadmap deliverable and no corpus document cites piecesnone; M09's stamped volumes contain 'Pièce n°' only in our own stamps, which must never be linkedGenerate here1
Real e-mails as received from Outlook, Gmail's export, Thunderbird and Apple Mail, anonymizedEach client writes MIME its own way; generated messages prove the parser, not the clients' quirksnoneContribution2
Image files (JPEG, TIFF, PNG) as case-file piecesPhotographs and scanned TIFFs are ordinary pieces and go through M07's image pagesimage streams inside committed PDFs only (M07's gap)Generate here2
A case file made by the tools French lawyers use (Kleos, Hub-Avocat, Acrobat by hand): a bordereau and stamped piecesThe verifier should read a real bordereau and the presets' defaults should match what practitioners filenone (M09 lists stamped pieces at the same priority)Contribution3
A filing a court portal refused, with the portal's messageThe strongest test of a preset rule is a real rejection it would have caughtnoneContribution3
A piece larger than the size caps the portal presets encodeThe size rule meets real documents only above 2 MB, which cannot be committedremote/opf-format-corpus/jhove-hul-117-acrobat101-student-design-report.pdf (15 MB), remote/govinfo/us-code-2023-title42.pdfRemote corpus3

M19​

NeedWhyNearest in the corpus todaySourcePriority
PII fixtures: fictitious IBANs, NIRs (with 2A/2B), SIRENs, SIRETs (La Poste's among them), e-mails, French and E.164 phone numbers, dates of birth with cues, valid and invalid twins, in body text, tables, across line breaks and hyphens, with U+202F spaces, and again in form fields, annotations, an outline item, /Info, XMP, alt text and an attached XML, from Chromium, LibreOffice and Word, with expect.detectionsDetector acceptance needs documents whose truth is known; the only real-looking values in the corpus (the invoice's client SIREN 552 041 319 and IBAN FR76 3000 4008 2800 0123 4567 890) fail their check digits, and real personal data may never be committedinvoice sources (SIREN 123 456 824 and VAT FR40123456824 valid); Factur-X XML IBANs in mustang-zugferd2-en16931-invoice.pdf and aspose-d365-facturx-extended-invoice.pdfGenerate here1
Redactions done wrong: a black rectangle over live text; a name replaced in an incremental update with the old revision still holding it; a document whose earlier revision holds a term the current one still shows'Absent from every earlier revision' and hidden.text-covered need the failures they exist forvendor/us-federal/illustrator-irs-pub1-english.pdf (earlier revision draws text the current does not); remote print-to-pdf-border-force-poster-updated.pdf (/Info replaced)Generate here1
Concealed text: white on white, text under 1 pt, text off the page, text clipped away, text under an opaque shapeThe InvisibleText category and five hidden.* rules have no committed case beyond render modes 3 and 7; also the prompt-injection channelOCR layers in render mode 3 (Xerox, HP/Acrobat, FineReader); remote Photoshop render mode 7Generate here1
SubmitForm, ImportData, GoToE, Named actions beyond navigation (Print), Hide, SetOCGState, and JavaScript in a link and an outline itemThe roadmap names launch and submit actions; a pikepdf walk of the committed corpus finds one Launch action and no SubmitForm or ImportDatavendor/opf-format-corpus/pdfmaker9-word-distiller-external-link.pdf (Launch), make-pdf-javascript-openaction.pdf, the Cerfa and USCIS forms' scriptsGenerate here1
/Redact annotations left unapplied by Acrobat (OverlayText, Repeat, RO) and the same document after Acrobat applied themApplying others' marks is in scope and Acrobat's applied result is what users compare with; only PyMuPDF's marks can be generatednoneContribution2
A lossless (Flate or LZW) scan with text in its pixels, with and without an OCR layerPixel redaction before M22 is otherwise proven on logos, photographs and Word's text-as-images, not on a scanvendor/fr-licence-ouverte/word365-dila-text-drawn-as-images.pdf (text as soft-masked Flate images)Generate here2
A JPEG carrying fabricated GPS coordinates in its EXIF, made a pagehidden.image-location has no case; a phone photograph is the ordinary exhibitEXIF without GPS in the JPEGs of livecycle-uscis-ar11-xfa-form.pdf, the two Legilux files and the DILA noticeGenerate here2
RichMedia (Flash) and 3D annotations in a committed documentThe rich-media category is proven only on the remote portfolioremote/opf-format-corpus/acrobat9-portfolio-signed-3d.pdf; committed Screen+Rendition in pdfmaker9-word-distiller-embedded-quicktime.pdfPublic source2
A tagged PDF 2.0 document, ideally PDF/UA-2The /Redaction pagination-artifact subtype exists only in 2.0 outputnone committed (M09 lists the same need)Public source2
Type 1 and CID-keyed CFF subsets whose glyphs a redaction leaves unusedGlyph scrubbing is proven on TrueType first; Type 1 is reported, CFF charstrings replacedpdfmaker707-word-law-library-iraq-legal-history.pdf (Type 1 subsets), indesign-irs-pub1-chinese-traditional.pdf (CID-keyed CFF)Generate here3

M20​

NeedWhyNearest in the corpus todaySourcePriority
veraPDF's failed rules (specification, clause, test) per document under its claimed levels and under the 2b and ua1 differential flavors for every document, with veraPDF's version, plus a manifest field recording a disagreement with its reasonThe acceptance compares rule by rule and says disagreements are recorded in the manifest; conformanceValid holds one booleanexpect.claimsConformance / expect.conformanceValid on 49 entriesGenerate here1
Every claim a document makes (PDF/A and PDF/UA together) with each verdict, as a list-valued field; includes recording the PDF/A-4 claim (pdfaid part 4, rev 2020) of vendor/verapdf/pdf20-version-mismatch.pdf, which the manifest omitsPDFlib's invoice claims PDF/A-2a and PDF/UA-1 but the schema holds one; six of the seven committed PDF/UA claims exist only as features, and LibreOffice's Cerfa's not at all; one PDF/A-4 fail fixture escapes the claimed-document rowclaimsConformance (single string); features pdfua-1-claim, pdfua1-claim, pdfua-claim, pdfua-1-claim-xmp, pdfua-claim-invalid-conformance-bGenerate here1
Pass and fail fixtures for each (clause, test) of veraPDF's profiles for PDF/A-1a to 4f and PDF/UA-1Nine fixtures cannot show that a hundred-odd rules per part fire exactly where they should; the veraPDF corpus encodes the verdict in each file namevendor/verapdf/* (8 files), vendor/bfo/bfo-pdfa2b-embedded-pdf.pdfPublic source1
Our own PDF/A-2b, 2u, 2a and 2a+PDF/UA-1 renderings of the reference documents, committedOur output must be judged first (ADR 17) and later milestones (M21, M26, M28) accept on itdocuments/archival/libreoffice-report-pdfa2b.pdfGenerate here1
Third-party PDF/A-2u and PDF/A-4e documents, and committed PDF/A-3a and PDF/A-4f ones2u has no document at all; 3a and 4f exist only remote; 4e not at allremote/zugferd-corpus/symtrax-itextsharp-zugferd21-minimum-pdfa3a.pdf, remote/mustang/dwc-weasyprint-facturx-extended-pdfa4f.pdfGenerate here2
The other 33 files of BFO's PDF/A-2 suite (CC BY 3.0)A second fixture author for part 2, independent of veraPDFvendor/bfo/bfo-pdfa2b-embedded-pdf.pdfPublic source2
The Isartor test suite (PDF/A-1b)Historical part-1 reference suite and the calibration of PDFBox Preflight, the second-opinion refereevendor/verapdf/pdfa1b-annotations-pass.pdf, pdfa1b-forms-fail.pdfRemote corpus2
A PDF/A-2b document with a CMYK output intent that veraPDF upholdsThe merge's DefaultCMYK path and cross-family conflict have only a rejected CMYK claimvendor/eu-publications/distiller10-eu-consolidated-regulation-2015.pdf (rejected)Generate here2
A PDF/A-1b and a PDF/A-2b AcroForm that veraPDF upholdsFills on PDF/A-1 files (CharSet in appearance fonts) are otherwise tested only on the failing fixturevendor/verapdf/pdfa1b-forms-fail.pdfGenerate here2
A signed PDF/A-2 or 3 document with veraPDF's verdictpdfa-signature rules and the clauses left to the signing satellite have no document; every signed claim is part 1remote/boe/* (PDF/A-1a, signed)Public source2
Tagged documents with deliberately poor alternative text, a bold paragraph posing as a heading, an artifact holding real contentThe review-item suspicion heuristics need documents where they must fire and must stay silentcommitted tagged documents (56)Generate here3
Members of the PDF/UA Reference Suite 1.1 no pass has screenedMore PDF/UA-1 claims from other producersvendor/pdf-association/pdfua1, remote/pdf-association/*Public source3

M21​

NeedWhyNearest in the corpus todaySourcePriority
For each non-conforming corpus document, its expected conversion outcome: the level veraPDF accepts after conversion, or the hand-reviewed reasons it cannot be converted (a manifest field)The first acceptance row compares with recorded expectations, not with our converter's outputexpect.conformanceValid, expect.unsupportedGenerate here1
Documents whose missing font is freely available (DejaVu, Noto, Liberation) and not embedded, derived by removing the program with a recorded pikepdf transformationThe lossless exact-face registry path has no document: every missing font in the corpus is proprietarynot-embedded documents (27 committed, 20 remote)Generate here1
A document drawing DeviceRGB and DeviceCMYK with no output intent, and one drawing only DeviceCMYK (ReportLab)Two branches of the output-intent decision table have no documentvendor/eu-publications/distiller10-eu-consolidated-regulation-2015.pdf, vendor/us-federal/illustrator-irs-pub1-english.pdfGenerate here1
A CMYK ICC profile whose terms allow redistribution unmodified, vendored for the testsThe CMYK conversion branches need a profile the caller would supplynonePublic source1
Derived variants each carrying one harmless forbidden feature: Interpolate true, TR in ExtGState, /Alternates, /OPI, PostScript XObject, reference XObject, halftone type 6, undefined operator outside BX/EX, 128-byte resource name, 40,000-byte content stringRemedies and the pages they change must be proven on documentsnoneGenerate here2
Symbol and ZapfDingbats not embedded, and a symbolic TrueType not embeddedThe symbolic font path must refuse without a registered face and succeed with onenon-embedded-standard-14-in-acroform-dr documentsGenerate here2
A non-PDF/A PDF attached to a document to be converted to part 2Recursive attachment conversion has only BFO's PDF/A attachment, which needs nonevendor/bfo/bfo-pdfa2b-embedded-pdf.pdfGenerate here2
Real case-file exhibits we may commit: a scanned letter, an e-mail printed to PDF, a contract signed by a commercial serviceThe case-file acceptance row assembles corpus documents not chosen as exhibitsW03 and W05 documents in the corpusContribution2
A signed document with a sub-filter part 2 forbids (adbe.x509.rsa_sha1) that the reader supports todayThe only one is recorded unsupported until M23 (#47), so no acceptance row can name itremote/pdfcpu/acrobat-web-capture8-x509-rsa-sha1-signed.pdf (unsupported, #47)Public source2
A committed non-embedded CJK CID font document with its exact face available (Chromium + Noto CJK, program removed)The Identity-H exact-face path is proven only on remote files and never with the face at handremote non-embedded-cjk-cid-font documents (3)Generate here3
A committed rich-media or 3D documentThe part-3 kept-aside path for 3D and RichMedia is proven only remotelyremote/opf-format-corpus/acrobat9-portfolio-signed-3d.pdf; committed pdfmaker9-word-distiller-embedded-quicktime.pdf covers video onlyPublic source3

M22​

NeedWhyNearest in the corpus todaySourcePriority
hOCR, ALTO and TSV of the committed image-only scans from a pinned Tesseract (French and English models), committed under tests/corpus/sources/ocr/, with a manifest field naming them and the engine's versionThe text-layer and PDF/A-2u rows need recognized words, and Tesseract's output changes with its version, so the sidecars are committed rather than made at test timethe five committed image-only scans, without sidecars: documents/scan/reportlab-scanned-receipt.pdf, vendor/us-federal/xerox-workcentre-treasury-imf-report-scan.pdf, vendor/us-federal/acrobat3-import-irs-1040-1988-scan.pdf, vendor/opf-format-corpus/imagemagick-false-pdfa1b-jpx.pdf, vendor/pikepdf/scanner-ccitt-endofline.pdfGenerate here1
JBIG2 streams with the segment types no committed document uses: refinement, pattern dictionaries and halftone regions, Huffman-coded symbol dictionaries and text regions, custom tables, MMR generic regions, intermediate regionsThe FORCEDENTRY class of fault lives in these paths, a decoder proven on two segment types is not proven, and the fuzzing campaign needs them as seedsthe four committed JBIG2 documents (vendor/us-federal/xerox-workcentre-treasury-imf-report-scan.pdf, xerox-workcentre-5755-ocr-hud-fonsi-mrc.pdf, xerox-workcentre-5335-ocr-hud-fonsi-linearized.pdf, docusign-pdfkit-gsa-sf30-contract-modification.pdf): symbol dictionaries, arithmetic text regions and generic regions onlyPublic source1
JPEG 2000 beyond the one committed file: reversible 5/3, raw codestreams, subsampled components, palettes, cdef opacity with /SMaskInData 1 and 2, 16-bit, sYCC, four components, every code-block style and progression order, POC, PPM and PPT, region of interestOne committed JPX cannot prove a decoder, and the remote ones are tested only nightlyvendor/opf-format-corpus/imagemagick-false-pdfa1b-jpx.pdf; remote/pdfjs/acrobat8-jpx-precincts-issue5475.pdf, remote/pdf-association/abledocs-pdfua1-textbook-chapter.pdf (soft mask), remote/usgs/omnipage-usgs-professional-paper-1-1902.pdfGenerate here1
Scans turned by 90, 180 and 270° without /Rotate, with and without a text layer, and one with a landscape table on portrait pagesThe orientation rows have nothing to turn: every committed rotated page is already upright as displayedvendor/us-federal/xerox-workcentre-5755-ocr-hud-fonsi-mrc.pdf (deskewed image matrix), vendor/us-federal/docusign-pdfkit-gsa-sf30-contract-modification.pdf (/Rotate 270), remote/ocrmypdf/epson-scan-indirect-rotate.pdf (indirect /Rotate)Generate here1
A copier batch with blank backs and scanned separator sheets, and near-blank pages: a page number alone, a signature alone, punched holes, show-through, speckleOne blank page cannot show the detector's two errors, and M07's separator split waits for a real batchremote/ecan/konica-bizhub-c554e-letter-scan.pdf (one blank page)Contribution1
Manifest fields: decoded-sample hashes on M15's expect.images rows where MuPDF and poppler agree, blankPages, orientation, and the ocr sidecar field beside expectExpectations come from the file and independent tools, and the unit suite asserts pixels without a container only if the hashes are in the manifestnone (M15's expect.images is itself a gap)Generate here1
JPEG in CMYK and YCCK, committed; restart intervals, 4:2:2, 4:1:1 and 4:4:0 sampling, arithmetic coding, a progressive image cut shortThe committed JPEGs are all YCbCr at common sampling; CMYK and damage are remote only; arithmetic coding is absentremote/ocrmypdf/photoshop-cc2015-pdfx3-cmyk.pdf (CMYK with /ColorTransform), remote/pdf-association/abledocs-pdfua1-textbook-chapter.pdf (CMYK)Generate here2
CCITT with /BlackIs1 true, /EncodedByteAlign true, two-dimensional G3 (/K above 0), /EndOfBlock false, and damaged rows under /DamagedRowsBeforeErrorThe committed CCITT is G4 but for one G3 page; every other parameter has unit tests onlyvendor/pikepdf/scanner-ccitt-endofline.pdf (G3 with /EndOfLine); the committed G4 scansGenerate here2
Images in Lab, Separation and DeviceN under type 0, 2 and 3 tint transforms, CalGray, 2- and 4-bit samples, a color-key /Mask array, /Matte soft masksThe color and mask rows name spaces and masks no committed image usesvendor/us-federal/illustrator-irs-pub1-english.pdf (a Separation space); remote/opf-format-corpus/acrobat9-portfolio-signed-3d.pdf (DeviceN, type 4 function); remote/pdfjs/itext5-ccitt-g4-mask-issue4379.pdf (a stencil /Mask)Generate here2
An ALTO file from a commercial OCR engine with its page image (the Library of Congress's Chronicling America; remote when over 2 MB)The ALTO reader is otherwise proven on Tesseract's dialect and M15's own export onlynonePublic source2
Multi-strip TIFFs, bilevel and gray, and a TIFF with FillOrder 2, to joinM07's strip joining is proven on synthetic files onlynone (image files are M07's gap)Generate here3

M23​

NeedWhyNearest in the corpus todaySourcePriority
A stream that decodes past 2 GB: nested Flate over zeros, about 2 MB encodedThe roadmap's acceptance 'under PdfReaderLimits.Unbounded a stream past 2 GB is read whole' needs one; no real file reaches Array.MaxLength, and committing one is pointlessremote/usgs/us-topo-washington-west-2023.pdf (one image decoding to 328,608,000 bytes)Generate here (by the test support at test time, never committed)1
A case file merged from several producers' documents that each subset the same OFL face: the LibreOffice, Chromium and ReportLab renderings of invoice-fr.html merged by qpdf, recorded in build_corpus.pyFont-subset consolidation must be proven on real subsets of one face made by different subsetters; the corpus holds only the negative case, one tag over different programsvendor/us-federal/illustrator-irs-pub1-english.pdf and remote/zugferd-corpus/konik-pdfbox-zugferd1-basic-from-word.pdf (reused-subset-tag); remote/pdf-association/abledocs-pdfua1-tagged-textbook-scan.pdf (placeholder-subset-tag-shared)Generate here1
Independent optimization expectations per committed document, in new expect fields: pikepdf's count of distinct decoded streams and duplicate groups, pdffonts' fonts embedded in full, qpdf's unreferenced objects'Every duplicate and nothing else' must be asserted against what an independent tool found in the file, not against our own optimizerfeature tags only: duplicated-image (remote/pdfminer/sap-netweaver-invoice-issue1062.pdf), duplicate-icc-profile (remote/ocrmypdf/photoshop-cc2015-pdfx3-cmyk.pdf), full-font-embedding, unreferenced-image-objectsGenerate here1
A multi-page color scan at 300 ppi or more, too large for a court portal's size capThe target-size mode exists for this case, and the heavy scans are archival plates, not a lawyer's exhibitdocuments/scan/reportlab-scanned-receipt.pdf; remote/ecan/konica-bizhub-c554e-letter-scan.pdf; remote/usgs/omnipage-usgs-professional-paper-1-1902.pdfContribution2
Headless Chromium's time and peak memory on the reference workloads under the container profile's limits (512 MB, read-only file system, the same OFL fonts)The published container comparison needs its baseline, measured in CI by the comparison benchmarks' reserved Chromium slot; recorded, not committednone (the slot is reserved in benchmarks/AdCodicem.Pdf.Benchmarks.Comparison/README.md, nothing measured)Generate here2
A committed document with uncompressed images and content streams (ReportLab with page compression off)Recompression's largest gain is shown only on remote files, which the main CI job never seesremote/opf-format-corpus/illustrator-distiller601-mac-nida-scholastic-heads-up.pdf (uncompressed-image); the committed LZW documentsGenerate here3
A document linearized by Acrobat with object streams and objects shared across pagesThe shared-object hint table is proven on qpdf's output and old Distiller files onlydocuments/archival/qpdf-linearized-report.pdf; 58 committed linearized files, 26 with inconsistent, broken or stale hintsPublic source3

M24​

NeedWhyNearest in the corpus todaySourcePriority
Edited copies of the generated contract, report and invoice sources (words changed, a paragraph inserted, a clause deleted, an article moved, an amount changed, a reflow across a page break), rendered by Chromium and LibreOffice, edits recorded in build_corpus.py'Exactly the edits made, and nothing else' needs edits known by construction that also reflow text, which in-place edits of a finished PDF never dotests/corpus/sources/*.html and their Chromium/LibreOffice outputsGenerate here1
An edited copy of the 1000-page journal with scattered edits (build_reportlab_stress with a recorded seed)The comparison's memory budget must be measured on a long document with changes, not on a document against itselfdocuments/stress/reportlab-journal-1000-pages.pdfGenerate here1
More supplier invoice families: three or more invoices of one layout from a real ERP, with or without XMLThe template promise is proven on one supplier family (GnuAccounting) and our own invoicevendor/zugferd GnuAccounting family (505, 506, 502, 507); remote DWC generator pairContribution2
A contract draft and the signed version returned by a counterparty, from practiceThe daily redlining case; everything in the corpus is constructed or one-sidednone; signed documents with later revisions (acrobat-reader-signed-twice, legilux memorials)Contribution2
Multi-page invoices whose line items continue across pagesTemplate line items are proven on one-page tables onlyvendor/jasper-modular/openpdf-jasperreports-financial-statement.pdf (4 pages); libreoffice-report-fr.pdf (repeated table headers)Generate here2
Scanned versions of committed documents, and a scan against its born-digital original (recorded Ghostscript rasterization, marked derived)Visual comparison on scans once M25 and M22 existnoneGenerate here3

M25​

NeedWhyNearest in the corpus todaySourcePriority
Shading fixtures: function-based (type 1), axial and radial with and without /Extend, free-form and lattice meshes (types 4 and 5), Coons and tensor patches (6 and 7), colored and uncolored tiling patterns, a shading pattern with /Background — pycairo, ReportLab and recorded pikepdf constructionsThe device implements every type, and invariant 10 wants each proven on a file another implementation wrote; the corpus holds one axial shading, remote, and no meshremote/pdf-association/indesign-cs6-pdfua1-brochure.pdf (axial shading), remote/py-pdf-sample-files/wkhtmltopdf-qt5-html-page.pdf (pattern color space)Generate here1
Transparency fixtures: the sixteen blend modes over a known backdrop, luminosity soft masks with /BC and /TR, nested groups, a knockout group, CSS opacity and mix-blend-mode from a browserOnly multiply is in the corpus, remote; knockout groups, luminosity masks over a backdrop and the non-separable modes are nowhereremote/pdf-association/indesign-cs6-pdfua1-brochure.pdf (multiply); the committed transparency groups and soft masksGenerate here1
Our own approved reference images of the reference documents, under tests/visual/rendering/The regression rule needs them; test data, not corpus documentsnoneGenerate here (by this milestone)1
A committed page with a CMYK or ICC-based photograph and an output intent, in PDF/A or PDF/XThe color row rests on remote files; the committed ones carry CMYK only as an output intentremote/ocrmypdf/photoshop-cc2015-pdfx3-cmyk.pdf; vendor/eu-publications/distiller10-eu-consolidated-regulation-2015.pdf (a CMYK intent over RGB drawing)Generate here2
A color-key image mask (/Mask [ranges])The one mask kind no corpus document carriesremote/pdfjs/itext5-ccitt-g4-mask-issue4379.pdf (a stencil /Mask stream)Generate here2
A page larger than MaxRasterPixels at 150 dpi, committedThe band path is proven only on the remote 8,400-point pageremote/ocrmypdf/tiff2pdf-35000px-ccitt-image.pdf (the 8,400-point page), remote/usgs/us-topo-washington-west-2023.pdf; vendor/pdf-association/handwritten-compacted-syntax.pdf (UserUnit)Generate here2
A TrueType face whose glyphs need their hinting instructions (a Chinese Ming face)render.font-needs-hinting is designed but met in no filenonePublic source3

M26​

NeedWhyNearest in the corpus todaySourcePriority
A signed twin of our contractThe roadmap's acceptance names the contract's signed twin, which M04 adds, and documents/contract/chromium-contract-fr.pdf is unsigneddocuments/contract/chromium-contract-fr.pdf (unsigned)Generate here (M03's and M04's gap; M26 cannot close without it)1
Documents encrypted for certificates (adbe.pkcs7.s4 and s5; RC4-128, AES-128, AES-256), their test key and their twinsThe roadmap's third acceptance condition has no documentnoneGenerate here (M16's gap)1
The test PKI under tests/pki/: Certomancer's configuration, certificates and keys for every algorithm, a time-stamp authority, revocation servicesEvery signature this milestone writes needs a key, and a root DSS and pyHanko can be told to trust; test data, not a corpus documentnoneGenerate here1
Our own signed outputs, committed: B-B and B-T over the invoice, the contract and the PDF/A report; a certified contract at P=2 with a countersignature; a document-time-stamped case file from M18; a signed PDF/A-3 Factur-X invoiceWhat we produce must be as readable as what we consume: M27 validates them, and M20's signed PDF/A gap wants onethe seven committed third-party signed documentsGenerate here (by this milestone)1
A third-party empty signature field carrying /SV seed values and a /Lock, prepared in AcrobatSeed values are otherwise proven only on fields our own M16 writesno committed field carries /SV; /Lock only on signed fields (vendor/us-federal/itext-govinfo-us-code-certified.pdf, docusign-pdfkit-gsa-sf30-contract-modification.pdf); empty fields with neither in vendor/fr-licence-ouverte/pdfmaker-acrobat-cerfa-12156-form.pdf and libreoffice-cerfa-13983-form.pdfContribution2
A certificate-encrypted document written by AcrobatM16's fixtures are pyHanko's, and Acrobat is the writer such documents in the wild come fromnoneContribution2
A document signed with ECDSA on a Brainpool curve by a European eID cardThe curves are offered where the platform has them, and no real file shows oneECDSA signatures and time stamps, remote (remote/eu-dss/neooffice-polysys-hu-two-seals-two-doc-timestamps.pdf, remote/boe/antenna-house-openpdf-boe-royal-decree-2026-aeboe-seal.pdf), none recorded as BrainpoolContribution3

M27​

NeedWhyNearest in the corpus todaySourcePriority
EU DSS's verdict on every signature of the signed corpus — indication, sub-indication, format, qualification — in both configurations, at a recorded time (expect.signatures[].dss)The acceptance is agreement with DSS, which must rest on DSS's opinion recorded in advance, never on oursnone: refereeCheckSucceeds holds qpdf's verdict only, and M04's pyHanko fields are themselves a gapGenerate here1
A pinned snapshot of the LOTL, the national lists the corpus's qualified signatures need, and the Official Journal's LOTL signing certificates, with the validation time it fixesValidation against trusted lists must be reproducible; the live lists change weekly and their URLs are not immutable, so the remote corpus cannot pin themnoneGenerate here (a recorded download; under tests/trusted-lists/ if the Commission's reuse terms and the size allow, otherwise an immutable archive of our own, ADR 33)1
Crafted invalid signatures from the test PKI: covered content altered, a signature value altered, a signing-certificate attribute naming another certificate, no signing certificate, an untrusted root, a revoked signer with and without a proof of existence, a not-yet-valid certificate, a token over the wrong imprint, an OCSP response from an unauthorized responder, an expired CRLEvery sub-indication the design names must be reached by a file another implementation wrote, not only by unit fixturescertificates in trouble in real files: vendor/lu-legilux/fop22-legilux-memorial-seal-renewed-timestamps.pdf and vendor/us-federal/docusign-pdfkit-gsa-sf30-contract-modification.pdf (expired), vendor/node-signpdf/skia-chrome74-node-signpdf-reason-contains-trailer.pdf (self-signed); test certificates, remoteGenerate here1
SHA3-256 and SHA3-512, Ed25519, Ed448 (SHAKE256) and Brainpool ECDSA signatures, with their ISO/TS 32001 and 32002 extensionsThe roadmap names SHA-3 and EdDSA, and no document carries eithernoneGenerate here1
Our own B-LT and B-LTA outputs, committed, and a renewal chain over a simulated decadeThe expiry condition and the renewal row need signatures whose whole history is knownvendor/lu-legilux/antenna-house-legilux-memorial-pades-lta.pdf (a third party's B-LTA)Generate here (by this milestone)1
A document whose ISO/TS 32004 MAC is attached to its signature, and a tampered copyM16 left the verification herenoneGenerate here (M16's gap)2
A delegated OCSP responder, a delta CRL, an indirect CRL, a CRL with an issuing distribution pointEach is handled by the design and met in no fileCRLs and OCSP responses, remote: remote/eu-dss/word2010-cs-plugtest-pades-lta-two-doc-timestamps.pdf, remote/eu-dss/excel365-nowina-25-signatures-dss-vri.pdfGenerate here2
A French qualified signature with long-term material from a French trust service provider — Certigna, ChamberSign, Universign or Yousign —, committedThe market this library serves first; the committed DILA signature carries no security store, and the others are remotevendor/fr-licence-ouverte/fop-dictao-dila-signed-joafe-notice.pdf (no DSS); remote/qpdf-issues/yousign-signserver-qualified-seal-test-page.pdf, remote/eu-dss/ghostscript-certipost-universign-mentana-four-revisions.pdfContribution2
A real archive whose archive time stamp lapsed before it was renewedThe INDETERMINATE a missed renewal earns is otherwise proven only on simulated timevendor/lu-legilux/fop22-legilux-memorial-seal-renewed-timestamps.pdf (a seal renewed by two document time stamps)Contribution (simulated here meanwhile)3

M28​

NeedWhyNearest in the corpus todaySourcePriority
PDF/UA-2 documents from other producers with veraPDF's ua2 verdict (WeasyPrint or LibreOffice if their pinned versions write part 2; else the veraPDF corpus's PDF/UA-2 files)The pdf-ua-2 profile cannot be accepted on our own outputs alone (invariant 10); namespace resolution has one hand-written fileremote/pdf20examples/handwritten-pdf20-utf8-strings.pdf (tagged PDF 2.0, no UA-2 claim)Generate here1
Documents declaring Well-Tagged PDF, reuse and accessibility (veraPDF corpus WTPDF files; PDF Association publications that declare WTPDF)The WTPDF profiles and the declaration reader have nothing third-party to judgenonePublic source1
Pass and fail fixtures for each clause of veraPDF's ua2, wt1r and wt1a profilesProfiles of dozens of rules need a pair per rulenonePublic source1
Our own PDF/UA-2, WTPDF and PDF/A-4/4f/4e renderings of the reference documents, committedLater milestones (M30 above all) accept on themnoneGenerate here1
The PDF/A-4 claim of vendor/verapdf/pdf20-version-mismatch.pdf recorded with veraPDF's verdict (shared with M20's list-valued claim field)The fixture escapes every claimed-document rowvendor/verapdf/pdf20-version-mismatch.pdfGenerate here1
PDF/A-4e documents with 3D or RichMedia that veraPDF upholds, one committed4e's allowances are checked only on a remote portfolio whose members claim no part 4remote/opf-format-corpus/acrobat9-portfolio-signed-3d.pdfPublic source2
A PDF 2.0 document using structure destinations from another producerSD resolution and M07's rewriting are checked on our output onlynoneRemote corpus2
A PDF 2.0 document mixing the 1.7 and 2.0 namespaces with RoleMapNS from another producerISO/TS 32005 reading is otherwise proven on trees we builtremote/pdf20examples/handwritten-pdf20-utf8-strings.pdfGenerate here2
A PDF 2.0 document with page-level output intents (pdf20examples, CC BY-SA, remote)Part 4 allows them and merges must keep them consistent; none in the corpusnoneRemote corpus2
PDF Declarations other than WTPDF's, derived with pikepdf's XMP editingThe reader's handling of declarations it does not knownoneGenerate here3

M29​

NeedWhyNearest in the corpus todaySourcePriority
PDF/X-4 files from InDesign, Acrobat or a RIP vendor, each with a preflight reportThe PDF/X-4 profile needs third-party files to agree with the referee on; the corpus's only print claim is PDF/X-3:2002remote/ocrmypdf/photoshop-cc2015-pdfx3-cmyk.pdfPublic source1
PDF/VT files from variable-data tools: real DPart trees with DPMThe PDF/VT profiles and the PdfDocumentParts read model must be proven on part trees other than our ownnone (vendor/pdf-association/pdflib-pps-kraxi-pdfa2a-pdfua1-invoice.pdf comes from PDFlib Personalization Server but is not PDF/VT)Contribution1
The chosen referee's verdict on every print file of the corpus, recorded in the manifestExpectations must come from the independent tool, as conformanceValid does for veraPDF, and the schema's claimsConformance admits PDF/A and PDF/UA onlynoneGenerate here1
A print source, tests/corpus/sources/statement-fr.html: a statement with a full-bleed band, a spot-color logo, CMYK brand colors and crop marks, with its Chromium rendering beside itEvery generated-print acceptance row needs one document that exercises bleed, spots, overprint and marks togethertests/corpus/sources/invoice-fr.html, report-fr.html, contract-fr.htmlGenerate here1
Reference ICC profiles we may commit: the ICC's sRGB v2 and v4, a v4 CMYK output profile, a FOGRA-characterized profile, gray and Lab profiles, a device link, a named-color profileTransforms must be measured on more than the one v2 CMYK profile read out of a committed document, and the refused profile classes need a fileAdobe's U.S. Web Coated (SWOP) v2, the output intent of vendor/eu-publications/distiller10-eu-consolidated-regulation-2015.pdf; the sRGB profile of documents/archival/libreoffice-report-pdfa2b.pdfPublic source1
Hostile ICC profiles, one per bound: a tag count of 2³² − 1, a tag past the end, overlapping tags, an oversized CLUT, a bad parametric curve type, a truncated headerThe ICC parser's hostile tests and the fuzzing seedsnoneGenerate here1
Documents with several spot colors, a spot DeviceN, overprint with /OPM 0 and 1, and a CMYK-blended transparency groupPlates, overprint simulation and the profiles meet each case in one file at mostvendor/us-federal/illustrator-irs-pub1-english.pdf (Separation PANTONE 301 C, overprint); remote/pdf-association/indesign-cs6-pdfua1-brochure.pdf; remote/opf-format-corpus/acrobat9-portfolio-signed-3d.pdf (DeviceN)Generate here2
PDF/X-1a and PDF/X-3 files from producers other than PhotoshopTwo older profiles would otherwise be judged on one remote pageremote/ocrmypdf/photoshop-cc2015-pdfx3-cmyk.pdfGenerate here2
An invoice or statement run as an outsourced print provider receives it, anonymizedThe use case the milestone exists fornoneContribution2

M30​

NeedWhyNearest in the corpus todaySourcePriority
Two reference HTML sources on fictitious content in tests/corpus/sources/: vertical Japanese with ruby, combined digits, a table, a rotated header and dangumi; and a report with inline and display MathML formulaeEvery M30 acceptance row renders them; nothing in the corpus sets vertical text with ruby, or MathMLtests/corpus/sources/invoice-fr.html, report-fr.html, contract-fr.html (horizontal French only)Generate here1
Chromium 141's PDF renderings of both reference sources, committed by build_corpus.pyThe visual and pagination reference must be a committed document, not a rendering made at test timedocuments/report/chromium-report-fr.pdfGenerate here1
Our own renderings of both references, in 1.7 under PDF/UA-1 and in 2.0 under PDF/UA-2, committedWhat we produce must be as readable as what we consume; M28 lists the same gap for PDF/UA-2noneGenerate here1
textContains for vendor/jp-nta/indesign-distiller18-nta-gift-tax-vertical.pdf, recorded from MuPDF over its decrypted twin (a recorded qpdf --decrypt)The vertical-form acceptance row compares with what M15 readsvendor/jp-nta/indesign-distiller18-nta-gift-tax-vertical.pdf (AES-128, empty user password, no expected text)Generate here (M15's gap)1
An HTML template setting the NTA form's first page — vertical headings and instructions —, derived under its Public Data License 1.0 with attributionThe roadmap's reading of the vertical form needs a rendering of ours to compare withvendor/jp-nta/indesign-distiller18-nta-gift-tax-vertical.pdfGenerate here1
OFL test faces under 2 MB in tests/fonts/: a CJK subset with vhea, vmtx and vert (Noto Serif CJK JP or Source Han Serif, the Reserved Font Name checked, since a subset is a Modified Version) and a math face with a MATH table (STIX Two Math or Noto Sans Math)Chromium and the engine must draw with the same faces for the visual comparison; test data, not corpus documentsnoneGenerate here1
A third-party PDF whose formulae carry MathML as associated files and as MathML-namespace structure elements: LuaLaTeX with \DocumentMetadata{tagging=on}, unicode-math and luamml (and tagging-setup={math/setup=mathml-SE}), pinned in a container, the TeX Live packaging that carries it to verifyMathML carriage is otherwise judged by veraPDF alone; another producer's output shows what readers meetremote/pdf-association/abledocs-pdfua1-tagged-textbook-scan.pdf (480 Formula elements with alternative text, no MathML)Generate here2
A third-party PDF with furigana (ruby), such as a Japanese government document in plain Japanese under the Government of Japan Standard Terms of Use 2.0, each document's terms read firstRuby is otherwise proven on our own output onlynonePublic source2
A second vertical Japanese document from another producer, with ToUnicode: a ministry publication set vertically, or the official gazette, terms read firstOne vertical document without ToUnicode cannot show what extractors do with a normal onevendor/jp-nta/indesign-distiller18-nta-gift-tax-vertical.pdfPublic source2
Vertical traditional Chinese, and Korean textW09 still lacks Korean, and vertical Chinese has no casevendor/us-federal/indesign-irs-pub1-chinese-traditional.pdf (horizontal)Contribution3

M31​

NeedWhyNearest in the corpus todaySourcePriority
A way for non-PDF inputs to enter the corpus: the manifest's file pattern, a format field, per-format expectations (the Word PDF a DOCX is compared with, its headings and tables), the layout, docs/corpus.md and CorpusManifestSchemaTestsDecided on 2026-09-27: one manifest, a format field and a block per format, delivered by M07 for images, XML invoices, FDF and XFDF, messages and DOCX; M10's payload set stays test datanone: the schema's file pattern ends in .pdfGenerate here (M07's slice 8)1
The invoice DOCX that build_word.ps1 writes and deletes, kept beside Word's three PDFs of it, with the personal-data check extended to every DOCX part (cp:lastModifiedBy, docProps/app.xml's company and template, w:docVars)The one input whose Word renderings the corpus already holds; M31's slice 1documents/invoice/word-invoice-fr.pdf, word-print-driver-invoice-fr.pdf, pdf24-invoice-fr.pdfGenerate on Windows1
Word-authored fixtures on our own content, each with Word's Save as PDF: a contract with numbered clauses and cross-references; a letter with a letterhead (anchored logo, text box, tab stops); a report with a table of contents, sections, a landscape annex, footnotes and merged-cell tables; tracked-changes and comments fixtures; an equations fixtureThe roadmap's acceptance needs Word documents with Word's own rendering, and only Word makes bothdocuments/invoice/word-invoice-fr.pdf; tests/corpus/sources/report-fr.html and contract-fr.html as contentGenerate on Windows1
Third-party DOCX under attribution-only licenses, each with the publisher's PDF of that very version: GOV.UK under the Open Government Licence (the Crown Commercial Service's schedules first), data.gouv.fr under the Licence OuverteEvery milestone accepts on documents it did not write (ADR 19)vendor/uk-ogl/word2019-ccs-contract-schedule.pdf, vendor/uk-ogl/print-to-pdf-word-cspl-agenda.pdf, vendor/fr-licence-ouverte/word2010-meae-paris-call-survey.pdf (PDFs only)Public source1
DOCX written by other producers: LibreOffice (from the ODT sources), Google Docs, ONLYOFFICE, PagesWord is not the only writer of DOCX, and the others' markup differsnoneGenerate here (LibreOffice); Contribution (the others)2
DOCX with embedded fonts, content controls, a chart and a SmartArt diagram with their fallbacks, an EMF picture, a VML watermark, right-to-left paragraphs, a vertical header cell, compatibility mode 14Each mapping, fallback or refusal needs a real casenoneGenerate on Windows2
A DOCX over 500 pages, generated with python-docx from the report fixture's contentThe memory budget of streamed conversiondocuments/stress/reportlab-journal-1000-pages.pdf (a PDF, not a DOCX)Generate here2
A document saved by Word as Strict Open XMLWhether the Open XML SDK reads Strict decides a row of ScopenoneGenerate on Windows3