GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — tika/CHANGES.txt at main · apache/tika Expand file tree/ Copy pathCHANGES.txtMore file actions 4986 lines (3566 loc) · 210 KB / Copy pathCHANGES.txtFile metadata and controls4986 lines (3566 loc) · 210 KB 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 Release 4.3.0 - ??? BREAKING CHANGES AND DEPRECATIONS * tika-pipes-* and two tika-langdetect modules no longer pull in a log4j backend; embedding apps (and their PipesServer forks) must add an slf4j binding, e.g. log4j-slf4j2-impl (TIKA-5058). * Markdown output writes math as $`...`$ (a code span, which GitHub and GitLab render as math) instead of raw $...$, so text in a math span can no longer become HTML or links. Readers that only know $...$, such as pandoc, show it as code. Only spans with class "math inline" or "math display" count as math; a PDF structure type or Word style named "Math" is escaped like other text (TIKA-5056). * tika-ml-junkdetect has a new model and API. JunkDetector wraps a HashedJunkModel (junkdetect.bin, format JUNKHNG1; the old model format is not read). knownScripts(), scoreWithFeatureComponents() and the per-feature compute* methods are gone; use getModel() for the trained scripts, the worst-window score and the pairwise head. TextQualityScore.getZScore() is now a logit (positive = reads as clean text) with no interval estimate, and is unknown for text with no letters or with letters only in untrained scripts. JunkFilterEncodingDetector takes a HashedJunkModel instead of a TextQualityDetector (TIKA-5027). * OneNote sections, .one and FSSHTTPB, give each page's current text and metadata only, not every stored revision. Set includePageHistory on one-note-parser, in the config or per request, for earlier revisions and saved page versions, and includeDeletedContent for FSSHTTPB recycle-bin pages. All .one attachments are still extracted. A file over a parse limit throws TikaMemoryLimitException instead of falling back to the legacy text dump. OneNoteTreeWalkerOptions, the public OneNoteLegacyDumpStrings settings and most public classes of the OneNote structure model are removed (TIKA-5057). * FetcherManager.getFetcher and EmitterManager.getEmitter return a Lease (AbstractComponentManager.getComponent is now acquire); close it when done with the component and anything it returned. Pipes now closes a Closeable fetcher or emitter when a runtime save or delete replaces it (after the last task using it ends) and on graceful shutdown; nothing closed them before. EmittingUnpackHandler takes the emitter, not the EmitterManager (TIKA-5001). * tika-grpc refuses SaveFetcher with configStoreType memory (FAILED_PRECONDITION): the forks never saw such a fetcher, so every fetch through it failed. Use file or ignite (TIKA-5001). * A mime-types XML file that defines the same type twice, directly or through an alias, fails to load with "Duplicate definition of ..."; the second definition's magic and globs were silently added to the first, so tightening a rule in one copy had no effect. A custom-mimetypes.xml that repeats a type within itself now stops Tika from loading its types; merge the repeated blocks into one. A custom file may still add globs or magic to a type defined in tika-mimetypes.xml. The eleven duplicates in tika-mimetypes.xml are merged; detection is unchanged (TIKA-5029). * 3MF packages are detected as model/3mf, their IANA type, instead of application/vnd.ms-package.3dmanufacturing-3dmodel+xml, which is the content type of the model part inside the package. The old name is an alias, so it still resolves as input, but detection output and metadata now carry model/3mf (TIKA-5049). * tika-app -T (--text-main) and the GUI's "Main content" view use Readability instead of boilerpipe, and trim HTML pages only: other formats come out as full text, as with -t. BoilerpipeContentHandler (tika-handler-boilerpipe) is deprecated (TIKA-5054). SERVER, PIPES AND OPERATIONS * A parse-context block (config file, preset, tika-server /config, gRPC parse_context_json, pipes FetchEmitTuple) for a parser, detector, renderer or translator that never reads one is logged as a warning instead of being silently ignored; Tika 5.0 will refuse it. Parsers that read a block carry the new @RequestConfigurable annotation, which a custom parser that reads its own block should add; until then it still reads it, and a warning names the class (TIKA-5059). * tika-server sets any field of the config's "server" block from the command line (--serverSetting <field>=<value>, repeatable) and the environment (TIKA_SERVER_SETTING_<FIELD>, e.g. TIKA_SERVER_SETTING_MAX_REQUEST_SIZE_BYTES), over the file's own value, so raising the 1 GiB request body limit no longer needs a config file. The 413 names the limit and where to raise it (TIKA-5025). * When pipes kills a forked server, it now kills the server's descendant processes too, such as ExternalParser commands and their children; they kept running. On a timeout, an interrupt or JVM shutdown, ProcessUtils.execute also kills the descendants of the process it started (TIKA-5040). * Fetchers and plugins built on HttpClientFactory (HTTP, Atlassian JWT, ES, OpenSearch, Solr) no longer send Authorization or Cookie headers, or answer a 401 with the configured password, after a redirect to another host, port or scheme. That includes http to https, so use the https URL in the fetch key. Applies only with maxRedirects > 0. * tika-server no longer requires a "server" block in its config file; an absent block means the server defaults, as "server": {} did. A tika-app config, or the documented Docker example { "text-recognizers": [] }, now works as is. * The tika-server full and tika-grpc Docker images no longer install ttf-mscorefonts-installer, which downloaded Microsoft's fonts from SourceForge at build time; non-embedded Verdana, Georgia, Trebuchet, Impact, Comic Sans and Arial Black now render with Liberation fonts. The images add the IPA and WenQuanYi fonts, so pages in non-embedded Japanese and Chinese fonts render instead of showing empty boxes or nothing (TIKA-5005). * The S3 fetcher, emitter and pipes iterator accept credentialsProvider "web_identity" for EKS IAM roles for service accounts (IRSA), and "default" for the AWS SDK default chain, which covers ECS task roles and EKS Pod Identity; the plugin now bundles the AWS STS module these need (TIKA-5006). * tika-grpc applies parse-context.timeout-limits and exception-reporting in the server process too, so its backstop for a hung worker no longer falls back to the built-in timeouts. A FetchAndParse call interrupted before the parse finished (server shutdown) closes with UNAVAILABLE; a unary call used to fail with INTERNAL "no value received", a server-streaming call completed with no reply, and a bidirectional stream went on to throw on the closed call. Thanks to Kristian Rickert and Davide Polato (TIKA-5010). * The GCS fetcher, emitter and pipes iterator no longer require projectId. When it is unset, the client resolves a project from the environment, as it does for its credentials (TIKA-5009). * The Kafka emitter reports success only once Kafka has acknowledged every record (per acks); a rejected or timed-out record fails the emit instead of being lost silently, and the producer is flushed and closed on shutdown. (TIKA-5008). * The JDBC emitter is thread-safe: concurrent emits (shared-server mode, several async emitter threads) shared one connection and prepared statement unguarded, mixing values across rows and committing each other's batches (TIKA-5007). EXTRACTION AND FORMATS * ASX playlists (application/x-ms-asx) are parsed by JSoupParser; XMLParser failed on many real ones (mixed-case or unclosed tags, raw '&', non-UTF-8 without a declaration). Texinfo files are parsed as text; they produced no content (TIKA-5029). * Bare RPM headers (yum *.hdr files), pdf.js binary CMaps, Across Lite crosswords (application/x-crossword), Commodore 64 tape images (application/x-commodore-tape), OpenOffice.org 2.x/3.x registry cache files and LibreOffice user-profile backup (user/pack) files are detected by content; they were application/octet-stream, or application/x-git-pack for a pack file with two or three entries (TIKA-5029). * ISO-2022-JP is decoded as x-windows-50221, so NEC/IBM extension characters (circled numbers, Roman numerals) no longer become U+FFFD. ISO-8859-1, ISO-8859-9, TIS-620 and ISO-8859-11 decode as windows-1252, windows-1254 and windows-874, as browsers do, when a detector other than the default chain reports them (TIKA-5045). * Binary files are no longer detected as text because of their name or a text header. When content has no magic and at least 5% control bytes, and does not decode as UTF-16 or UTF-32, a text type from the file name or Content-Type no longer wins: Terminal Reality .pod archives, Mozilla startupCache bytecode named .js or .xul, CODESYS .meta files and similar are now application/octet-stream. DefaultDetector no longer re-sniffs the first 512 bytes for text after MimeTypes found the 64 KB prefix binary, so a binary body behind a short text header (Sass caches, BSB/KAP charts) is no longer text/plain; zero fill after lines of text (a crashed or preallocated log) does not count as binary. A UTF-8 BOM followed by binary magic (JPEG, PNG, GIF, ID3, zip, SQLite) is detected by that magic instead of as text (TIKA-5029). * Content with no magic is judged text or binary by TextBinaryClassifier, a small model over byte statistics of the 64 KB prefix, instead of TextDetector's control-byte check, which only accepted mostly-ASCII or valid UTF-8. Extensionless text in legacy encodings (windows-1251, GB18030, Shift_JIS, EUC-JP, EUC-KR, KOI8-R and others), logs with a few control bytes, zero-filled holes or backspace progress bars are now text/plain; 3.x returned application/octet-stream for these, and 4.0-4.2 rescued some only through a 512-byte re-sniff. Printable ASCII is always text; inputs under 16 bytes keep the old check. A text name or Content-Type still loses to content with 5% or more control bytes that the classifier calls binary (TIKA-5062). * New or fixed magic: Emacs bytecode from every Emacs version (only version 19 matched before, and *.elc is no longer also an octet-stream glob), Lua bytecode (application/x-lua-bytecode), Qt .qm translations (application/x-qt-translation, were text/html), SELinux policy packages (application/x-selinux-policy-package, were text/x-pascal by *.pp), Performance Co-Pilot archives (application/x-pcp-archive), and binary FrameMaker documents ("<MakerFile"), now application/vnd.framemaker instead of the text MIF type application/vnd.mif (TIKA-5029). * Markdown output keeps document code inside its code spans and blocks: a line of backticks inside <pre> no longer closes the fenced code block, and a line break inside inline code, alt text or a link destination, or a lone CR inside <pre>, no longer starts a new markdown line, so none of them can turn the text after it into raw HTML. A paragraph starting with "+ " stays a paragraph instead of becoming a list, and elements nested more than 64 levels deep are flattened, so deep nesting can no longer overflow the stack or make the output grow with the square of the depth (TIKA-5061). * HTML main-content extraction: tika-readability is a jsoup-only Java port of Mozilla Readability, and "readability-jsoup-filter" in the parse context runs it in JSoupParser (off by default; HTML documents only, never message bodies or other HTML inside a document, so .mht saved pages are not trimmed; tk:readability:* metadata). "jsoup-filters" runs a list of jsoup filters, including your own JsoupFilter implementations, in order (TIKA-5054). * Container formats that were detected only as generic OLE2, OPC or zip are now detected by their streams, package relationships or entries: Autodesk Revit projects and families, 3ds Max scenes, Ichitaro documents, Windows Thumbs.db caches and newer SolidWorks files (OLE2); NuGet packages, FictionBook 3 e-books and Windows Hardware Lab Kit packages (OPC); and Mozilla add-ons with an install.rdf or a Mozilla signature, which are now unpacked as zip archives (TIKA-5029). * Zip-based application packages are detected by their entries: MuseScore scores, compressed MusicXML (by its score), zip-format CorelDRAW drawings, Power BI reports, FreeCAD documents, SMART Notebook lessons, Anki decks, Fritzing sketches, Scratch 2 and 3 projects (by their project.json), LEGO Digital Designer models, App Inventor projects and USDZ packages (model/vnd.usdz+zip). They are still unpacked as zip archives, and keep their detected type in the output (TIKA-5029). * MP4 and QuickTime files with a box over 2 GB, typically an mdat in front of moov, keep their metadata: the walk skips such a box instead of stopping (TIKA-5051). * OneNote FSSHTTPB sections extract each stored file once, not once per reference to it (TIKA-5057). * OneNote attachments and pictures carry their stored file name (resourceName) and, for inserted files, the path they were inserted from (tk:orig-resource-name). .one sections named none before, and an FSSHTTPB file's icon no longer takes the file's name and ATTACHMENT type (TIKA-5057). * OneNote note tag labels ("To Do", "Important", custom tags) are written before the paragraphs they tag, as <p class="note-tag"> (TIKA-5057). * OneNote pictures that are hyperlinks are written inside <a href>, so their URLs reach link handlers (TIKA-5057). * OneNoteParser parses .onetoc2 notebook tables of contents, listing their section names (TIKA-5057). * OneNote sections that fell back to the legacy text dump now parse structurally, including OneNote 2007 sections, Aspose.Note files and sections with leftover bytes from earlier saves. OneNote 2003 sections fall back to the dump instead of failing (TIKA-5057). * OneNote text that was dropped or garbled is extracted: objects edited in later revisions, text behind element child references, and paragraphs with hyperlinks (now <a href>). Extended ASCII is read as windows-1252, and NULs and U+FFFC placeholders are removed (TIKA-5057). * OneNote output adds pictures as <img> with alt text, OneNote's OCR text as <div class="ocr">, and .one handwriting recognition as <span class="handwriting"> (TIKA-5057). * Password-protected OneNote sections throw EncryptedDocumentException; FSSHTTPB ones were never detected because their GUIDs were MD5-hashed. dc:creator includes original authors. A file shorter than its header throws a TikaException (TIKA-5057). * OneNote parsing bounds CPU and memory on crafted files with limits scaled to file size, and rejects more malformed structures up front (TIKA-5057). * OneNote .one sections allocate far less and small ones parse much faster, reading through a small page cache instead of one system call per field. Large multi-revision sections can be slower, as every committed revision is now read (TIKA-5057). * OneNote legacy text dump: strings crossing a 1 MB read boundary are written once, and strings are judged by the text-quality detector (tika-ml-junkdetect) when it is on the class path (TIKA-5057). * tika-ml-junkdetect: JunkDetector has a public no-arg constructor, so ServiceLoader finds it on the class path (TIKA-5057). * WOFF and WOFF2 fonts (font/woff, font/woff2), SquashFS images (application/vnd.squashfs), Adobe Swatch Exchange files, PalmDOC e-books and binary OpenPGP signatures (application/pgp-signature) are detected by content; they were application/octet-stream. Together they are about a sixth of the Common Crawl files Tika could not identify. MXF and Java serialization streams are detected by content too (they had globs only), EOT fonts of version 0x00010000 and 0x00020001 are detected (only 0x00020002 was), and torrent files whose first key is not "announce" are detected (TIKA-5029). * US FEC electronic filings (application/x-fec, a kind of text/plain, so their text is extracted), gettext message catalogs, Garmin MapSource databases, Blizzard MPQ archives and Warcraft III maps and replays, VCDIFF and Xdelta patches and Paint Shop Pro images are detected by content; they were application/octet-stream. SID tunes in RSID format are detected, and PSID needs a valid version after the magic (TIKA-5029). * HTML that opens with a fragment instead of <html> (a <meta>, <script>, <p>, <br>, <table> or similar tag, as in pages that start with PHP warnings) is detected as text/html, and Windows Media playlists without an XML declaration are detected as application/x-ms-asx; they were application/octet-stream or text/plain. A PDF or XHTML document with such a fragment in front keeps its type (TIKA-5029). * A new test fails the build on tika-mimetypes.xml rules that load but can never match as written (TIKA-5029). * Elasto Mania levels, binary OpenPGP keys, StuffIt (SIT!) archives, MPEG transport streams (video/mp2t, now also *.m2ts and *.m2t), Symbian 9 installers, FLC and FLI animations, Microsoft Reader e-books, lrzip archives, Glulx games, Scream Tracker 3 modules and Monkey's Audio files are detected by content, and so are MARC records with a blank bibliographic level; they were application/octet-stream (TIKA-5029). * NoteWorthy Composer songs, Finale (Enigma binary) scores, ReCycle REX2 loops, i-mode MFi melodies, TrackMania/ManiaPlanet GameBox files, PlayStation 3 packages and themes, Trainz content packages, ZX Spectrum RZX recordings, Quake and Half-Life sprites, NuFX (ShrinkIt) and Amiga LZX archives, MikroTik RouterOS packages and ClamAV signature databases and updates, and Casio FX-Interface files are detected by content; they were application/octet-stream (TIKA-5029). * DER certificate revocation lists (application/pkix-crl), DER X.509 certificates signed with any algorithm (only some RSA, DSA and ECDSA ones were matched, so SM2 and Ed25519 certificates were missed) and RFC 3161 time-stamp replies are detected by content; they were application/octet-stream (TIKA-5029). * glTF binary models, Blender scenes, Autodesk FBX (binary), Jw_cad and FastCAD drawings, Valve Source maps, Unreal Tournament compressed packages, SoundFont 2 banks, zsync control files and PhysioNet WFDB annotations are detected by content; they were application/octet-stream in a recent Common Crawl sample (TIKA-5029). * NEXRAD Level III radar products, UCSC bigBed, bigWig and 2bit files, uncompressed BAM and BAM indexes, OpenStreetMap PBF, LIGO/Virgo frame files, QEMU qcow disks, ImageDisk floppy images, MAME CHD, devicetree blobs and FIT images, U-Boot legacy images, UBI images, AmigaOS executables, DirectDraw Surface images (image/vnd.ms-dds), YM chiptunes, VST presets and older Jw_cad drawings are detected by content; they were application/octet-stream in a recent Common Crawl sample (TIKA-5029). * HP printer jobs are detected by content: PJL jobs by the language they enter (PCL, PCL XL or PostScript), and raw PCL5 and PCL XL streams. So are IBM MO:DCA (AFP) documents, Windows minidumps and kernel dumps, StarView metafiles, Lotus 1-2-3 files with format version 0x1005, Promethean ActivInspire flipcharts, Casio calculator (g1m family) files, Haihaisoft DRM-X protected files and Navitel maps; they were application/octet-stream (TIKA-5029). * gcov coverage data and notes, Python bytecode and pickles, Apache Lucene index files, git packfiles, ACPI tables, TZif time zone files (application/tzif), Firefox mozLz4 files and JPEG XR images (image/jxr) are detected by content; they were application/octet-stream (TIKA-5029). * More variants are detected by content: OpenPGP keys and signatures in new-format packets (as written for RFC 9580 v6 keys), v1 DER certificate revocation lists (no version field), gettext catalogs with minor revision 1 and VCDIFF deltas in open-vcdiff's SDCH format; they were application/octet-stream (TIKA-5029). * EpubParser resolves manifest hrefs as URI references relative to the OPF: a '+' is no longer read as a space, and '../' is followed, so such chapters and images are no longer skipped. encryption.xml URIs are resolved the same way. The new ZipEntryPaths in tika-parser-zip-commons does the resolving (TIKA-5050). * Canon CR3 raws have a parser of their own, Cr3Parser in the image module, instead of going through the MP4 parser: their Exif data (IFD0, Exif IFD, Canon maker note, GPS) is extracted, the JPEG preview (PRVW, 1620x1080 on current bodies) is the THUMBNAIL and the 160x120 THMB thumbnail is INLINE, so the thumbnail preset serves a preview (TIKA-5042). * Blender files (.blend, .blender, application/x-blender, new) yield the preview Blender stores as the THUMBNAIL embedded document, for every file format version including the one of Blender 5.0. A gzip- or zstd-compressed file is detected by its content and read the same way; zstd needs zstd-jni on the classpath (TIKA-5036). * RAR5 archives are parsed: RarParser no longer refuses them, junrar has read RAR5 since 8.0.0 (TIKA-5043). * SketchUp models (application/vnd.sketchup.skp, new, detected by their header) yield the preview SketchUp stores as the THUMBNAIL embedded document, from SketchUp 3 to 2026 (TIKA-5036). * Jupyter notebooks (.ipynb, new type application/x-ipynb+json) are parsed: cell sources and plain-text outputs as text, kernel, language and format version as jupyter:kernel, jupyter:language and jupyter:nbformat, and the image outputs as embedded documents, as are the images markdown cells carry as attachments. The thumbnail is picked as nbsphinx picks it: the output a cell marked nbsphinx-thumbnail names, else the last image in the notebook, given as PNG or JPEG where the output also holds them as SVG (TIKA-5037). * FictionBook marks the cover image named in <coverpage> as a THUMBNAIL embedded resource, so the thumbnail preset serves it (TIKA-5035). * MP4Parser extracts text subtitle tracks (tx3g/mov_text, QuickTime text) as embedded text/vtt documents named track-<id>.vtt, synthesized from the samples and parsed by SubtitleParser, with the track language as dc:language (ISO 639-2; QuickTime Mac language codes are mapped); chapter tracks are skipped. Samples are found through the sample tables, and through moof/traf/trun in fragmented files, and read by seeking. This needs a file, content already in memory (a byte array or a digest-drained stream), or an archive entry up to 1 MB (more within a cache memory budget); other inputs are silently not searched. Off with extractSubtitles on mp4-parser (TIKA-5030). * New MatroskaParser for Matroska and WebM, which previously had no parser: it extracts SubRip, ASS/SSA and WebVTT text subtitle tracks the same way, with the track name as dc:title and the track language (BCP 47 or ISO 639-2; "eng" when the track names none, as the format specifies). It stops at the first Cluster when there is no text track; otherwise it reads every block header, seeking past other tracks' blocks in a file and reading through them in a stream. No container metadata yet. Off with extractSubtitles on matroska-parser (TIKA-5030). * MP4Parser extracts CEA-608 closed captions (CC1-CC4) as embedded text/vtt documents: from QuickTime c608 tracks by default (off with extractClosedCaptions), and from H.264/HEVC SEI with videoCaptionScan PROBE or FULL. Caption reads have their own per-file limits (TIKA-5039). * Parse Mobipocket and Kindle ebooks (.mobi, .prc, .azw, .azw3): EXTH metadata, the cover as the THUMBNAIL embedded document, the other images, and the text, stored, PalmDOC- or HUFF/CDIC-compressed, through the HTML parser (of a KF8 book the HTML flow only). A hybrid file yields its version 6 book; extractKf8 emits the KF8 copy as an embedded document too. An encrypted book yields its metadata and images, sets tika:encrypted and records the locked text as a warning. New keys mobi:version, mobi:compression, mobi:encryption, mobi:cde-type, mobi:hybrid. maxTextLength caps the text (16 MB, and 32 times the file size), maxFileSize the bytes read (256 MB). application/vnd.amazon.mobi8-ebook (*.azw3) is new, and with application/vnd.amazon.ebook a sub-type of application/x-mobipocket-ebook: a .azw file is now detected as application/vnd.amazon.ebook, not application/x-mobipocket-ebook, and a .prc or .azw that is not a Mobipocket book yields nothing and a warning (TIKA-5026). * Zip-based formats that carry a preview image have it emitted as the THUMBNAIL, so the thumbnail preset serves it: comic book archives (.cbz, new type application/vnd.comicbook+zip, the first page in name order), Krita (.kra, preview.png), OpenRaster (.ora, Thumbnails/thumbnail.png), FreeCAD (.FCStd, thumbnails/Thumbnail.png), Procreate (.procreate, QuickLook/Thumbnail.png) and Sketch (.sketch, previews/preview.png). All six are new types and sub-types of application/zip (TIKA-5032). * PSD files emit the JPEG thumbnail Photoshop stores in image resource 0x040C as a THUMBNAIL embedded resource, so the thumbnail preset serves it; one over maxDataLengthBytes is skipped with a warning (TIKA-5033). * 3MF packages are parsed as zip packages instead of failing as XML: the type is a sub-type of application/zip, and the streaming zip detector recognizes it (TIKA-5031). * 3MF packages have the image their package thumbnail relationship names emitted as the THUMBNAIL, usually Metadata/thumbnail.png; a model part's own thumbnail is not taken (TIKA-5032). * New SubtitleParser for WebVTT (.vtt) and SubRip (.srt). Each cue becomes <div class="cue"> with data-start/data-end (HH:MM:SS.mmm) and data-id, its text cleaned of markup; WebVTT NOTE blocks become <div class="note"> and a Language header sets dc:language. Both were parsed as plain text before, timings and markup included. Magic fixes: SubRip with CRLF line endings (typo in the rule); WebVTT with a title or tab after "WEBVTT", with a UTF-8 BOM and a title, or in UTF-16 (TIKA-5028). * Detect Python scripts with /usr/bin/env python shebangs as text/x-python instead of application/x-sh (TIKA-4408). * Perl, Ruby, Node, PHP, Lua and Tcl scripts are detected by their shebang line (#!/usr/bin/env ruby, #!/usr/local/bin/node, ...) instead of as application/x-sh. Magic values with "\ " or "\t" now match a space or tab; the decoder wrote a NUL byte instead, so about 25 rules never matched, among them Word 6 and Excel 5 at offset 2080, BibTeX, KDE desktop entries and "#! /bin/sh". Of those, the text/x-diff rules "*** " and "Only in " and the message/rfc822 rules "Forward to" and "Pipe to" are dropped, and "diff " needs a "--- " or "*** " line within 1 KB (TIKA-4408). * PPTX slides are extracted in presentation order (p:sldIdLst in presentation.xml) instead of relationship-id order, which put rId10 before rId2; embedded-resource page numbers follow the same order. Slides that are related but missing from the list are extracted last and counted in msoffice:ppt:num-unlisted-slides (TIKA-5017). * Superscript and subscript are kept as <sup>/<sub> in XHTML for docx (w:vertAlign, directly or through a character style), pptx (a:rPr baseline), doc, RTF (\super, \sub, \nosupersub) and HTML; they were dropped, so "x<sup>2</sup>" read "x2" and footnote markers fused with the word before them. .ppt is not covered (TIKA-5016). * VLM text recognizers (jina-ocr, OpenAI-compatible, Claude, Gemini) no longer corrupt LaTeX math in model output: $...$, $$...$$, \(...\) and \[...\] are kept verbatim instead of being read as Markdown, which dropped the backslash from \{, \} and \| and split GFM table cells on |. Math is emitted as <span class="math inline"> or <span class="math display">, and the Markdown writer outputs it unescaped (TIKA-5011). * The OpenDocument parser writes repeated cells and rows (table:number-columns-repeated, table:number-rows-repeated) once per repeat; a cell was written once with that colspan and a row once, so values repeated across columns or rows were lost. As in the Excel parsers, empty rows are dropped and empty cells are written only to pad out to the next value in their row. Past 10 million characters and elements of padding and repeated content per document, the rest are written once and padding is dropped, with a tk:exception:warn entry (TIKA-5014). * The OpenDocument parsers (open-document-parser, flat-open-document-parser) take includeMissingRows, as the Excel parsers do: when true, each empty spreadsheet row before a row with content is written as an empty row, up to 100,000 per document. The default is false (TIKA-5014). * VLM text recognizers keep superscripts and subscripts: inline <sup>/<sub> in model output (x<sup>2</sup>, H<sub>2</sub>O, footnote markers) reach the XHTML as sup/sub instead of plain text ("x2"), and the Markdown writer outputs them as inline HTML. * Charset detection recognizes ISO-8859-5 (Cyrillic), ISO-8859-6 (Arabic) and ISO-8859-7 (Greek) without a declaration; they were reported as windows-1251/1256/1253, x-EUC-TW or windows-1252, which garbled the text. When candidates decode identically, the report is the charset most frequent on legacy-charset web pages, e.g. windows-1252 over ISO-8859-2 for Western text (TIKA-5019). * Charset detection treats a byte-order mark as a strong hint, not a declaration: it is honored only when the bytes after it decode in that charset, and a rejected BOM is dropped rather than left in the text as junk characters (TIKA-5019). * An HTML meta charset naming UTF-16 (or UTF-32) is read as UTF-8, as the WHATWG prescan does: a meta readable as ASCII means the bytes are not UTF-16. A page with a UTF-8 BOM and a UTF-16BE meta was decoded as UTF-16BE, turning its text into CJK characters (TIKA-5019). * Charset detection reads UTF-8 with sparse corruption (up to one bad sequence per ten valid ones, existing U+FFFD not counted) as UTF-8 (TIKA-5019). * Charset detection reports the windows-125x sibling of an ISO-8859 charset (e.g. windows-1250 for ISO-8859-2) when the page's 0x80-0x9F bytes are punctuation that only the windows charset prints (… “ ” €) and no letters decode differently, even when the page declares the ISO charset (TIKA-5027). * Charset detection uses a hashed byte n-gram model in place of the byte-bigram Naive Bayes model, with UTF-16 and UTF-32 detected by the same model instead of a separate UTF-16 detector. BOM-less UTF-16 with an emoji is no longer misread, UTF-32 is no longer reported as UTF-16, a surrogate pair cut at the end of the sample no longer rules UTF-16 out, and short BOM-less UTF-16 Thai, Cyrillic or Indic text is no longer read as windows-1252. Input the model calls binary gets the low-confidence windows-1252 fallback, as undetectable input did before. Adds IBM437 as a detected charset (TIKA-5052, TIKA-5048). * The charset model no longer calls valid UTF-8 binary when it has no NUL and no control character other than tab, line feed, form feed, carriage return and escape (a character cut at the end of the sample is allowed); its next most likely charset is used. Short CJK, Greek and Thai samples were often called binary (TIKA-5052). * Charset detection reads BOM-less UTF-16 with trailing NUL padding, U+0000 separators, stray control code units or fully vocalized Arabic as UTF-16, not binary; Spanish, Portuguese and Catalan text with ¡ ¿ º ª as windows-1252, not ISO-8859-3; Kurmanji as windows-1254; and text with a few stray NUL bytes as text (TIKA-5052). * Charset arbitration no longer defers to a declared charset whose decode has more replacement characters than the best-scoring decode, such as a page declared iso-8859-3 but written in windows-1252 (TIKA-5027). * Charset detection keeps x-MacRoman instead of relabelling it windows-1252 when the text has MacRoman curly quotes (TIKA-5052). * A UTF-32 guess from the statistical model is dropped when the bytes are not valid UTF-32 code points: binary with a few NULs in its header (a shader file of ASCII 0/1 after an 80 37 00 00 header) was reported as UTF-32BE (TIKA-5052). * Charset detection no longer reads ASCII text with a few control characters (logs with escape or form-feed bytes, IRC colour codes, record separators, banners) as BOM-less UTF-16: the model was retrained with such text, and when it still returns UTF-16 or UTF-32 as its only candidate, the junk filter now compares that decode against windows-1252 and keeps whichever reads as text (TIKA-5052). * The junk model that arbitrates between charset candidates was retrained with UTF-16 misreads of every script (text read as UTF-16, and UTF-16 text read as a single-byte charset) and with fully vocalized Arabic, so a BOM-less UTF-16 decode of vocalized Arabic is no longer scored below its windows-1252 misread (TIKA-5027). * XHTML output no longer contains empty or whitespace-only b/strong/i/em/sup/sub elements, and whitespace at their edges is written outside them (<b>Note: </b> becomes <b>Note:</b> ); u and s are unchanged. The Markdown writer does the same for **, * and ~~, which it wrote as literal asterisks for <b>Note: </b> (TIKA-5018). * The junk detector, which arbitrates between candidate charsets, decodes numeric character references in HTML as browsers do: €-Ÿ are the windows-1252 characters (– is an en dash, not a C1 control), and �, surrogates and values past U+10FFFF are U+FFFD. One pass, so &#x41; stays A (TIKA-5044). * Charset arbitration uses a new junk model: hashed codepoint n-grams trained on pairs of a correct and a wrong decode of the same bytes, including the candidates the detector chain really produces. The CJK family gate and the Latin letter gate are gone; when the model's margin is thin, the declared or structural charset wins. tika-eval's languageness comes from the same model and gains tika-eval:languagenessMin (the worst 200-character window, which finds a damaged region in a clean document) and tika-eval:languagenessCoverage. Languageness is -99 (unknown) for text with no letters or with under 90% of its letters in scripts the model was trained on (TIKA-5027). * Big5 text decodes as browsers do: Big5-HKSCS with the 144 byte pairs where the WHATWG Encoding Standard differs patched to the WHATWG value. A3E1 is the euro sign instead of U+FFFD; A145, A1E3 and A1FE are the CP950 forms U+2027, U+FF5E and U+FF0F; six pairs in C6CF-C6DF are radicals and ditto marks, not kana. Detected-charset metadata is unchanged; tk:decoded-charset is x-Big5-HKSCS-WHATWG, which Charset.forName does not resolve (TIKA-5052). * EUC-JP text decodes as browsers do: x-eucJP-Open with nine pairs patched to the WHATWG value, the Microsoft forms windows-31j already gives for Shift_JIS (A1C1 wave dash is U+FF5E, A1DD minus U+FF0D, A1F1/A1F2/A2CC cent, pound and not signs U+FFE0-FFE2, A1BD U+2015, A1C2 U+2225, FCFB/FCFC U+FFE2/U+FFE4). tk:decoded-charset is x-eucJP-Open-WHATWG (TIKA-5052). * Charset detection finds non-ASCII text past the first 16 KB, as in an email with a long ASCII header block, a log or a CSV: those were reported as windows-1252. When the leading sample is not conclusive, detection reads on (up to 16 MB of a file or byte array, 1 MB of a stream) and adds the bytes around each non-ASCII byte and each ISO-2022, HZ or UTF-7 sequence to the sample, stopping at 50 non-ASCII bytes or 16 UTF-8 characters. Fewer than 8 scattered non-ASCII bytes leave the sample as it was. The junk filter scores the same sample. EncodingProbeCache keys on a probe kind (TIKA-5046). OTHER CHANGES * The file-to-markdown-docker agent skill turns OCR off with an empty text-recognizers list and a server block (its tesseract-ocr-parser config failed to load since 4.2.0), and checks tk:parsed-by-full-set, not pdf:ocr-page-count, to confirm OCR ran. A test loads every config in the user skills in tika-app and tika-server. * A runtime fetcher or emitter save or delete reaches running pipes workers at their next fetch, through a change token on file and ignite stores (ConfigStore.changeToken); before, a worker kept the instance it first built until it restarted (TIKA-5001). * PEM-armored CMS/PKCS7 (-----BEGIN PKCS7----- or -----BEGIN CMS-----) is parsed like DER: Pkcs7Parser and the opt-in pkcs-7-detector report the smime-type and extract signed content; -----BEGIN CMS----- is now detected (TIKA-5002). * Markdown output writes a line break inside a table cell as <br>, so the row no longer splits, and no longer prefixes the text after a line break or at the start of a paragraph with   (TIKA-5012). * Markdown output writes a table with merged cells (colspan/rowspan) as an HTML table instead of a pipe table, which dropped the spans. A nested table is still flattened into its cell, now with <br> between its rows and a space between its cells; its text was fused with the cell's before (TIKA-5015). * A PDF with pages that pages.ocr.maxPages kept from the OCR engine records skipped:max-pages in tk:ocr-warnings; before, the cap left no trace and pdf:ocr-page-count still counted those pages (TIKA-5013). * tika-eval Compare reports text that moved between the two extracts (a reordered slide, a title written at the end of a page instead of the start): order_* columns in content_comparisons and the moved_text and moved_text_by_mime reports. The maxTokens and maxContentLength settings in a tika-eval config are now applied; they were ignored, and the maxContentLength default is now the 10,000,000 that was in effect (TIKA-5022). Release 4.2.0 - 10/25/2026 BREAKING CHANGES AND DEPRECATIONS * Unpack output is a Frictionless Data Package by default (tika-server /unpack, tika-app -z/-Z, pipes UNPACK); unpack-config.outputFormat=REGULAR (--unpack-format=REGULAR) restores the old layout (TIKA-4681). A document without attachments is still a package, so /unpack returns 200, not 204; unpack-config.emptyPackage=SKIP restores the 204 (TIKA-4971). * The package's metadata.json is now rmeta.json and gets the metadata filters; a package sent to the container's emitter replaces its <emitKey>.json. REGULAR .metadata.json sidecars are the file's row from the metadata list. FrictionlessResource.name() is the resource name (the filename moved to resourceName()); FrictionlessResource.create and DataPackage.addResource are removed (TIKA-4971). * Config is untrusted unless the operator says so. @OperatorOnly properties (paths, executables, class names, URLs, credentials, operator-sized limits) are refused wherever a request builds a component, and an @OperatorOnly class can't be built from a request at all. Java code setting one through a JsonConfig wraps it in JsonConfig.trusted(json); JsonConfig constructors now need tika-serialization. Newly locked: pdf-parser imageGraphicsEngineFactoryClass and maxMainMemoryBytes, raw-tiff maxTotalPreviewBytes, VLM completionsPath. The RuntimeConfig subclasses are removed (TIKA-4965, TIKA-4974). * Per-request limits and timeouts may tighten the operator's, never loosen them. pipes.trustedRequests=true marks requests as the operator's own (no clamp, may set @OperatorOnly properties); PipesForkParser sets it, and tika-server and tika-grpc refuse to start with it (TIKA-4978, TIKA-4985). * A duplicate key in configuration JSON is an error, not last-wins. A request's http-fetcher config may set only httpRequestHeaders; a file-system emitter's runtime config naming basePath fails as an unknown key. forbidden-apis bans JsonConfig.json() outside ConfigDeserializer and PluginJson, also in projects inheriting tika-parent (point json.forbiddenapis.signaturesFile at an empty file to opt out). ExtensionConfig no longer implements JsonConfig (TIKA-4975). * Dates: Metadata.getDate() reads zone-less values as UTC, not the JVM's zone. Archive-entry and mail-attachment file times move from dcterms:* to fs:created/fs:modified. DateNormalizingMetadataFilter honors offsets, normalizes every value and completes partial dates (2019 -> 2019-01-01T12:00:00Z). MailDateParser is replaced by TikaDates; MailUtil moved to tika-parser-mail-module, leaving tika-parser-mail-commons a deprecated shim, to be removed in 4.3.0 (TIKA-4917). * OCR engines (tesseract-ocr-parser, tess4j-parser) under "parsers", deprecated in 4.1.0, now fail config load: configure them under "engines" and name them in "text-recognizers". A VLM parser may stay under "parsers" as a document parser (ContentEnricher.parsesDocuments()). openai-embedding-filter, jina-embedding-filter and openai-image-embedding-parser, deprecated in 4.1.0, are removed; use an engine and an inference binding (TIKA-4985). * text-recognizers: an inline entry must have exactly one key, setting both _min-width and min-width is an error, and gated entries load as GatedEnricher, not SizeGatedEnricher (TIKA-4972). * tika-server transfer limits: maxRequestReadMillis (408) and maxResponseWriteMillis, both 5 min; idleTimeoutMillis 120s (was CXF's fixed 200s); maxInFlightRequestBytes (429). Raise the deadlines for very large or slow transfers; cut-offs are logged at INFO by the TransferLimitLog logger. Cleartext HTTP/2 (h2c), on by default since 4.0.0, now needs allowHttp2 (TIKA-4991). * tika-server TLS: a tlsConfig block turns TLS on; "active" is deprecated (true ignored with a warning, false refused, removed in 4.3.0), and TikaServerConfig.getTlsConfig() is null without a block. Protocol and cipher suite policy is the JVM's (jdk.tls.server.protocols, jdk.tls.server.cipherSuites, jdk.tls.disabledAlgorithms): includedProtocols, excludedProtocols, includedCipherSuites and excludedCipherSuites, none of which worked as documented, are refused at startup. clientAuthenticationWanted is removed (true refused, false ignored with a warning), as tika-server never reads client certificates (TIKA-4994). * embedded-limits maxDepth defaults to 20 (was unlimited) and replaces output-limits maxPackageEntryDepth, which is to be removed in 4.3.0 with its accessors on OutputLimits and SecureContentHandler (#3319). * Pipes plugins load only from the zips in plugin-roots; a plugin on the classpath needs -Dtika.plugins.classpath=true, which PipesForkParser sets when it finds no plugins directory holding tika-pipes-file-system (TIKA-4918, TIKA-4985). A plugin-roots naming a directory without the plugin zips, which the classpath used to mask, now fails with "Unknown type: ... Available: []"; tika-app and tika-server treat the docs' PLUGINS_PATHS placeholder as unset and use their bundled plugins directory (TIKA-4984). * image/vnd.microsoft.icon moves from ImageParser to the new ICOParser, which also parses cursors (TIKA-4937); animated cursors (RIFF ACON) are application/x-navi-animation, even when named *.cur (TIKA-4985). * ISArchiveParser(String location) is removed; pass a file-backed TikaInputStream (TikaInputStream.get(Path)) (TIKA-4986). * tika-bundle-standard no longer embeds dependencies that are OSGi bundles themselves (commons-*, pdfbox, fontbox, bouncycastle, jsoup, asm, xz, xmpcore, dd-plist); deploy them alongside it (TIKA-4934). Its imports are now mandatory, it registers its encoding detector, language detector and metadata filter providers, and it requires Java 17 (TIKA-4955). SECURITY * The default zip-bomb ratio (output-limits.zipBombRatio) is 1000, up from 100. It is measured across the whole embedded tree against the container's bytes, so nested compression is still caught; at 100, ordinary compressed logs and text tripped it. Set zipBombRatio to 100 to restore the old limit (TIKA-4985). * The Gemini VLM parser sends its API key in x-goog-api-key, not in the URL that error messages and logs quote (TIKA-4985). * XML parsers are configured through Apache Commons Secure XML (TIKA-4935); Tika's own entity-expansion limit is retired in favor of the JDK's (TIKA-4940); and forbidden-apis rejects building XML parsers outside XMLReaderUtils (TIKA-4939). New tk:xml-external-reference and -count list the external DTDs and entities a document referenced, which Tika never resolves (TIKA-4941). XFA is read with SAX; XMLReaderUtils.getXMLInputFactory() is deprecated (TIKA-4938). * The tika-app GUI's Formatted Text view no longer lets a document make Swing construct classes or fetch URLs: only plain elements and attributes reach it, and remote images are not loaded (TIKA-4992). * tika-server TLS: a keystore configured without "active": true no longer serves plain HTTP. 2-way TLS accepts client certificates issued by a CA in the truststore, which it had rejected since 2.4.0; their revocation is checked through the certificate's OCSP responder or CRL distribution point and fails closed (tlsConfig checkRevocation=false turns it off). Rejected client certificates are logged at INFO with the reason (TIKA-4994). SERVER, PIPES AND OPERATIONS * The file-system emitter can gzip its output ("compression": "GZIP"); tika-eval reads .json.gz extracts and measures them uncompressed (TIKA-4989). * tika-server activates catalog presets with --preset <name> (repeatable) or TIKA_PRESETS (comma-separated), overriding the config file's entry (TIKA-4988). * PipesParser.start() and PipesForkParser.start() bring the forks up before the first parse (TIKA-4953), and tika-server starts its forks before opening its port, so a fork that can't start fails startup, not the first request (TIKA-4983). * PipesForkParser: a ParseMode, ContentHandlerFactory or EmbeddedLimits in the per-call ParseContext overrides PipesForkParserConfig, and the caller's context is no longer modified (TIKA-4981). * Forked pipes servers get their config and auth token over stdin, never through the temp dir; server-manager and PipesServer signatures change (TIKA-4952). * maxFilesProcessedPerProcess defaults to 100,000, up from 10,000 (TIKA-4950). * Pipes forks inherit the parent's default locale unless forkedJvmArgs set user.language (TIKA-4920). * Pipes UNPACK deletes its temp dir when the fetch or parse fails (TIKA-4985). * Parser loading and fork startup are about 1.3s faster: parsers no longer build a default EncodingDetector the loader then replaces (TIKA-4954). * Quieter pipes logging: per-parse timing lines move to TRACE, lifecycle lines to DEBUG (TIKA-4949). * OSGi: tika-serialization is a bundle, so JsonConfig constructors work (TIKA-4982); tika-core installs without a Service Loader Mediator (TIKA-4945); the DefaultParser and DefaultDetector services no longer recurse into a StackOverflowError (TIKA-4942); OOXML, HTTP and GeoGebra parsing and charset detection work in tika-bundle-standard again (TIKA-4955). EXTRACTION AND FORMATS * docx: OMML equations are wrapped in <span class="omml"> (TIKA-4968); REF, PAGEREF, NOTEREF, HYPERLINK \l and simple fields link to their bookmarks (TIKA-4967); bold and italics from character styles are applied, with opt-in includeCharacterStyleClasses (TIKA-4966). * .doc: stored line and paragraph counts are extracted (TIKA-4694). * ExecutableParser emits a PE file's icon (its first icon group) as an embedded THUMBNAIL .ico; extractAllIcons=true emits every group, extractIcons=false none (TIKA-4936). * BigTIFF is read through metadata-extractor 2.22.0: EXIF and DNG tags from BigTIFF DNGs, plain BigTIFF no longer fails, and little-endian BigTIFF is detected by content (TIKA-4987). * Previews from Olympus ORF, Panasonic RW2, Epson ERF, Kodak KDC and Leaf MOS; Epson ERF is detected by content. A metadata-extractor tag descriptor that throws skips the tag instead of failing the parse (TIKA-4980). * OneNote: table and list structure in FSSHTTPB files (TIKA-4943); section and page GUID metadata (TIKA-4944). * OneNote FSSHTTPB parsing is ~6% faster with ~20% fewer GCs: binary items are read in place instead of copied, bit reads assemble whole bytes, and GUIDs are cached. Compat: BinaryItem.content (a List<Byte>) is replaced by getContent()/setContent() on byte[]; a binary item whose length decodes as 2^63 or more now fails the FSSHTTPB parse (TIKA-5055). * Detection: *.rs is text/x-rust (TIKA-4977); a MIME email nesting multipart/related is message/rfc822, not MHTML (TIKA-4973); XML with an element like <htmlPath> is no longer HTML (TIKA-4962); XUL is detected by content and parsed by the HTML parser, as XMLParser fails on its DTD entities (TIKA-4985); OS/2 bitmap array and TGA detection is tighter (TIKA-4937). * Image checks (byte-size, min-image-size, blank-image-check; new tika-image-processing module) keep blank and tiny images from text recognizers; SizeGatedEnricher is deprecated (TIKA-4972). * VLM parsers: output gets tk:ocr-warnings (an empty Claude response is a warning, not an exception), vlm:skipped-reason and vlm:image-pixels; they take temperature and retry dropped HTTP connections (TIKA-4972). The OpenAI-compatible parser has opt-in useMaxCompletionTokens for models that reject max_tokens (#3350). * The embed task writes tk:chunks once per binding, not once per image or page (TIKA-4970). * Opt-in "metadata-list": {"typedValues": true} writes numbers, booleans and tk:chunks as JSON values rather than strings; new Property.ValueType.JSON (TIKA-4969). * Parsers no longer carry one document's state into the next, or share it between concurrent parses: IDML page counts, an ENVI header's multi-line field (#3406), an IPTC/ANPA wire's agency format and publisher (TIKA-4995), and ISArchiveParser's ISA-Tab directory and study file name (TIKA-4986). OTHER CHANGES * tika-app -J writes the metadata list when the container throws, with the exception in tk:exception:container-exception on the first record, as /rmeta does; it used to print nothing. The exit status still reports the failure (TIKA-4985). * A RAR entry junrar fails to extract is recorded as tk:exception:embedded-stream-exception on the container; what was extracted before the failure is kept and the rest of the archive is parsed (junrar 8.1.2, TIKA-4985). * JSoupParser emits CDATA text again (TIKA-4963). * OutlookExtractor falls back to the Date: header when a .msg has no MAPI date (TIKA-4959). * The MP4 parser no longer warns of an EOFException on every file (TIKA-4957). * GeoGebraParser no longer needs jackson-databind (TIKA-4956). * tika-server's welcome page lists endpoints inherited from superclasses (XMP on /meta) under their real paths (TIKA-4991). Release 4.1.0 - 9/26/2026 HIGHLIGHTS * OCR and enrichment engines are selected by name in a new "text-recognizers" list ("[]" turns enrichment off; no list resolves one engine per media type at startup); the image and PDF parsers invoke them rather than the composite dispatching to them. The image/ocr-* pseudo-types are retired; a third-party engine still advertising them is a legacy text recognizer with a WARN. VLM parsers gain "textRecognizer" (TIKA-4872, TIKA-4884). * New "exception-reporting" parse-context config redacts and bounds exception text in metadata, tika-server error bodies and pipes/grpc messages; FileSystemEmitter writes atomically. Compat: tk:exception:* values may now begin with the TikaException wrapper line (TIKA-4848). PERFORMANCE * Detection (magic ~35% faster on unmatched input, override keys honored before magic, cached type->parser map), markdown output ~30x faster, .doc cleanup, CSV sniffing, zip legacy-method rewinds, pipes ACK overlap, raw UTF-8 content passback for tika-server (content-bytes-config). Compat: with a Content-Type override set, DefaultDetector no longer lets a more specific magic result overrule it (TIKA-4868). * PDF incremental-update scanning reads in blocks; ~4x less CPU (TIKA-4898). * Embedded documents in Office files, PDFs, PST and the zip-family containers are re-opened from their container on rewind instead of cached (TIKA-4878). * Improve spooling/decrease number of spills to disk. The pipes cache memory budget defaults to a quarter of the fork heap (-Dtika.pipes.cacheMemoryBudgetBytes overrides) (TIKA-4835). * Digesting embedded documents no longer spools each to a temp file; a process-wide CacheMemoryBudget keeps them in memory. Zip-family parsing uses seekable channels, so hasFile() may be false afterward (TIKA-4828). BREAKING CHANGES AND DEPRECATIONS * Pipes IPC carries inline bytes as a raw binary field, not in the tuple; 4.0.0 tuples with an "inline-bytes" parse-context entry are rejected (TIKA-4829). * Pipes plugins no longer bundle Jackson; plugin config is parsed by a shared strict mapper that rejects unknown and duplicate keys (TIKA-4840). * OpenAIVLMParser no longer auto-registers via SPI; per-request config for the embedding filters works and locks baseUrl/apiKey/model; inline PDF page OCR accumulates tk:chunks from every page (TIKA-4871). * Temp files follow -Djava.io.tmpdir on the parent JVM (Tika, its libraries and forks); pipes.tempDirectory is deprecated. A fork whose parent dies deletes its own temp dir; failure-path temp leaks fixed (TIKA-4877). * Kafka pipes iterator no longer stops on the first empty poll (assignmentTimeoutMs, drainIdleMs); groupInitialRebalanceDelayMs is deprecated (TIKA-4833). INFERENCE (EXPERIMENTAL) * tika-inference and tika-vlm are still experimental: classes, config keys and output may change in minor releases. Stable: the "engines" map, the "text-recognizers" list and pdf-parser "text" (TIKA-4884, TIKA-4895). * Refactor OCR and inference to use engines for inference and page rendering (TIKA-4889). * Enable audio/video chunking with ffmpeg and inference; the default segment grid is 25 s windows with 5 s overlap (TIKA-4900). SERVER, PIPES AND OPERATIONS * tika-server: named configuration presets, and catalog presets that are inert until the config names them (TIKA-4856). * Add Micrometer reporting and opt-in endpoint for tika-server (TIKA-4839). * Enable environment variable interpolation in tika-config.json (TIKA-4909). * tika-server and tika-async-cli accept // and /* */ comments in config during override merging (TIKA-4834). * New file-system-jsonl-reporter pipes reporter records a batch run's crashes; tika-eval Profile/Compare read that ledger and the run-info json to classify NO_EXTRACT_FILE by cause (TIKA-4846, TIKA-4847). * PipesForkParser no longer drops javaPath and socketTimeoutMillis set in code; the fork ran java from the PATH with a 60s socket timeout regardless (TIKA-4931). * Pipes no longer copies the caller's Content-Type hint back over the detected type on output (TIKA-4932). EXTRACTION AND FORMATS * Improve extraction of tagged PDFs. New tika-eval-structure tool compares two sets of XHTML extracts block by block (TIKA-4891). * OneNote: document-order extraction, superseded revisions omitted, embedded BLOBs extracted, bounded recursion; malformed files fall back to the legacy string dump via Henry Lindeman (TIKA-4814). * Raw camera formats (NEF/NRW, PEF/PTX, ARW/SRF/SR2, SRW, DNG, RAF, RW2, MRW, ORF) are detected by content instead of as image/tiff via Dominik Schmidt (TIKA-4861). * AVIF images are parsed by HeifParser (dimensions, EXIF, XMP) via Dominik Schmidt (TIKA-4870). * New GeoGebraParser for *.ggb/*.ggs/*.ggt with content-based detection and THUMBNAIL embedded documents via Dominik Schmidt (TIKA-4831). * The video of a Google/Android motion photo is emitted as an ATTACHMENT embedded document via Dominik Schmidt (TIKA-4869). * RawTiffParser extracts embedded JPEG previews as THUMBNAIL embedded documents; image/x-raw-* are now subtypes of image/tiff ("extractPreviews": false disables) via Dominik Schmidt (TIKA-4824). * Apple Mail emlx files are detected as message/x-emlx and parsed by RFC822Parser; a file name no longer turns plain text into a message type once the type's magic has rejected the bytes (TIKA-4890). * Audio cover art (ID3/FLAC/Vorbis front cover, MP4 covr) is emitted as a THUMBNAIL embedded document rather than INLINE via Dominik Schmidt (TIKA-4850). * EpubParser emits the OPF cover image as a THUMBNAIL embedded document via Dominik Schmidt (TIKA-4852). * DWGReadParser emits THUMBNAILIMAGE as THUMBNAIL instead of INLINE via Dominik Schmidt (TIKA-4853). * iWork '09 and '18 preview images are emitted as THUMBNAIL embedded documents via Dominik Schmidt (TIKA-4854). * New poi-metafile-renderer rasterizes EMF/WMF (opt-in "renderImage"); OfficeParser emits the OLE2 SummaryInformation thumbnail as a THUMBNAIL embedded document ("extractThumbnail": false disables) via Dominik Schmidt (TIKA-4855). OTHER CHANGES * Ogg, Vorbis, Opus and FLAC comment fields are read independently of the JVM's default locale: on a Turkish JVM TITLE and ARTIST were silently lost. The OCR image-rotation value is formatted the same way (TIKA-4921). * The Ignite config store quotes its table name, so lookups work under any |
| You are visitor 01402520 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |