github storytold/pdfcraft v0.12.0
PdfCraft v0.12.0

4 hours ago

Note

FreeBSD aarch64 is dropped from this release. We had to cut releases, and we cannot build this target within the 5-hour CI limit for any of the Craft apps, so we are dropping it for now. This is a known blocker, flagged for a future fix in storytold/craft-common-actions#39. FreeBSD x86_64 and every other platform are included.

What's Changed

  • M7: lay out the Edit panel as Acrobat's by @abc2cb in #2245
  • fix(engine): PNG export writes opaque pages as RGB at deflate level 3 (3–5× faster, same size) by @Piohrun in #2425
  • M3: the mode bar has no Read tab, as in Acrobat by @abc2cb in #2240
  • fix(render): read each object stream's index once (vendored hayro-syntax patch 22) by @Piohrun in #2427
  • M4: Organize pages remembers its page size, as Acrobat does by @abc2cb in #2282
  • M3: the Tools panel has no tab strip while docked alone by @abc2cb in #2244
  • M7: lay out Format text as Acrobat's panel by @abc2cb in #2249
  • M6: renaming a field renames it in the calculations that read it by @Piohrun in #3550
  • Use chrono instead of hand-rolled UTC conversion by @dylanmtaylor in #3824
  • M6: calculation order: read, check, fix and set the order fields calculate in by @Piohrun in #3708
  • security: enforce HTTPS on curl downloads (SonarCloud S6506) by @dylanmtaylor in #3933
  • ci: pin GitHub Actions to full commit SHA (SonarCloud S7637) by @dylanmtaylor in #3932
  • M6: Prepare a form ▸ Calculation order: a page to reorder, check and fix the order fields calculate in by @Piohrun in #3733
  • M6: Prepare a form ▸ Text field table: rows and columns of text fields as one edit by @Piohrun in #3479
  • M14: add Norwegian Bokmål interface and date language by @alehel in #1836
  • Integration batch: 218 PRs on main by @aiongg in #3983
  • Fill & Sign marks stay upright on rotated pages (#2392) by @AdrianTM in #3781
  • M5: drag a line's ends (and a polygon's corners) to change its length and angle by @ohagmann in #3788
  • Preferences: list the languages alphabetically by their own name by @nikolainyegaard in #3819
  • M14: complete Brazilian Portuguese catalog by @johnpetersa19 in #3827
  • M6: hovering a form field shows its tooltip (#3854) by @mtlcl410 in #3856
  • M7: keep a word on its line when its spacing differs by less than a thousandth of an em by @komo1iddin in #3861
  • M7: open the paragraph editor without a fade-in by @komo1iddin in #3862
  • M7: keep an applied paragraph's look until its page is drawn again by @komo1iddin in #3863
  • M4: a new bookmark goes to where the reader is (#3865) by @AdrianTM in #3875
  • M7: keep a paragraph open with its typing when its edit fails by @komo1iddin in #3878
  • M7: an added picture resized by a corner shows only at its new size by @komo1iddin in #3879
  • Give the print preview's grayscale tag a bit of its own by @eliets2 in #3903
  • M14: the Preferences OK button stays in reach below the scrolling settings (#3557) by @AdrianTM in #3906
  • M14: Italian catalog: the 8-character digital ID password message by @kcobelli-pixel in #3907
  • M9: closing a half of a side-by-side comparison keeps the app running (#3915) by @mtlcl410 in #3931
  • M7: a text editing session for one paragraph by @komo1iddin in #3942
  • M14: JPEG and TIFF export refuse a raster of the wrong length instead of panicking by @Piohrun in #3946
  • Reject rounded page rasters beyond the pixel budget by @narain1 in #3948
  • M7: opening a paragraph leaves the page as it is until it changes by @komo1iddin in #3952
  • M5: a Replace text comment is named Replace text, not Strikethrough (#3947) by @mtlcl410 in #3953
  • perf(render): read PDFCRAFT_TEXT_DEBUG once instead of per glyph by @narain1 in #3955
  • perf(render): look CFF glyph names up in a map (vendored hayro-interpret patch 44) by @narain1 in #3958
  • fix(engine): guard undo and redo refresh and roll back on failure (#3925) by @jonathanwxh-cell in #3961
  • M5: a stamp grows and shrinks with its handles before release (#3518) by @jay-tau in #3520
  • Render: radial luminosity fades have regression coverage by @KnottyDyes in #3540
  • M12: XFA labels and buttons without a size grow to their content by @EricKaden in #3542
  • M9: read .p7b/.p7c certificate bundles for trust import by @ffishman in #3561
  • fix: read the last array of a surplus-operand TJ, not the first (#3569) by @MichaelMuClaude in #3571
  • M12: showing an XFA subform leaves its unnamed hidden objects hidden by @EricKaden in #3582
  • Forms: Highlight fields marks only the fields that can be filled by @EricKaden in #3584
  • M7: paint a new background over older ones (#3591) by @hazeliscoding in #3595
  • fix(print): restore previous paper size after leaving Label mode (#3564) by @jpeskov in #3596
  • M14: find Apple's Devanagari faces in the folders current macOS uses by @amoisttowe1 in #3598
  • M14: Spanish catalog covers the bundled key union by @feraremag2680 in #3603
  • Page-tree walks in annot, forms and organize skip repeated children by @oracola91 in #3608
  • The image scan skips a path segment before any m instead of panicking (#3581) by @rahul05ranjan in #3621
  • Fix #3507: preserve content boundaries when merging image fragments by @ahmadmuj in #3622
  • Decode JavaScript hex and control escapes in AF script strings by @Silvertree2010 in #3623
  • fix(forms): preserve comments across content streams by @ahmadmuj in #3625
  • Render: a doubled sign is one number, so a cm with it still has a matrix by @Hamza0101 in #3630
  • Control channel: wait after a failed accept instead of retrying at once by @oracola91 in #3631
  • fix(print): retain existing appearances without Subtype by @ahmadmuj in #3633
  • Fix named properties in forms without resources by @ahmadmuj in #3637
  • Pair /ActualText correctly past 256 levels of marked content by @Silvertree2010 in #3639
  • fix(render): draw missing spacing glyphs in Japanese CID substitutes as spaces (#3601) by @jpeskov in #3643
  • Keep filtered inline images whole when their data contains EI by @Silvertree2010 in #3652
  • fix(xtask): wait for Chrome child processes to settle PDF after launcher exits (#3103) by @jonathanwxh-cell in #3654
  • Accept a delimiter after EI when ending an inline image by @Silvertree2010 in #3668
  • M8: applying redactions drops structure-tree references to the comments and fields it removes (#2874) by @Jayesh-Prajapati9 in #3674
  • M2: text extraction keeps doubled letters in text condensed to 20 Tz and below (#2457) by @Jayesh-Prajapati9 in #3681
  • fix(a11y): resolve /MarkInfo /Marked when it is an indirect reference (#3671) by @Hamza0101 in #3686
  • M3: let Escape close an open menu before it clears the selection (#3535) by @hazeliscoding in #3690
  • Edit text: keep a line together across subsets of the same font (#3661) by @amanmprojects in #3697
  • M3: fix multiline comment hover bounds and paint order by @PerchAnton in #3703
  • Parse a bare trailing "a" as AM in AcroForm date/time parsing by @Silvertree2010 in #3714
  • fix(sign): embed the issuers of macOS Keychain identities by @ffishman in #3716
  • Stop Std14::recognise mapping sans-serif font names to Times by @Silvertree2010 in #3717
  • Return empty WordNum result when cents rounding carries to 1e12 by @Silvertree2010 in #3718
  • Keep zero annotation flags through XFDF export/import by @Silvertree2010 in #3719
  • fix(render): hit-test selection against the glyph quad, not its bounding box (#3693) by @MatrixMagician in #3720
  • M12: accept Identity CJK Unicode mappings in accessibility checks (#3673) by @amanmprojects in #3721
  • Redact: count shared outline items once so the walk ends by @eliets2 in #3723
  • Join /Contents pieces with a space in measure snap by @Silvertree2010 in #3725
  • Refuse redaction marks with no readable area instead of skipping them by @eliets2 in #3728
  • M4: resolve indirect initial-view boolean preferences by @MMexicann in #3735
  • fix(comments): the eraser's size sets how wide it rubs (#3747) by @Lombardi2003 in #3749
  • feat(edit): Header & Footer can be drawn in Times or Courier (#3754) by @Lombardi2003 in #3756
  • Print: keep the picked printer for the next print (#3537) by @AdrianTM in #3764
  • fix(organize): imports find the objects they added when new numbers fill gaps by @petarlaf in #3794
  • fix(xfdf): a field name full of periods no longer overflows the stack on export by @petarlaf in #3814
  • fix(annot): a comment listed many times gets one display appearance by @petarlaf in #3816
  • Add thumbnail size controls to the Pages inspector by @robertobulltech in #3828
  • fix(ui): the Read mode command leaves Edit as the Edit tab does by @guillehr2 in #3014
  • fix(render): draw device colour in the resources' /DefaultGray, /DefaultRGB and /DefaultCMYK (vendored hayro-interpret patch 38) by @guillehr2 in #3018
  • fix(ui): Fill & Sign font size resizes the selected text (#1274) by @mtlcl410 in #3039
  • fix(save): preserve destination extended attributes on macOS by @PerchAnton in #3042
  • M3: layer_set shows or hides a layer, and page_render draws with the document's view settings (#2986) by @mtlcl410 in #3043
  • M7: the paragraph editor draws on its page only (#3061) by @mtlcl410 in #3070
  • docs(roadmap): record #2662, the audit's one-word cover by @Mawfyy in #3075
  • test: the image-drag pixel test waits for the page raster (flaky on windows-latest) by @mtlcl410 in #3077
  • feat(viewer): add optional gapless continuous page display by @DjPeepjay in #3101
  • fix(render): emit clip-only text (7 Tr) to devices for text extraction (#3109) by @jonathanwxh-cell in #3116
  • fix(render): apply the JP2 palette of a JPX image with no /ColorSpace (#3179) by @mtlcl410 in #3184
  • Prevent overflow when rotating added images through automation by @PerchAnton in #3187
  • fix(forms): an XFA form whose config forbids dynamic rendering is static (#3180) by @mtlcl410 in #3192
  • Vendor and patch hayro-cmap for tolerant CMap parsing by @charan-rathore in #3195
  • M8: phone pattern finds slashed and labelled unseparated numbers (#3205) by @mtlcl410 in #3237
  • M3: extract text from glyph names outside the Adobe Glyph List (#3169, #3170) by @mtlcl410 in #3239
  • Draw a note without an appearance as a fixed-size icon at the corner of its Rect (#3175) by @MarekSpodBiedry in #3245
  • Shading patterns use the stroke or fill alpha current at paint time (#3176) by @MarekSpodBiedry in #3246
  • fix(content): accept inline image EI without preceding whitespace (#3108) by @Ozt-y in #3259
  • Lay out vertical (Identity-V) text as columns in the edit layer by @Silvertree2010 in #3289
  • Renderer: sample a mesh shading over its triangles alone, not the whole path by @ohagmann in #3296
  • Keep text rows in other layers, gs states or Tz out of a paragraph by @Silvertree2010 in #3310
  • fix(organize): prune named destinations without recursive calls by @PerchAnton in #3311
  • M6: Optimize AcroForm JavaScript snapshots and diffs by @djmushin in #3318
  • M6: Treat AcroForm /MaxLen 0 as unlimited by @djmushin in #3323
  • Rail: scroll the panel buttons above the page navigation in short windows (#3282) by @majidninja in #3325
  • Render: a five-point polyline is no longer painted as its bounding box by @Hamza0101 in #3327
  • M2: preserve word spaces around TOC leaders (#3086) by @robertobulltech in #3348
  • fix(a11y): join and splice page content streams with cross-stream rules (#3217) by @jonathanwxh-cell in #3357
  • fix(windows): present Direct3D 12 through a composition visual, so resizing doesn't stretch (#2738) by @mtlcl410 in #3376
  • M12: an XFA script that fails partway keeps what it changed before the error by @EricKaden in #3408
  • Honor single-page redaction selections by @earlvanze in #3411
  • M5: centre selected inspector comments without changing zoom (#3418) by @LabDennis in #3423
  • fix(render): use unfiltered inline image byte length before EI heuristic (#3107) by @jonathanwxh-cell in #3438
  • fix(engine): a reload keeps reading colours and hidden comments (#3443) by @mtlcl410 in #3452
  • fix(edit): keep a superscript footnote marker in its paragraph's row (#3252) by @MichaelMuClaude in #3471
  • fix(forms): draw fields the file leaves to the viewer, for display only (#3470) by @mtlcl410 in #3475
  • M2: Type 0 fonts with /ToUnicode /Identity-H read their codes as Unicode by @Lcoding15 in #3497
  • i18n: add Central Kurdish (Sorani) as an interface language by @Nyanpasuwu in #3498
  • M12: XFA text honors its horizontal font scale by @EricKaden in #3515
  • M12: a space at the end of a line doesn't count when fitting XFA text by @EricKaden in #3521
  • M3: snapshot tests of every side panel by @Dubblbindong in #3525
  • M6: a push button's caption uses the font, size and color of its /DA by @EricKaden in #3543
  • M7: let a list marker open an item and a hanging indent continue it (#2564) by @Hathor875 in #2612
  • fix(xfa): run click scripts for every repeated print button by @PerchAnton in #2619
  • feat(forms): nudge the selected field with the arrow keys in Prepare a form (#2608) by @fanyzp in #2621
  • Print ▸ Properties…: the driver's options in the UI language by @bulgariamitko in #2647
  • fix(comments): Add a text box takes a drag that sizes the box by @marcoarnulfo in #2706
  • i18n: add Lao (lo) translation support by @bounkirdni-2025 in #2714
  • fix(automation): tools on a file the viewer reads fewer pages of answer instead of panicking by @cortenburg28-arch in #2715
  • fix(edit): keep a one-row centred title centred when it grows (#2581) by @Hathor875 in #2723
  • fix(print): disable Print on documents whose security forbids printing by @marcoarnulfo in #2724
  • Layers panel: Reset to Initial Visibility by @marcoarnulfo in #2731
  • M7: a paragraph number keeps naming the paragraph text_paragraphs listed (#2516) by @hcchung1 in #2756
  • M14: complete and review the Czech catalog by @qwerin in #2758
  • M5: reduce Comments panel scans on large reviews (#2669 item 5) by @ahmadmuj in #2805
  • fix(cli): info, text, render and audit take the owner password of R2–R4 files by @enesoglu in #2825
  • M7: Header & footer: shrink the page content out of their way (#2140) by @switch87 in #2832
  • M6: detected form fields get no border or fill by @boneyland in #2840
  • fix(print): offer the US #10 envelope as a paper size (#2734) by @cortenburg28-arch in #2851
  • Redaction audit: an opaque filled Square annotation over text is a cover by @midasmatterhorn in #2854
  • Treat CRLF as a single line break in fonts::wrap by @Silvertree2010 in #2859
  • fix(ui): Korean (Hangul) file names and tab titles draw as boxes by @brian-moon in #2872
  • M3: the "Save changes?" prompt opens on Save and moves between buttons by keyboard by @Harrison-Booth in #2890
  • M9: rewriting a certified form's XFA data is a form fill (#2759) by @mtlcl410 in #2897
  • Forms: measure a field's own simple font, not Helvetica, when laying out its text by @marcoarnulfo in #2900
  • fix(render): draw comma-below letters in non-embedded standard fonts … by @TiagoCK in #2914
  • Fix/cli option value errors by @Bode512 in #2935
  • fix(ui): keep a closed right panel closed when a PDF asks to open on its outline (#2884) by @MarekSpodBiedry in #2945
  • M2: a post table version with swapped halves doesn't make a font unusable (#2946) by @mtlcl410 in #2949
  • Keep seconds in FormCalc Time2Num/IsoTime2Num for ISO 8601 times by @Silvertree2010 in #2963
  • fix(render): blend modes over an empty part of the page keep their colour (#2970) by @mtlcl410 in #2972
  • fix(render): knockout transparency groups knock out (#2971) by @mtlcl410 in #2974
  • fix(render): a stencil mask is drawn at the fill opacity once (#2975) by @mtlcl410 in #2977
  • fix(render): a visibility expression decides what an OCMD shows (#2986) by @mtlcl410 in #2987
  • fix(sign): explain 0x8009001D and 0xC0000225 when a store key's provider fails by @mtlcl410 in #2989
  • Render month and weekday names in XFA date patterns by @Silvertree2010 in #2993
  • M10: Export to Word keeps the page background colour (#2992) by @mtlcl410 in #2994
  • Zero-pad required integer digits in FormCalc Format() by @Silvertree2010 in #3004
  • fix(cos): write whole reals past the 32-bit integer range as reals by @mtlcl410 in #3006
  • fix(ui): the password prompt takes typing on Linux again by @guillehr2 in #3007
  • fix(edit): a paragraph's width handle rewraps it from its whole handle, not just the inner half (#2276) by @guillehr2 in #3008
  • fix(ui): the mode tabs keep the hand over a page scrolled under them by @guillehr2 in #3010
  • M12: the page side of a measuring scale takes a unit, so 1:50 is 1 mm = 50 mm (#2752) by @guillehr2 in #3011
  • fix(forms): renaming a nested field checks the full name it would take by @guillehr2 in #3013
  • fix(comments): the note editor takes the keyboard once, so V and H pick tools again by @guillehr2 in #3015
  • fix(render): draw each ICC profile through itself when two have the same stream dictionary (vendored hayro-interpret patch 40) by @guillehr2 in #3020
  • fix(ui): on-page text editors leave the mode tabs their pointer when scrolled under them by @guillehr2 in #3022
  • fix(render): mesh triangles that share an edge leave no seam by @mtlcl410 in #3035
  • Ita Translate by @Nai-ITA in #1523
  • Hebrew file names: draw them with an installed Hebrew face when the build has none by @marcoarnulfo in #1624
  • XFA: decode BMP and TIFF pictures by @marcoarnulfo in #1648
  • Open: opening an already-open document focuses its tab (#1620) by @edurbs in #1663
  • fix(sign): render Unicode characters in visible signatures using bundled Inter font by @PINYOPATTANAWASANPORN in #1679
  • docs: keep one copy of the catalog paragraph in localization.md by @feraremag2680 in #1778
  • M10: keep dotted-leader contents entries together by @webdevtodayjason in #1829
  • M11: remove PDF/A or PDF/X identification (optimize.remove-standards-id) by @Erry91 in #1830
  • fix(cos): check object-stream member numbers and offsets (#1815) by @TiagoCK in #1850
  • M9: read DocMDP permissions from the signed revision (#1788) by @Ridzzz0Alam in #1962
  • i18n: add Indonesian, Vietnamese, Hindi and Korean interfaces by @pechnikov2026-star in #1976
  • Edit images: rotate an image by any angle with a knob (#1940) by @vangel76 in #1989
  • fix(ui): respect reading background while pages load by @sampaiodias in #2060
  • M3: full screen shows one fitted page at a time, as Acrobat's Full Screen Mode (#1459) by @mtlcl410 in #2070
  • cos: property tests for save fidelity (part of #1187) by @amoisttowe1 in #2073
  • i18n: add Albanian (sq) interface language by @Saimirbaci in #2079
  • i18n: add Thai (th) interface language by @mixlnwuu in #2141
  • fix(ui): a second file dialog waits for the open one instead of being refused by @marcoarnulfo in #2154
  • fix(docs): correct spelling of "Formatting" in comments by @arpan-star in #2172
  • Print: remember selected paper size across restarts (fixes #2156) by @srt8hellcat2-ui in #2173
  • Add Finnish interface and date language by @Janiz-zzz in #2210
  • fix(cos): find objects a broken cross-reference table leaves out by @marcoarnulfo in #2220
  • M14: add Catalan interface and date localization by @guillemvela in #2227
  • fix(forms): Tab and Space reach check boxes and radio buttons, and a click focuses them by @marcoarnulfo in #2235
  • Preferences: field highlights on by default, toggle in Appearance (#2273) by @vangel76 in #2279
  • Draw the widget border inside /Tx BMC so Acrobat keeps it on focus changes (#1613) by @earlvanze in #2280
  • Keep Auto font size in the field properties Appearance tab by @Silvertree2010 in #2294
  • fix(optimize): reject hostile image dimensions safely by @earlvanze in #2321
  • crypt: authenticate against encryption numbers qpdf wrote (plus one hand-derived vector) by @amoisttowe1 in #2359
  • Issue #2365: a rebuilt file keeps the /Info and /ID of its cross-reference stream by @wstock in #2397
  • Issue #2366: a trailer whose /Prev is a reference still reaches the earlier sections by @wstock in #2400
  • M14: Polish says what a signature says, and the rest of the interface by @marcintrojnacki in #2452
  • M5: year-first slash dates (yyyy/mm/dd, yyyy/m/d) for Fill & Sign and headers by @mtlcl410 in #2454
  • macOS: bring the window forward when a file is opened in the running app (fixes #1928) by @manchitmr in #2461
  • M7: show a shaped run in one text object instead of one per glyph by @komo1iddin in #2481
  • M7: drop the fallback fonts a text edit leaves unused by @komo1iddin in #2487
  • Ctrl+V pastes a picture from the system clipboard onto the page by @marcoarnulfo in #2506
  • fix(sign): fill typed signature outlines with non-zero winding (#1786) by @jonathanwxh-cell in #2513
  • docs(claude): check for existing issues and PRs before starting a fix by @alehel in #2521
  • Signatures: signed attributes must carry the message digest and the data content type by @oracola91 in #2559
  • Signatures: the message bar shows a problem before "Certified by" by @oracola91 in #2568
  • M10: Two-sided starts at Printer default, so the printer's own duplex applies (#2422) by @magdale76 in #2584
  • fix(combine): let the cards zoom to 500% (#2531) by @Hathor875 in #2603
  • M12: Compare panel filters text changes and visual differences (gap 21) by @marcoarnulfo in #2607
  • fix(edit): draw the Cyrillic the Japanese faces lack with the bundled Inter face (#2593) by @fanyzp in #2609
  • fix(xfa): enforce maxLength on rich-text fields by @PerchAnton in #2615
  • fix(xfa): reflow growable multiline fields after filling by @PerchAnton in #2624
  • Wake idle windows for pending recovery snapshots (#2663) by @FredApps in #2711
  • fix(ui): show the physical page position under a labelled page box (#2834) by @cortenburg28-arch in #2857
  • M14: complete the French interface catalog (267 entries) by @Atalantis in #1594
  • Preferences: always use my default zoom and page layout by @marcoarnulfo in #1749
  • README: the app icon above the title by @bflatastic in #4051
  • fix: add generic font-family fallbacks (SonarCloud css:S4649) by @dylanmtaylor in #3934
  • Build each crate's integration tests as one binary by @aiongg in #4087
  • fix(cos, sign): close encryption and signature-validation gaps from a security scan by @aiongg in #4097
  • fix(engine, automation, js, platform): enforce copy, print and removal limits and check code compiled from strings by @aiongg in #4100
  • fix(xfdf, create, optimize): keep imported comments off form fields, draw imported redaction marks, neutralise CSV formulas and bound two parsers by @aiongg in #4101
  • fix(redact): remove hidden information completely or refuse, and bound its scan by @aiongg in #4106
  • fix(a11y, fonts, export, optimize): bound the work that repeated page, font and export structures multiply by @aiongg in #4123
  • fix(redact): redact what the page draws, check every input stream, and bound redaction's work by @aiongg in #4107

New Contributors

Full Changelog: v0.11.0...v0.12.0

Don't miss a new pdfcraft release

NewReleases is sending notifications on new releases.