From 8709a5769495c3772fae6865dcc69605c77d97fb Mon Sep 17 00:00:00 2001 From: MPCoreDeveloper Date: Sun, 15 Nov 2026 08:40:25 +0100 Subject: [PATCH] Decode CCITT Group 3 and Group 4 fax images PdfFilters.Ccitt decodes the T.4 run-length tables, the two-dimensional modes, Group 3 end-of-line and tag bits, and Group 4 all-2D lines. PdfImageFilters dispatches it and honours /K, /Columns, /Rows, /BlackIs1, /EncodedByteAlign and /EndOfLine, so a scanned bilevel page yields Gray8 pixels instead of ImageFilterUnsupported. The decoder is checked against Group 3 and Group 4 strips Pillow wrote through libtiff (Assets/ccitt), with the bitmap Pillow decodes as the reference. The two-dimensional b1 is measured from the last changing element (a0), which is the difference between a line that completes and one whose vertical mode resolves to the left of the position. The scoped Stryker run over PdfFilters.Ccitt.cs is 78.80% (580 mutants: 394 killed, 48 survived, 58 no coverage); the survivors are the parameter defaults, the malformed-stream error branches and a loop guard, and docs/mutation-testing.md reads them. Three tests were added after the run. ADR-005, parity row 14, the manual chapter 8 and the changelog record the slice; the manual is rebuilt. --- CHANGELOG.md | 6 + docs/SharpCorePDF-Manual-1.8.0.pdf | Bin 2492566 -> 2492755 bytes docs/adr/0005-image-filter-decoders.md | 12 +- docs/manual/src/08-inspection.md | 6 +- docs/mutation-testing.md | 24 + docs/parity.md | 2 +- .../Pdf/PdfFilters.Ccitt.cs | 543 ++++++++++++++++++ .../Pdf/PdfImageFilters.cs | 11 +- .../SharpCorePDF.Tests/PdfCcittFilterTests.cs | 156 +++++ 9 files changed, 747 insertions(+), 13 deletions(-) create mode 100644 src/SharpCorePDF.Infrastructure/Pdf/PdfFilters.Ccitt.cs create mode 100644 tests/SharpCorePDF.Tests/PdfCcittFilterTests.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c2188f..666489e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,12 @@ against an empty feed. decoded as far as it goes. [`ADR-005`](docs/adr/0005-image-filter-decoders.md) scopes the remaining four filters — `CCITTFaxDecode`, `DCTDecode`, `JPXDecode` and `JBIG2Decode` — with the evidence path each one has to meet. +- **CCITT fax images are decoded.** `CCITTFaxDecode` covers Group 3 (one- and two-dimensional) and Group 4 + for bilevel images — `K`, `Columns`, `Rows`, `BlackIs1`, `EncodedByteAlign` and `EndOfLine` are honoured — + so a scanned page now yields its samples (and `Gray8` pixels) instead of `ImageFilterUnsupported`. The + decoder is checked against Group 3 and Group 4 strips Pillow wrote through libtiff, with the bitmap + Pillow decodes as the reference; [`ADR-005`](docs/adr/0005-image-filter-decoders.md) schedules + `DCTDecode`, `JPXDecode` and `JBIG2Decode` next. ## [1.8.0] - 2026-11-14 diff --git a/docs/SharpCorePDF-Manual-1.8.0.pdf b/docs/SharpCorePDF-Manual-1.8.0.pdf index aafe8bb3a1cb38e2f774e95bf2e8bdae5a8c3966..a432a78113b995545e322dcf575ea5b64c967eac 100644 GIT binary patch delta 104231 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

!Hw+Vz01!PZK&SRr{Dh%?h+)b3Ngp6 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 =#N2Jbgrh@v+!3HyVd+@W|fTeM9=`<7(>{ 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 delta 104142 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

HbP|vAVqm-94&hB&%s}x_G8d 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

ekR%!u5krg)yi#>2b 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 diff --git a/docs/adr/0005-image-filter-decoders.md b/docs/adr/0005-image-filter-decoders.md index c6703bb..9e670db 100644 --- a/docs/adr/0005-image-filter-decoders.md +++ b/docs/adr/0005-image-filter-decoders.md @@ -1,7 +1,7 @@ # ADR-005: Decoding the image filters the reader passes through -- **Status**: **Accepted** (2026-11-14) — `RunLengthDecode` implemented; `CCITTFaxDecode`, `DCTDecode`, - `JPXDecode` and `JBIG2Decode` accepted in that order, one release slice each +- **Status**: **Accepted** (2026-11-14) — `RunLengthDecode` (2026-11-14) and `CCITTFaxDecode` (2026-11-15) + implemented; `DCTDecode`, `JPXDecode` and `JBIG2Decode` accepted in that order, one release slice each - **Date**: 2026-11-14 - **Related**: [`docs/parity.md`](../parity.md) row 14, [`docs/manual/src/08-inspection.md`](../../manual/src/08-inspection.md), @@ -105,15 +105,15 @@ Two facts the first attempt established, so the next one does not rediscover the horizontal to `a2`, vertical to `a1`) — and to search for the first reference transition **strictly greater than `a0`**. With that, line 12's `b1` is 16, V-3 resolves to 13, and the line completes. -The RunLength slice is shipped; the CCITT decoder is the open work, and the Group 4 fixture now decodes its -first twelve lines correctly against this data. +Both slices are shipped: the Group 4 fixture decodes every line against this data, the Group 3 fixture +decodes as well, and `PdfCcittFilterTests` pins both. ## Status of the slices | Slice | State | | --- | --- | | `RunLengthDecode` | **Implemented** (2026-11-14) | -| `CCITTFaxDecode` | Planned — the next slice | -| `DCTDecode` | Planned | +| `CCITTFaxDecode` | **Implemented** (2026-11-15) | +| `DCTDecode` | Planned — the next slice | | `JPXDecode` | Planned | | `JBIG2Decode` | Planned | diff --git a/docs/manual/src/08-inspection.md b/docs/manual/src/08-inspection.md index 8239fdc..f2af588 100644 --- a/docs/manual/src/08-inspection.md +++ b/docs/manual/src/08-inspection.md @@ -233,8 +233,8 @@ component counts, or an `Indexed` space over any of them. An image that carries case rather than an exception — its payload is its samples — so an inline image, which producers rarely compress, states its pixels the way a Flate one does. Nothing is left behind a filter either, because the filters an image realistically uses are decoded here — Flate and LZW, each with its predictor, the two -ASCII encodings, and run-length — so an image that a viewer can show is an image whose samples this record -states. +ASCII encodings, run-length, and the CCITT fax codings (Group 3 and Group 4) — so an image that a viewer +can show is an image whose samples this record states. Two things are unpacked on the way out rather than handed over as they lie in the file. Samples narrower than a byte are widened to the same scale, so a bilevel image yields `0` and `255` rather than `0` and `1`, a @@ -251,7 +251,7 @@ which one it is: | Case | What the entry says | Why no pixels | | --- | --- | --- | | A `DCTDecode` image | `IsDecodable` true, `Filter` `DCTDecode`, `PixelFormat` null | The bytes are already a JPEG, which a caller can read; unpacking it here would mean shipping a second decoder. | -| A filter the library passes through — `JPXDecode`, `JBIG2Decode`, `CCITTFaxDecode`, or a name it does not know | `IsDecodable` false, `Filter` names it, and the read warns with `ImageFilterUnsupported` | Nothing was decoded, so there are no samples to hand back. [`ADR-005`](../../adr/0005-image-filter-decoders.md) schedules these decoders, in that order. | +| A filter the library passes through — `JPXDecode`, `JBIG2Decode`, or a name it does not know | `IsDecodable` false, `Filter` names it, and the read warns with `ImageFilterUnsupported` | Nothing was decoded, so there are no samples to hand back. [`ADR-005`](../../adr/0005-image-filter-decoders.md) schedules these decoders, in that order. | | A `Separation`, `DeviceN` or `Lab` space, sixteen bits per sample, a palette whose samples run past its table or whose table holds nothing, a width or height of zero, or a geometry the document does not state | `BitsPerComponent` or `ColorSpace` states which | The first needs a function evaluated, the second a rounding rule, the third a decision the file does not support, and the last a rectangle that is not there. Pixels are eight bit and channel-ordered by contract, so converting or guessing would hide the mismatch from the caller. | Neither a colour profile nor a tint transform is applied: the samples are what the document stores. That is diff --git a/docs/mutation-testing.md b/docs/mutation-testing.md index 0b02f6c..c5e32fb 100644 --- a/docs/mutation-testing.md +++ b/docs/mutation-testing.md @@ -850,3 +850,27 @@ and a `count <= 0` guard whose empty write and zero step are the same behaviour rather than pinned, which is what a survivor is for. `PdfImageFilters` gained the whitelist entry and the dispatch case, and the RunLength tests exercise both through `Decode`. +## CCITTFaxDecode — the fax codecs (2026-11-15) + +`CCITTFaxDecode` is the largest decoder in the tree: T.4's two run-length tables, the two-dimensional +modes, Group 3's end-of-line and tag bits, and the bitmap the samples become. Its reading: + +| File | Score | Killed | Survived | No coverage | Mutants | +| --- | --- | --- | --- | --- | --- | +| `Pdf/PdfFilters.Ccitt.cs` | **78.80%** | 394 | 48 | 58 | 580 | + +The survivors divide into three groups. **The parameter defaults** — `columns` and `rows` falling back +from the decode parameters to the image and then to 1728/0, `EncodedByteAlign`, `EndOfLine` — are guards +whose alternatives produce the same bitmap for the fixtures, which state the geometry and leave both flags +at their defaults. **The error branches** (`return false` for an out-of-range transition, a truncated run, +a mode that does not decode) are the no-coverage column: the fixtures are valid streams, and the malformed +stream test covers only the first of them. **The loop guard** (`++guard > columns * 2 + 64`) is never +reached by a valid stream, and its mutants are equivalent for data that terminates. + +Two of the survivors are a **missing fixture** rather than an equivalent: a run longer than 63 pixels (a +make-up code) and a Huffman code thirteen bits wide. The Pillow fixture is 16 x 16, so every run and code +is short; a wide fixture is the test that would close them. + +Three tests were added after the run — a stream without a row count, a bitmap above the budget, and a +stream that stops mid-line — and their effect is not measured here. + diff --git a/docs/parity.md b/docs/parity.md index 69736f7..8ab7325 100644 --- a/docs/parity.md +++ b/docs/parity.md @@ -37,7 +37,7 @@ No “Must” row is unowned. The owner is the story that closes it: `US1 creato | 11 | Digital signatures: sign, validate, timestamp, report integrity and trust separately | PDFsharp: yes. PdfPig: no. | Must: detached CMS over a reserved byte range, X.509, optional caller-supplied RFC 3161 token, integrity and trust as separate results. | 1.1 | US4 trust | `PdfDocumentSignerTests.Writes_a_signature_that_verifies_against_its_own_bytes`, `Signing_a_second_time_keeps_the_first_signature_valid`, `Embeds_the_timestamp_token_the_caller_supplies` (T080, T087), `PdfDocumentSignatureValidatorTests.Reports_a_changed_byte_as_a_digest_mismatch`, `Keeps_integrity_independent_of_trust`, `Reports_a_request_for_an_online_check_without_making_one` (T081) | `python docs/tools/validate-signatures.py --trust-signer ` (pyHanko, T093) and `uv run --with pikepdf python docs/tools/validate-pdf.py ` | Met (2026-10-23) on pyHanko and qpdf: a signed revision reports `intact` with coverage `ENTIRE_FILE`, a twice-signed one reports `intact`/`ENTIRE_REVISION` then `intact`/`ENTIRE_FILE`, both `trusted` against the signer's own certificate as anchor, and qpdf `--check` reports no problems on either file. A timestamp token is embedded, never checked: the authority is the caller's. The `sign-and-archive` example (T094) writes a PDF/A-3b file and signs it afterwards — the order that keeps the archival bytes intact — and pyHanko reads what it wrote as field `ArchivalSignature`, `integrity intact (coverage ENTIRE_FILE)`, signed at the moment the options state (2026-10-24) | | 12 | PDF/A-1b, -2b, -2u, -3b, -3u and -4 output | PDFsharp: PDF/A manager. PdfPig: no. | Must: embed every font, write XMP and an output intent, remove encryption and forbidden actions, refuse what cannot conform. | 1.1 | US4 trust | `PdfATests.Writes_the_structures_the_profile_requires`, `Refuses_a_font_it_cannot_embed`, `Refuses_transparency_for_pdf_a_1b_but_writes_it_for_2b` (T082) | `python docs/tools/validate-pdfa.py --verapdf --profile 2b archive-2b.pdf`, and the same for every other profile: veraPDF 1.30.4 reports `PASS` for all six profiles of an authored page and of `SafeWebCore.pdf`, by hand and on every push (`compliance.yml`; T093, T096) | Met — the output intent is sRGB built in, or the caller's own ICC profile and condition, written as supplied and checked as ICC first; PDF/A-3 embedded files are associated through `/AF` with a stated relationship; levels B and U are written, and PDF/A-4 writes the base level of ISO 19005-4; PDF/A-4f/-4u, a merge-time profile and level A are out of scope, and no conformance is claimed without a validator | | 13 | Positioned letters, words and blocks; configurable segmentation and reading order | PDFsharp: not a reading API. PdfPig: yes. | Must: `PdfLetter` with Unicode, size, font name, box and baseline; word and block strategies; raw and column-aware reading order with the strategy in the result. | 1.1 | US3 reading | `PdfLayoutReaderTests.Reads_one_letter_per_glyph_in_content_order`, `Splits_a_two_column_page_into_one_block_per_column`, `Reads_a_page_of_two_columns_left_to_right_whatever_order_the_content_used` (T059–T060), `PdfLayoutCorpusTests.Meets_SC_004_on_the_labelled_corpus`, `PdfLayoutCorpusTests.Table_page_is_still_read_column_by_column` (T076) | `python docs/tools/score-layout.py --labels tests/SharpCorePDF.Tests/Assets/parity/labelled --known-order-mismatch table` (T075) | Met on the labelled corpus (T075–T076): recall and boxes 100% on all five documents, reading order 100% on four. `table` is recorded as a known order mismatch — a table is symmetric under the XY cut, so a cell becomes a block and the order comes out column by column, which is the order a two-column page needs; table semantics are out of contract. `PdfLayoutCorpusTests.Table_page_is_still_read_column_by_column` fails if the limitation ever goes away | -| 14 | Images, hyperlinks, form values, annotations, embedded files, metadata, bookmarks | PDFsharp: partial. PdfPig: yes. | Must: expose each resource through the read side, decode image pixels when asked, and warn on an unresolved destination or unsupported filter. | 1.1 partial, pixels in 1.2 | US3 reading | `PdfLayoutReaderTests.Reads_the_links_of_a_page_and_their_uris`, `Resolves_a_direct_and_a_named_destination`, `Keeps_an_unresolved_destination_and_says_so`, `PdfContentReaderTests.Returns_every_annotation_with_its_geometry_and_text`, `Returns_the_field_tree_with_qualified_names`, `PdfContentReaderTests.Exposes_the_samples_of_a_decoded_image_as_pixels`, `Does_not_expose_a_jpeg_as_pixels`, `Does_not_expose_the_pixels_of_a_filter_it_cannot_decode`, `Exposes_a_palette_image_as_the_colours_of_its_table`, `Exposes_a_palette_whose_table_is_a_string`, `Exposes_bilevel_samples_as_one_byte_per_sample`, `Exposes_four_bit_samples_at_the_scale_of_their_depth`, `Exposes_two_bit_samples_at_the_scale_of_their_depth`, `Exposes_a_cmyk_image_as_four_device_samples_per_pixel`, `Exposes_the_samples_of_an_iccbased_image`, `Does_not_expose_the_samples_of_a_separation_space`, `Does_not_expose_a_palette_image_whose_index_is_outside_its_table`, `Leaves_an_expansion_above_the_budget_out_of_the_record`, `Exposes_the_samples_of_an_image_that_declares_no_filter`, `Keeps_an_expansion_that_fits_the_budget_exactly`, `Exposes_four_bit_samples_of_a_three_channel_image`, `Does_not_expose_an_image_that_states_no_extent`, `Exposes_the_samples_of_a_profile_by_the_components_it_states`, `Does_not_read_a_palette_whose_table_is_empty`, `Refuses_to_resolve_a_colour_space_without_a_document`, `Resolves_the_calibrated_forms_of_the_device_spaces`, `Does_not_build_a_palette_over_a_palette_or_over_a_function`, `Reads_a_palette_whose_declared_index_is_zero`, `Clamps_a_declared_index_to_the_entries_the_table_holds`, `Does_not_read_an_icc_space_that_states_no_profile`, `Exposes_the_pixels_of_an_inline_image_stated_by_an_abbreviation` (T072) | `uv run --with pypdf python -c "from pypdf import PdfReader; ..."` and `validate-pdf.py` on the corpus, plus the `score-layout.py` run of T079 (5 documents, 0 short of a threshold) and an external parse of all four export formats (T079) | Met in 1.2 (2026-10-24): every resource the row names is exposed — images with their payload, geometry, mask and pixels, hyperlinks with resolved and unresolved destinations, form values through `PdfFormFieldInfo`, annotations, embedded files, metadata and bookmarks; pixels are `Gray8`, `Rgb24` or `Cmyk32` for every filter the library decodes and for an image whose stream declares no filter at all — a palette applied so an `Indexed` image yields colours, samples narrower than a byte widened, four device samples left as CMYK rather than converted — and `null` for a filter it does not decode, which is reported with `ImageFilterUnsupported` rather than dropped. `RunLengthDecode` joined the decoded filters on 2026-11-14 and yields pixels; `CCITTFaxDecode`, `DCTDecode`, `JPXDecode` and `JBIG2Decode` remain pass-through, in the order ADR-005 schedules them | +| 14 | Images, hyperlinks, form values, annotations, embedded files, metadata, bookmarks | PDFsharp: partial. PdfPig: yes. | Must: expose each resource through the read side, decode image pixels when asked, and warn on an unresolved destination or unsupported filter. | 1.1 partial, pixels in 1.2 | US3 reading | `PdfLayoutReaderTests.Reads_the_links_of_a_page_and_their_uris`, `Resolves_a_direct_and_a_named_destination`, `Keeps_an_unresolved_destination_and_says_so`, `PdfContentReaderTests.Returns_every_annotation_with_its_geometry_and_text`, `Returns_the_field_tree_with_qualified_names`, `PdfContentReaderTests.Exposes_the_samples_of_a_decoded_image_as_pixels`, `Does_not_expose_a_jpeg_as_pixels`, `Does_not_expose_the_pixels_of_a_filter_it_cannot_decode`, `Exposes_a_palette_image_as_the_colours_of_its_table`, `Exposes_a_palette_whose_table_is_a_string`, `Exposes_bilevel_samples_as_one_byte_per_sample`, `Exposes_four_bit_samples_at_the_scale_of_their_depth`, `Exposes_two_bit_samples_at_the_scale_of_their_depth`, `Exposes_a_cmyk_image_as_four_device_samples_per_pixel`, `Exposes_the_samples_of_an_iccbased_image`, `Does_not_expose_the_samples_of_a_separation_space`, `Does_not_expose_a_palette_image_whose_index_is_outside_its_table`, `Leaves_an_expansion_above_the_budget_out_of_the_record`, `Exposes_the_samples_of_an_image_that_declares_no_filter`, `Keeps_an_expansion_that_fits_the_budget_exactly`, `Exposes_four_bit_samples_of_a_three_channel_image`, `Does_not_expose_an_image_that_states_no_extent`, `Exposes_the_samples_of_a_profile_by_the_components_it_states`, `Does_not_read_a_palette_whose_table_is_empty`, `Refuses_to_resolve_a_colour_space_without_a_document`, `Resolves_the_calibrated_forms_of_the_device_spaces`, `Does_not_build_a_palette_over_a_palette_or_over_a_function`, `Reads_a_palette_whose_declared_index_is_zero`, `Clamps_a_declared_index_to_the_entries_the_table_holds`, `Does_not_read_an_icc_space_that_states_no_profile`, `Exposes_the_pixels_of_an_inline_image_stated_by_an_abbreviation` (T072) | `uv run --with pypdf python -c "from pypdf import PdfReader; ..."` and `validate-pdf.py` on the corpus, plus the `score-layout.py` run of T079 (5 documents, 0 short of a threshold) and an external parse of all four export formats (T079) | Met in 1.2 (2026-10-24): every resource the row names is exposed — images with their payload, geometry, mask and pixels, hyperlinks with resolved and unresolved destinations, form values through `PdfFormFieldInfo`, annotations, embedded files, metadata and bookmarks; pixels are `Gray8`, `Rgb24` or `Cmyk32` for every filter the library decodes and for an image whose stream declares no filter at all — a palette applied so an `Indexed` image yields colours, samples narrower than a byte widened, four device samples left as CMYK rather than converted — and `null` for a filter it does not decode, which is reported with `ImageFilterUnsupported` rather than dropped. `RunLengthDecode` (2026-11-14) and `CCITTFaxDecode` (2026-11-15) joined the decoded filters and yield pixels; `DCTDecode`, `JPXDecode` and `JBIG2Decode` remain pass-through, in the order ADR-005 schedules them | | 15 | Public read-only object graph and content-stream inspection | PDFsharp: partial. PdfPig: yes. | Must: immutable `PdfObjectView`/`PdfContentOperationView`, dangling references visible, operation offsets reported. | 1.1 tests, the rest 1.2 (completed 2026-11-06, Unreleased) | US3 reading | `PdfObjectInspectorTests.Returns_one_node_per_listed_object_in_number_order`, `Projects_a_reference_as_a_node_and_never_follows_it`, `Reports_a_dangling_reference_once_for_the_target_it_names`, `Reads_the_operations_of_a_page_in_the_order_it_states_them` | `python docs/tools/validate-pdf.py artifacts/graph.pdf` on the object-graph fixture, run 2026-11-06: qpdf names the file valid with warnings, and the warnings are exactly the two deliberate dangling references to object 99 the fixture states; an independent scan of the same bytes finds objects 1-7 and no object 99, which is what the inspector reports (seven nodes, three unresolved references). The mutation attempt is recorded too: 77.8% over `PdfObjectInspector.cs` | Evidenced (2026-11-06) - twelve tests in `PdfObjectInspectorTests` are in the suite, the external run above agrees with the inspector on which objects exist and which reference dangles, and the mutation score for the inspector is recorded rather than assumed | | 16 | Export to ALTO, PAGE XML, hOCR and SVG text | PDFsharp: no. PdfPig: yes. | Must: four exporters in page space, escaped text, a valid empty-page element, and a result that names the strategy used. | 1.1 exporters, the rest 1.2 (completed 2026-11-06, Unreleased) | US3 reading | `PdfLayoutExportTests.Exports_alto_pagexml_hocr_and_svg`, `Writes_a_page_element_for_a_page_with_no_text`, `Escapes_text_that_looks_like_markup`, `Returns_the_blocks_it_wrote_with_the_strategy_that_produced_them` (T063) `Writes_the_metadata_times_the_page_schema_requires` (2026-11-06) | ALTO 4.2 and PAGE XML 2019-07-15 validated with `lxml` against the published schemas (`alto-4-2.xsd`, `pagecontent-2019-07-15.xsd`), run 2026-11-06: both exports valid after the run found the PAGE document stating a creator and no times - the schema requires `Created` and `LastChange`, which the exporter now writes at a fixed instant so the bytes stay reproducible | Evidenced (2026-11-06) - four exporters and their tests are in the suite, the hOCR and SVG documents are checked by their own tests, and the schema run T079 named is recorded: the ALTO and PAGE exports validate against the published schemas, with the PAGE metadata defect the run exposed now fixed and pinned by a test | | 17 | Rendering pages to images or raster previews | PDFsharp: no. PdfPig: no. | Non-goal: no rasteriser, thumbnail generator, viewer or print pipeline. | 1.1 (excluded) | Product boundary (ADR-001) | None by design | Out-of-scope statement in `README.md`, `docs/manual/src/02-what-it-is-not.md` and ADR-001 | Out of scope | diff --git a/src/SharpCorePDF.Infrastructure/Pdf/PdfFilters.Ccitt.cs b/src/SharpCorePDF.Infrastructure/Pdf/PdfFilters.Ccitt.cs new file mode 100644 index 0000000..7013f66 --- /dev/null +++ b/src/SharpCorePDF.Infrastructure/Pdf/PdfFilters.Ccitt.cs @@ -0,0 +1,543 @@ +namespace SharpCorePDF.Infrastructure.Pdf; + +///

+/// The CCITT fax half of : Group 3 (T.4) and Group 4 (T.6) coding for bilevel +/// images, which is the shape a scanned page usually has. +/// +/// +/// +/// The decoder reads runs, not bytes. A line is a sequence of white and black runs whose lengths are a +/// Huffman code; Group 4 codes every line relative to the line above it, and Group 3 codes a line on its +/// own or relative to the one above depending on the tag bit after its end-of-line code. +/// +/// +/// The bitmap is built with one bit per pixel, a set bit for black, rows padded to a whole byte. A +/// BlackIs1 of false — the default — inverts it at the end, which is the value a DeviceGray image +/// states: 0 is black and 1 is white. +/// +/// +internal static partial class PdfFilters +{ + /// The code tables T.4 fixes, as code:run pairs whose code length is their length. + private static readonly string[] CcittWhiteRuns = + [ + "00110101:0", "000111:1", "0111:2", "1000:3", "1011:4", "1100:5", "1110:6", "1111:7", + "10011:8", "10100:9", "00111:10", "01000:11", "001000:12", "000011:13", "110100:14", "110101:15", + "101010:16", "101011:17", "0100111:18", "0001100:19", "0001000:20", "0010111:21", "0000011:22", "0000100:23", + "0101000:24", "0101011:25", "0010011:26", "0100100:27", "0011000:28", "00000010:29", "00000011:30", "00011010:31", + "00011011:32", "00010010:33", "00010011:34", "00010100:35", "00010101:36", "00010110:37", "00010111:38", "00101000:39", + "00101001:40", "00101010:41", "00101011:42", "00101100:43", "00101101:44", "00000100:45", "00000101:46", "00001010:47", + "00001011:48", "01010010:49", "01010011:50", "01010100:51", "01010101:52", "00100100:53", "00100101:54", "01011000:55", + "01011001:56", "01011010:57", "01011011:58", "01001010:59", "01001011:60", "00110010:61", "00110011:62", "00110100:63", + "11011:64", "10010:128", "010111:192", "0110111:256", "00110110:320", "00110111:384", "01100100:448", "01100101:512", + "01101000:576", "01100111:640", "011001100:704", "011001101:768", "011010010:832", "011010011:896", "011010100:960", "011010101:1024", + "011010110:1088", "011010111:1152", "011011000:1216", "011011001:1280", "011011010:1344", "011011011:1408", "010011000:1472", "010011001:1536", + "010011010:1600", "011000:1664", "010011011:1728", "00000001000:1792", "00000001100:1856", "00000001101:1920", + "000000010010:1984", "000000010011:2048", "000000010100:2112", "000000010101:2176", "000000010110:2240", + "000000010111:2304", "000000011100:2368", "000000011101:2432", "000000011110:2496", "000000011111:2560", + ]; + + private static readonly string[] CcittBlackRuns = + [ + "0000110111:0", "010:1", "11:2", "10:3", "011:4", "0011:5", "0010:6", "00011:7", + "000101:8", "000100:9", "0000100:10", "0000101:11", "0000111:12", "00000100:13", "00000111:14", "000011000:15", + "0000010111:16", "0000011000:17", "0000001000:18", "00001100111:19", "00001101000:20", "00001101100:21", "00000110111:22", "00000101000:23", + "00000010111:24", "00000011000:25", "000011001010:26", "000011001011:27", "000011001100:28", "000011001101:29", "000001101000:30", "000001101001:31", + "000001101010:32", "000001101011:33", "000011010010:34", "000011010011:35", "000011010100:36", "000011010101:37", "000011010110:38", "000011010111:39", + "000001101100:40", "000001101101:41", "000011011010:42", "000011011011:43", "000001010100:44", "000001010101:45", "000001010110:46", "000001010111:47", + "000001100100:48", "000001100101:49", "000001010010:50", "000001010011:51", "000000100100:52", "000000110111:53", "000000111000:54", "000000100111:55", + "000000101000:56", "000001011000:57", "000001011001:58", "000000101011:59", "000000101100:60", "000001011010:61", "000001100110:62", "000001100111:63", + "0000001111:64", "000011001000:128", "000011001001:192", "000001011011:256", "000000110011:320", "000000110100:384", + "000000110101:448", "0000001101100:512", "0000001101101:576", "0000001001010:640", "0000001001011:704", "0000001001100:768", + "0000001001101:832", "0000001110010:896", "0000001110011:960", "0000001110100:1024", "0000001110101:1088", "0000001110110:1152", + "0000001110111:1216", "0000001010010:1280", "0000001010011:1344", "0000001010100:1408", "0000001010101:1472", + "0000001011010:1536", "0000001011011:1600", "0000001100100:1664", "0000001100101:1728", "00000001000:1792", + "00000001100:1856", "00000001101:1920", "000000010010:1984", "000000010011:2048", "000000010100:2112", "000000010101:2176", + "000000010110:2240", "000000010111:2304", "000000011100:2368", "000000011101:2432", "000000011110:2496", "000000011111:2560", + ]; + + private static readonly Dictionary CcittWhiteTable = BuildCcittTable(CcittWhiteRuns); + private static readonly Dictionary CcittBlackTable = BuildCcittTable(CcittBlackRuns); + + /// Decodes a CCITT Group 3 or Group 4 stream. + /// The encoded bytes. + /// The decode parameters, or null for the defaults. + /// The image dictionary, which states the width and height the parameters may omit. + /// The largest bitmap that is kept. + /// The packed bitmap, or null above the cap. + /// The bitmap length in bytes, whether or not it was kept. + /// True when the stream decoded. + public static bool TryDecodeCcitt( + ReadOnlyMemory data, + PdfDictionary? parameters, + PdfDictionary? image, + int maxBytes, + out byte[]? bytes, + out long length) + { + bytes = null; + length = 0; + + var k = (int)(parameters?.GetInteger("K") ?? 0); + var columns = (int)(parameters?.GetInteger("Columns") ?? image?.GetInteger("Width") ?? 1728); + var rows = (int)(parameters?.GetInteger("Rows") ?? image?.GetInteger("Height") ?? 0); + var blackIs1 = parameters?.Get("BlackIs1") is PdfBoolean { Value: true }; + var align = parameters?.Get("EncodedByteAlign") is PdfBoolean { Value: true }; + var eol = parameters?.Get("EndOfLine") is not PdfBoolean { Value: false }; + + if (columns is <= 0 or > (1 << 20) || rows < 0) + { + return false; + } + + var rowBytes = (columns + 7) / 8; + var total = rows > 0 ? (long)rowBytes * rows : 0; + var output = total > 0 && total <= maxBytes ? new byte[total] : null; + var stream = rows == 0 ? new MemoryStream() : null; + var keep = rows <= 0 || output is not null; + var row = new byte[rowBytes]; + var transitions = new List(); + var previous = new List(); + var bits = new CcittBits(data.Span); + var decoded = 0; + long produced = 0; + + while (rows == 0 || decoded < rows) + { + if (k >= 0 && eol) + { + if (!TrySkipEol(ref bits)) + { + break; + } + + if (align) + { + bits.AlignByte(); + } + } + + var oneDimensional = k == 0; + + if (k > 0) + { + if (!bits.TryReadBit(out var tag)) + { + break; + } + + oneDimensional = tag == 1; + } + + Array.Clear(row); + transitions.Clear(); + + if (!TryDecodeLine(ref bits, row, oneDimensional ? null : previous, columns, transitions)) + { + if (rows == 0 && decoded > 0) + { + break; + } + + return false; + } + + if (output is not null && decoded < rows) + { + row.CopyTo(output.AsSpan(decoded * rowBytes)); + } + else if (stream is not null) + { + if (stream.Length + rowBytes <= maxBytes) + { + stream.Write(row); + } + else + { + keep = false; + } + } + + produced += rowBytes; + (previous, transitions) = (transitions, previous); + decoded++; + } + + if (decoded == 0) + { + return false; + } + + length = produced; + bytes = output ?? (keep ? stream?.ToArray() : null); + + if (bytes is { } kept) + { + if (!blackIs1) + { + for (var index = 0; index < kept.Length; index++) + { + kept[index] = (byte)~kept[index]; + } + } + + // The bits past the last pixel are padding. They are cleared so a caller comparing the + // bitmap to another decoder's does not see a difference in a bit that is not a pixel. + var remainder = columns & 7; + + if (remainder != 0) + { + var mask = (byte)(0xFF << (8 - remainder)); + + for (var index = 0; index < kept.Length; index += rowBytes) + { + kept[index + rowBytes - 1] &= mask; + } + } + } + + return true; + } + + private static bool TryDecodeLine( + ref CcittBits bits, + byte[] row, + List? reference, + int columns, + List transitions) + { + var position = 0; + var black = false; + var a0 = -1; + var guard = 0; + + while (position < columns) + { + if (++guard > (columns * 2) + 64) + { + return false; + } + + if (reference is null) + { + if (!TryReadRun(ref bits, black, out var run)) + { + return false; + } + + var end = position + run; + + if (end > columns) + { + return false; + } + + if (black) + { + Paint(row, position, end); + } + + // A zero-length run is a transition at the same position: it is what a line that + // starts black states, and leaving it out shifts the parity of every later b1. + transitions.Add(end); + a0 = end; + position = end; + black = !black; + continue; + } + + var b1 = FindB1(reference, a0, black, columns, out var b1Index); + var b2 = NextTransition(reference, b1Index, columns); + + if (!TryReadMode(ref bits, out var mode, out var delta)) + { + return false; + } + + if (mode == 2) + { + if (b2 <= position) + { + return false; + } + + position = b2; + a0 = b2; + continue; + } + + if (mode == 1) + { + if (!TryReadRun(ref bits, black, out var run1) + || !TryReadRun(ref bits, !black, out var run2)) + { + return false; + } + + var a1 = position + run1; + var a2 = a1 + run2; + + if (a2 > columns) + { + return false; + } + + if (black) + { + Paint(row, position, a1); + } + else + { + Paint(row, a1, a2); + } + + transitions.Add(a1); + transitions.Add(a2); + position = a2; + a0 = a2; + continue; + } + + var transition = b1 + delta; + + if (transition < position || transition > columns) + { + return false; + } + + if (black) + { + Paint(row, position, transition); + } + + transitions.Add(transition); + position = transition; + a0 = transition; + black = !black; + } + + return true; + } + + private static bool TryReadRun(ref CcittBits bits, bool black, out int run) + { + run = 0; + + while (true) + { + if (!TryReadHuffman(ref bits, black ? CcittBlackTable : CcittWhiteTable, out var value)) + { + return false; + } + + run += value; + + if (value < 64) + { + return true; + } + + if (run > 2560) + { + return false; + } + } + } + + private static bool TryReadHuffman(ref CcittBits bits, Dictionary table, out int value) + { + var code = 0; + + for (var length = 1; length <= 13; length++) + { + if (!bits.TryReadBit(out var bit)) + { + value = 0; + return false; + } + + code = (code << 1) | bit; + + if (table.TryGetValue((length << 16) | code, out value)) + { + return true; + } + } + + value = 0; + return false; + } + + private static bool TryReadMode(ref CcittBits bits, out int mode, out int delta) + { + mode = 0; + delta = 0; + var code = 0; + + for (var length = 1; length <= 7; length++) + { + if (!bits.TryReadBit(out var bit)) + { + return false; + } + + code = (code << 1) | bit; + + switch (length, code) + { + case (1, 0b1): + return true; + case (3, 0b011): + delta = 1; + return true; + case (3, 0b010): + delta = -1; + return true; + case (6, 0b000011): + delta = 2; + return true; + case (6, 0b000010): + delta = -2; + return true; + case (7, 0b0000011): + delta = 3; + return true; + case (7, 0b0000010): + delta = -3; + return true; + case (3, 0b001): + mode = 1; + return true; + case (4, 0b0001): + mode = 2; + return true; + case (7, 0b0000001): + return false; + } + } + + return false; + } + + /// + /// Finds the first reference-line transition of the opposite colour to the current one, strictly to the + /// right of . + /// + /// + /// The comparison is against — the last changing element — and not against the + /// paint position: after a vertical or horizontal mode the last transition is the new position, so + /// >= position would select the transition the decoder has just consumed. That is the + /// difference between a Group 4 line that completes and one whose vertical mode resolves to the left. + /// + private static int FindB1(List reference, int a0, bool black, int columns, out int index) + { + // A reference line starts white, so an even transition is a change to black and an odd one to + // white. b1 is the first transition of the opposite colour strictly after a0. + for (var candidate = black ? 1 : 0; candidate < reference.Count; candidate += 2) + { + if (reference[candidate] > a0) + { + index = candidate; + return reference[candidate]; + } + } + + index = -1; + return columns; + } + + private static int NextTransition(List reference, int index, int columns) => + index >= 0 && index + 1 < reference.Count ? reference[index + 1] : columns; + + private static bool TrySkipEol(ref CcittBits bits) + { + var zeros = 0; + + while (true) + { + if (!bits.TryReadBit(out var bit)) + { + return false; + } + + if (bit == 1) + { + if (zeros >= 11) + { + return true; + } + + zeros = 0; + continue; + } + + zeros++; + } + } + + private static void Paint(byte[] row, int from, int to) + { + for (var pixel = from; pixel < to; pixel++) + { + row[pixel >> 3] |= (byte)(1 << (7 - (pixel & 7))); + } + } + + private static Dictionary BuildCcittTable(string[] pairs) + { + var table = new Dictionary(pairs.Length); + + foreach (var pair in pairs) + { + var colon = pair.IndexOf(':'); + var code = Convert.ToInt32(pair[..colon], 2); + var run = int.Parse(pair[(colon + 1)..], System.Globalization.CultureInfo.InvariantCulture); + table[(colon << 16) | code] = run; + } + + return table; + } + + private ref struct CcittBits + { + private readonly ReadOnlySpan data; + private int offset; + private int shift; + + public CcittBits(ReadOnlySpan data) + { + this.data = data; + offset = 0; + shift = 7; + } + + public bool TryReadBit(out int value) + { + if (offset >= data.Length) + { + value = 0; + return false; + } + + value = (data[offset] >> shift) & 1; + + if (--shift < 0) + { + shift = 7; + offset++; + } + + return true; + } + + public void AlignByte() + { + if (shift != 7) + { + shift = 7; + offset++; + } + } + } +} + diff --git a/src/SharpCorePDF.Infrastructure/Pdf/PdfImageFilters.cs b/src/SharpCorePDF.Infrastructure/Pdf/PdfImageFilters.cs index 32366b2..afa4917 100644 --- a/src/SharpCorePDF.Infrastructure/Pdf/PdfImageFilters.cs +++ b/src/SharpCorePDF.Infrastructure/Pdf/PdfImageFilters.cs @@ -88,7 +88,7 @@ public static PdfPayload Decode(PdfStream stream, int maxInlineBytes, string sou buffered ? Buffer(current, maxInlineBytes) : null); } - if (!TryDecodeOne(name, current, forFilter, sourceName, maxInlineBytes, out var bytes, out var decodedLength)) + if (!TryDecodeOne(name, current, forFilter, stream.Dictionary, sourceName, maxInlineBytes, out var bytes, out var decodedLength)) { return new PdfPayload(false, true, description, length, buffered ? Buffer(current, maxInlineBytes) : null); } @@ -316,6 +316,7 @@ private static bool TryDecodeOne( string name, ReadOnlyMemory data, PdfDictionary? parameters, + PdfDictionary? image, string sourceName, int cap, out byte[]? bytes, @@ -367,6 +368,9 @@ private static bool TryDecodeOne( return true; } + case "CCITTFaxDecode": + return PdfFilters.TryDecodeCcitt(data, parameters, image, cap, out bytes, out length); + default: // Unreachable: `Decode` passes only the names `IsDecodable` states, and every one of // them has a case above. The arm exists because a switch has to end somewhere, and it @@ -792,9 +796,10 @@ private static bool HasPredictor(PdfDictionary? parameters) => /// Determines whether a payload can be turned into samples by a filter with this name. /// The filter name, with its abbreviation expanded. - /// for the five filters this class decodes. + /// for the six filters this class decodes. private static bool IsDecodable(string name) => - name is "FlateDecode" or "LZWDecode" or "ASCIIHexDecode" or "ASCII85Decode" or "RunLengthDecode"; + name is "FlateDecode" or "LZWDecode" or "ASCIIHexDecode" or "ASCII85Decode" + or "RunLengthDecode" or "CCITTFaxDecode"; /// Determines whether a filter is handed back raw instead of being decoded. /// The filter name, with its abbreviation expanded. diff --git a/tests/SharpCorePDF.Tests/PdfCcittFilterTests.cs b/tests/SharpCorePDF.Tests/PdfCcittFilterTests.cs new file mode 100644 index 0000000..fabf9e0 --- /dev/null +++ b/tests/SharpCorePDF.Tests/PdfCcittFilterTests.cs @@ -0,0 +1,156 @@ +using SharpCorePDF.Infrastructure.Pdf; + +namespace SharpCorePDF.Tests; + +/// +/// Tests of the CCITT Group 3 and Group 4 decoder, against strips Pillow wrote through libtiff: the +/// bitmap Pillow decodes is the bitmap this decoder must state. +/// +public sealed class PdfCcittFilterTests +{ + private const int Width = 16; + private const int Height = 16; + + /// Group 4, as Pillow wrote the 16 x 16 fixture (a diagonal and a block). + private static readonly byte[] Group4 = File.ReadAllBytes(Fixture("ccitt-g4.bin")); + + /// Group 3 one-dimensional, as Pillow wrote the same bitmap. + private static readonly byte[] Group3 = File.ReadAllBytes(Fixture("ccitt-g3.bin")); + + /// The bitmap Pillow decodes: 1 is white, 0 is black, rows padded to a byte. + private static readonly byte[] Expected = File.ReadAllBytes(Fixture("ccitt-expected.bin")); + + private static string Fixture(string name) => Path.Combine(TestAssets.Folder, "ccitt", name); + + /// Group 4 codes every line relative to the one above it. + [Fact] + public void Decodes_a_group_4_strip_to_the_bitmap_the_fixture_states() + { + Assert.Equal(Expected, Decode(Group4, Params(k: -1, blackIs1: true))); + } + + /// Group 3 codes each line on its own after its end-of-line code. + [Fact] + public void Decodes_a_group_3_strip_to_the_bitmap_the_fixture_states() + { + Assert.Equal(Expected, Decode(Group3, Params(k: 0, blackIs1: true))); + } + + /// + /// The raw stream is the complement of the mode-1 pixels, so the default BlackIs1 inverts it. + /// + [Fact] + public void Inverts_the_bitmap_when_black_is_zero() + { + var expected = Expected.Select(value => (byte)~value).ToArray(); + + Assert.Equal(expected, Decode(Group4, Params(k: -1))); + } + + /// The width and height come from the image when the parameters omit them. + [Fact] + public void Reads_the_geometry_from_the_image_when_the_parameters_omit_it() + { + var payload = PdfImageFilters.Decode( + Stream(Group4, Params(k: -1, blackIs1: true, geometry: false)), + 1 << 20, + "ccitt.pdf"); + + Assert.True(payload.IsDecodable); + Assert.Equal(Expected, payload.Data!.Value.ToArray()); + } + + /// A stream that is not CCITT data is a payload the filter refuses. + [Fact] + public void Refuses_a_stream_it_cannot_decode() + { + var payload = PdfImageFilters.Decode(Stream([0, 0, 0, 0], Params(k: -1)), 1 << 20, "ccitt.pdf"); + + Assert.False(payload.IsDecodable); + Assert.True(payload.Failed); + } + + /// + /// A stream that stops mid-line is refused rather than written as far as it got: the image would be + /// missing rows the document says it has. + /// + [Fact] + public void Refuses_a_group_4_stream_that_stops_mid_line() + { + var payload = PdfImageFilters.Decode(Stream(Group4[..10], Params(k: -1)), 1 << 20, "ccitt.pdf"); + + Assert.False(payload.IsDecodable); + Assert.True(payload.Failed); + } + + /// Without a row count the decoder stops when the data does, which is how a fax stream ends. + [Fact] + public void Decodes_a_stream_without_a_row_count() + { + var payload = PdfImageFilters.Decode( + Stream(Group4, Params(k: -1, blackIs1: true, geometry: false), height: false), + 1 << 20, + "ccitt.pdf"); + + Assert.True(payload.IsDecodable); + Assert.Equal(Expected, payload.Data!.Value.ToArray()); + } + + /// A bitmap above the budget is measured and nothing is kept. + [Fact] + public void Measures_a_bitmap_above_the_budget_without_keeping_it() + { + var payload = PdfImageFilters.Decode(Stream(Group4, Params(k: -1)), 16, "ccitt.pdf"); + + Assert.True(payload.IsDecodable); + Assert.Equal(Width * Height / 8, payload.Length); + Assert.Null(payload.Data); + } + + private static byte[] Decode(byte[] encoded, PdfDictionary parameters) + { + var payload = PdfImageFilters.Decode(Stream(encoded, parameters), 1 << 20, "ccitt.pdf"); + + Assert.True(payload.IsDecodable); + Assert.False(payload.Failed); + Assert.Equal(Width * Height / 8, payload.Length); + + return payload.Data!.Value.ToArray(); + } + + private static PdfDictionary Params(int k, bool geometry = true, bool blackIs1 = false) + { + var parameters = new PdfDictionary().SetInteger("K", k); + + if (geometry) + { + parameters.SetInteger("Columns", Width).SetInteger("Rows", Height); + } + + if (blackIs1) + { + parameters.Set("BlackIs1", PdfBoolean.From(true)); + } + + return parameters; + } + + private static PdfStream Stream(byte[] encoded, PdfDictionary? parameters, bool height = true) + { + var dictionary = new PdfDictionary() + .SetName("Filter", "CCITTFaxDecode") + .SetInteger("Width", Width); + + if (height) + { + dictionary.SetInteger("Height", Height); + } + + if (parameters is not null) + { + dictionary.Set("DecodeParms", parameters); + } + + return new PdfStream(dictionary, encoded); + } +}