History log of /plugin/totext/Extractor/ (Results 1 – 10 of 10)
Revision Date Author Comments
(<<< Hide modified files)
(Show modified files >>>)
fd4f7c4706-Jul-2026 Andreas Gohr <gohr@cosmocode.de>

Track the cosmocode prinsfrank/pdfparser dev fork

The dev fork adds native UTF-16BE Info-string decoding and Form-XObject
text extraction. Point composer at the fork's VCS repo, pin dev-dev, and
dro

Track the cosmocode prinsfrank/pdfparser dev fork

The dev fork adds native UTF-16BE Info-string decoding and Form-XObject
text extraction. Point composer at the fork's VCS repo, pin dev-dev, and
drop the now-redundant normalizePdfString() UTF-16BE shim (metadata values
just get trimmed). Refresh AGENTS.md accordingly.

show more ...


/plugin/totext/AGENTS.md
PdfExtractor.php
/plugin/totext/composer.json
/plugin/totext/composer.lock
/plugin/totext/vendor/composer/installed.json
/plugin/totext/vendor/composer/installed.php
/plugin/totext/vendor/prinsfrank/pdfparser/composer.json
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/State/TextShowingOperator.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/ContentStream.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/ContentStreamScope.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/GraphicsState.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/LineGroupingStrategy/BaselineClusterStrategy.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/LineGroupingStrategy/Block.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/LineGroupingStrategy/Line.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/LineGroupingStrategy/LineGroupingStrategy.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/LineGroupingStrategy/MatrixOffsetSpacing.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/LineGroupingStrategy/StrictLineGrouping.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/LineGroupingStrategy/TextOverlapStrategy.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/PositionedTextElement.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/TextSegment/TextSegment.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/TextState.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/TransformationMatrix.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/Vector.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/CrossReferenceSourceParser.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/RawStream/ObjectPositionsFromRawStreamParser.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/Source/CrossReferenceSource.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/Source/RecoveredCrossReferenceSource.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/Source/Section/CrossReferenceSection.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/Source/Section/SubSection/CrossReferenceSubSection.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Array/CIDFontWidths.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Date/DateValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/TextString/TextStringValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/ResourceDictionaryChain.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Document.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Encoding/PDFDocEncoding.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Font/FontWidths.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Generic/Character/LiteralStringEscapeCharacter.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Decorator/Font.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Decorator/Page.php
0fbee18922-Jun-2026 Andreas Gohr <gohr@cosmocode.de>

Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text s

Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

show more ...

b4ecfc8222-Jun-2026 Andreas Gohr <gohr@cosmocode.de>

Replace smalot/pdfparser with prinsfrank/pdfparser

Switch the PDF extractor from the cosmocode/pdfparser memory fork
(an LGPL smalot/pdfparser fork) to prinsfrank/pdfparser (MIT, built
from scratch,

Replace smalot/pdfparser with prinsfrank/pdfparser

Switch the PDF extractor from the cosmocode/pdfparser memory fork
(an LGPL smalot/pdfparser fork) to prinsfrank/pdfparser (MIT, built
from scratch, zero PHP dependencies beyond prinsfrank/glyph-lists).

PdfExtractor now calls parseFile($path)->getText() in the default
in-memory mode, which benchmarked both faster and far lighter than the
old fork (on a 12 MB/92-page file: 63s/49.5MB vs 68s/100MB), so the
previous setRetainImageContent() tuning is no longer needed.

Known limitation: prinsfrank/pdfparser <= v3.1.0 does not extract text
inside Form XObjects (page content painted with the Do operator, common
in Quartz/Firefox/Chrome PDFs such as the Tika sample), so
PdfExtractorTest::testExtractsText fails against stock v3.1.0.

show more ...


/plugin/totext/AGENTS.md
PdfExtractor.php
/plugin/totext/composer.json
/plugin/totext/composer.lock
/plugin/totext/vendor/composer/autoload_namespaces.php
/plugin/totext/vendor/composer/autoload_psr4.php
/plugin/totext/vendor/composer/autoload_real.php
/plugin/totext/vendor/composer/autoload_static.php
/plugin/totext/vendor/composer/installed.json
/plugin/totext/vendor/composer/installed.php
/plugin/totext/vendor/prinsfrank/glyph-lists/LICENSE
/plugin/totext/vendor/prinsfrank/glyph-lists/LICENSE-BSD-3-CLAUSE
/plugin/totext/vendor/prinsfrank/glyph-lists/README.md
/plugin/totext/vendor/prinsfrank/glyph-lists/composer.json
/plugin/totext/vendor/prinsfrank/glyph-lists/src/AGlyphList.php
/plugin/totext/vendor/prinsfrank/pdfparser/.al-custom.php
/plugin/totext/vendor/prinsfrank/pdfparser/LICENSE
/plugin/totext/vendor/prinsfrank/pdfparser/README.md
/plugin/totext/vendor/prinsfrank/pdfparser/SECURITY.md
/plugin/totext/vendor/prinsfrank/pdfparser/UPGRADING.md
/plugin/totext/vendor/prinsfrank/pdfparser/composer.json
/plugin/totext/vendor/prinsfrank/pdfparser/docs/14.3-associated-files.md
/plugin/totext/vendor/prinsfrank/pdfparser/docs/7.11-file-specifications.md
/plugin/totext/vendor/prinsfrank/pdfparser/docs/images/banner_dark.png
/plugin/totext/vendor/prinsfrank/pdfparser/docs/images/banner_light.png
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CMap/Registry/Adobe/Identity0.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CMap/Registry/CMapResource.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CMap/Registry/RegistryOrchestrator.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CMap/ToUnicode/BFChar.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CMap/ToUnicode/BFRange.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CMap/ToUnicode/CodePoint.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CMap/ToUnicode/CodeSpaceRange.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CMap/ToUnicode/ToUnicodeCMap.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CMap/ToUnicode/ToUnicodeCMapOperator.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CMap/ToUnicode/ToUnicodeCMapParser.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/ContentStreamCommand.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/Object/CompatibilityOperator.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/Object/InlineImageOperator.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/Object/MarkedContentOperator.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/Object/TextObjectOperator.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/State/ClippingPathOperator.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/State/ColorOperator.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/State/GraphicsStateOperator.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/State/Interaction/InteractsWithTextState.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/State/Interaction/InteractsWithTransformationMatrix.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/State/Interaction/ProducesPositionedTextElements.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/State/PathConstructionOperator.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/State/PathPaintingOperator.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/State/TextPositioningOperator.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/State/TextShowingOperator.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/State/TextStateOperator.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/State/Type3FontOperator.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Command/Operator/State/XObjectOperator.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/ContentStream.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/ContentStreamParser.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/Object/TextObject.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/LineGroupingStrategy/LineGroupingStrategy.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/LineGroupingStrategy/StrictLineGrouping.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/LineGroupingStrategy/TextOverlapStrategy.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/PositionedTextElement.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/TextState.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/ContentStream/PositionedText/TransformationMatrix.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/CrossReferenceSourceParser.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/CrossReferenceType.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/Source/CrossReferenceSource.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/Source/Section/CrossReferenceSection.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/Source/Section/SubSection/CrossReferenceSubSection.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/Source/Section/SubSection/Entry/CrossReferenceEntryCompressed.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/Source/Section/SubSection/Entry/CrossReferenceEntryFreeObject.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/Source/Section/SubSection/Entry/CrossReferenceEntryInUseObject.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/Stream/CrossReferenceStreamParser.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/Stream/CrossReferenceStreamType.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/Table/CrossReferenceTableInUseOrFree.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/CrossReference/Table/CrossReferenceTableParser.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/Dictionary.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryEntry/DictionaryEntry.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryEntry/DictionaryEntryFactory.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryFactory.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryKey/DictionaryKey.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryKey/DictionaryKeyInterface.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryKey/ExtendedDictionaryKey.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryParseContext/DictionaryParseContext.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryParseContext/NestingContext.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryParser.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Array/ArrayValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Array/CIDFontWidths.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Array/CrossReferenceStreamByteSizes.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Array/DictionaryArrayValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Array/DifferencesArrayValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Array/Item/ConsecutiveCIDWidth.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Array/Item/DifferenceRange.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Array/Item/RangeCIDWidth.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Boolean/BooleanValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Date/DateValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/DictionaryValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Float/FloatValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Integer/IntegerValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/AuthEventNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/BlendModeNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/BorderStyleNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/CFMNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/CIEColorSpaceNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/DeviceColorSpaceNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/DirectionNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/EncodingNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/EventNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/FilterNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/IntentNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/ListModeNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/NameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/NonFullScreenPageModeNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/NumberingStyleNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/PageLayoutNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/PageModeNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/PaperHandlingNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/RenderingIntentNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/SecurityHandlerNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/SpecialColorSpaceNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/SubtypeNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/TabsNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/ToUnicodeCMapNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/TransitionStyleNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/TrappedNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/TypeNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/ViewNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Name/VisibilityPolicyNameValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Rectangle/Rectangle.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Reference/ReferenceValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/Reference/ReferenceValueArray.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/DictionaryValue/TextString/TextStringValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Dictionary/Normalization/NameValueNormalizer.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Document.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Encoding/Encoding.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Encoding/MacRoman.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Encoding/WinAnsi.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Encryption/RC4.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Filter/Decode/ASCII85Decode.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Filter/Decode/ASCIIHexDecode.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Filter/Decode/CCITTFaxDecode.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Filter/Decode/FlateDecode.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Filter/Decode/LZWFlatePredictorValue.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Filter/Decode/PNGPredictorAlgorithm.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Filter/Decode/TiffTag.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Font/FontWidths.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Generic/Character/DelimiterCharacter.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Generic/Character/LiteralStringEscapeCharacter.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Generic/Character/WhitespaceCharacter.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Generic/Marker.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Generic/Parsing/InfiniteBuffer.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Generic/Parsing/RollingCharBuffer.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Image/ColorSpace/ColorSpace.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Image/ColorSpace/ColorSpaceFactory.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Image/ColorSpace/Components.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Image/ImageType.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Image/RasterizedImage.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Decorator/Catalog.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Decorator/DecoratedObject.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Decorator/DecoratedObjectFactory.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Decorator/EmbeddedFile.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Decorator/EncryptDictionary.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Decorator/FileSpecification.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Decorator/Font.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Decorator/GenericObject.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Decorator/InformationDictionary.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Decorator/Page.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Decorator/Pages.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Decorator/XObject.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Item/CompressedObject/CompressedObject.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Item/CompressedObject/CompressedObjectByteOffsetParser.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Item/CompressedObject/CompressedObjectByteOffsets.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Item/CompressedObject/CompressedObjectContent/CompressedObjectContentParser.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Item/ObjectItem.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Item/UncompressedObject/UncompressedObject.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Object/Item/UncompressedObject/UncompressedObjectParser.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Security/EncryptionContext.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Security/FileEncryptionKey.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Security/SecurityAlgorithm.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Security/StandardSecurity.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Security/StandardSecurityHandlerRevision.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Version/Version.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Document/Version/VersionParser.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Exception/AuthenticationFailedException.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Exception/InvalidArgumentException.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Exception/NotImplementedException.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Exception/ParseFailureException.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Exception/PdfParserException.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Exception/RuntimeException.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/PdfParser.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Stream/AbstractStream.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Stream/FileStream.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Stream/InMemoryStream.php
/plugin/totext/vendor/prinsfrank/pdfparser/src/Stream/Stream.php
74fe23a518-Jun-2026 Andreas Gohr <gohr@cosmocode.de>

Lower PDF parser peak memory by skipping image content

PDFs are parsed entirely into memory before any text is returned, so a
large file can exhaust the memory limit even when its text is tiny.
Sett

Lower PDF parser peak memory by skipping image content

PDFs are parsed entirely into memory before any text is returned, so a
large file can exhaust the memory limit even when its text is tiny.
Setting retainImageContent(false) makes smalot/pdfparser skip decoding
image streams - the largest streams in a typical PDF - which markedly
lowers peak memory without changing the extracted text.

show more ...

7ddd936f17-Jun-2026 Andreas Gohr <gohr@cosmocode.de>

Drop the PDF parser availability check

smalot/pdfparser is bundled in the committed vendor/ directory, so the parser
is always present. The class_exists() guard could never fire and its
"run compose

Drop the PDF parser availability check

smalot/pdfparser is bundled in the committed vendor/ directory, so the parser
is always present. The class_exists() guard could never fire and its
"run composer install" message was misleading for a bundled dependency.

show more ...

c590c20017-Jun-2026 Andreas Gohr <gohr@cosmocode.de>

Open extractors and factory for extension

Remove final from ExtractorFactory and the nine extractors, and widen every
private method, property and constant to protected, so the classes can be
subcla

Open extractors and factory for extension

Remove final from ExtractorFactory and the nine extractors, and widen every
private method, property and constant to protected, so the classes can be
subclassed and their helpers reused. The abstract base, the interface and the
exception hierarchy were already extensible and are unchanged.

show more ...

a67d015517-Jun-2026 Andreas Gohr <gohr@cosmocode.de>

Make ExtractorFactory the single source of supported extensions

The file extensions were duplicated across forFile(), supportedExtensions()
and every extractor's supports()/extension(). Collapse the

Make ExtractorFactory the single source of supported extensions

The file extensions were duplicated across forFile(), supportedExtensions()
and every extractor's supports()/extension(). Collapse them into one
private const map (extension => extractor class) in ExtractorFactory, which
is now the sole routing authority: forFile() looks the extension up and
supportedExtensions() returns its keys.

Extractors are now dumb workers implementing only extract(); the unused
supports()/extensions() methods are dropped from ExtractorInterface and all
extractors. Per-extractor supports() tests are removed (routing is covered
by the factory tests).

show more ...

37c5feaa17-Jun-2026 Andreas Gohr <gohr@cosmocode.de>

Use DokuWiki's temp dir and clean up in destructor

Allocate the archive-unpack temp dir in DokuWiki's own temp dir
($conf['tmpdir']) via core's io_mktmpdir(), and remove it with
io_rmdir(), instead

Use DokuWiki's temp dir and clean up in destructor

Allocate the archive-unpack temp dir in DokuWiki's own temp dir
($conf['tmpdir']) via core's io_mktmpdir(), and remove it with
io_rmdir(), instead of the system temp dir. Add a destructor that
repeats the cleanup as a safety net so the dir is removed even if the
process dies before extract()'s finally block runs. Align the test
FixtureBuilder on the same core helpers.

show more ...

e3bf24fb17-Jun-2026 Andreas Gohr <gohr@cosmocode.de>

Expand test coverage and fix two extractor bugs

Broaden the test suite from happy-path fixtures to the branching logic that
was previously unexercised, and fix two real bugs the new coverage exposed

Expand test coverage and fix two extractor bugs

Broaden the test suite from happy-path fixtures to the branching logic that
was previously unexercised, and fix two real bugs the new coverage exposed:

- XlsxExtractor: resolve sheet name->file mapping and tab order through
xl/workbook.xml + xl/_rels/workbook.xml.rels instead of pairing sorted
worksheet filenames with names positionally, which mismatched them whenever
tab order differed from file numbering. Falls back to positional/SheetN
naming when the workbook or its rels are absent.
- ImageExtractor: PHP's exif reader decodes Windows XP tags into a WINXP
section under short names (Title/Comment/Author/Keywords/Subject), not as
XPTitle etc., so those fields were silently dropped. List the short names
first, keep the XP* raw names as a cross-version fallback.

Tests:
- FixtureBuilder gains DOCX header/footer, PPTX notes, multi-sheet XLSX (+
no-workbook/no-worksheet variants), rich ODS (repeated columns, covered
cells, multi-paragraph cells, MAX_REPEAT cap, unnamed-sheet fallback), a
hand-packed TIFF with EXIF incl. a UTF-16LE XPTitle, and a public zip()
helper for composing broken containers.
- New critical-path coverage: header/footer, speaker notes, ODS edge cases,
XLSX multi-sheet/fallback/no-worksheet guards, EXIF/TIFF incl. XP decode,
and per-format missing-part/missing-file error paths.
- Routing, reject and supports() tests converted to data providers, plus a
drift guard that routes every supportedExtensions() entry through forFile().
- Real-world LibreOffice samples under _test/data covered by SampleFilesTest.

47 -> 155 tests, 104 -> 231 assertions.

show more ...

ca76a2e617-Jun-2026 Andreas Gohr <gohr@cosmocode.de>

Initial implementation of the totext plugin

Extract plain text from various file formats using PHP only (no shell-outs,
no external binaries). Provides a CLI component (cli_plugin_totext) and a
help

Initial implementation of the totext plugin

Extract plain text from various file formats using PHP only (no shell-outs,
no external binaries). Provides a CLI component (cli_plugin_totext) and a
helper component (helper_plugin_totext).

Supported formats:
- OOXML: docx, xlsx, pptx
- OpenDocument: odt, ods, odp
- PDF (via bundled smalot/pdfparser)
- Plain-text family: txt, csv, md, markdown, log, text
- Image metadata (EXIF/IPTC): jpg, jpeg, tif, tiff

Includes a fixture-based test suite covering every extractor, the factory
routing, and the helper end to end.

show more ...


/plugin/totext/.gitattributes
/plugin/totext/AGENTS.md
/plugin/totext/Exception/ExtractionException.php
/plugin/totext/Exception/UnsupportedFormatException.php
AbstractZipXmlExtractor.php
DocxExtractor.php
ExtractorFactory.php
ExtractorInterface.php
ImageExtractor.php
OdpExtractor.php
OdsExtractor.php
OdtExtractor.php
PdfExtractor.php
PptxExtractor.php
TextExtractor.php
XlsxExtractor.php
/plugin/totext/LICENSE
/plugin/totext/README
/plugin/totext/_test/DocxExtractorTest.php
/plugin/totext/_test/ExtractorFactoryTest.php
/plugin/totext/_test/FixtureBuilder.php
/plugin/totext/_test/HelperTest.php
/plugin/totext/_test/ImageExtractorTest.php
/plugin/totext/_test/OdpExtractorTest.php
/plugin/totext/_test/OdsExtractorTest.php
/plugin/totext/_test/OdtExtractorTest.php
/plugin/totext/_test/PdfExtractorTest.php
/plugin/totext/_test/PptxExtractorTest.php
/plugin/totext/_test/TextExtractorTest.php
/plugin/totext/_test/XlsxExtractorTest.php
/plugin/totext/cli.php
/plugin/totext/composer.json
/plugin/totext/composer.lock
/plugin/totext/helper.php
/plugin/totext/plugin.info.txt
/plugin/totext/vendor/autoload.php
/plugin/totext/vendor/composer/ClassLoader.php
/plugin/totext/vendor/composer/InstalledVersions.php
/plugin/totext/vendor/composer/LICENSE
/plugin/totext/vendor/composer/autoload_classmap.php
/plugin/totext/vendor/composer/autoload_files.php
/plugin/totext/vendor/composer/autoload_namespaces.php
/plugin/totext/vendor/composer/autoload_psr4.php
/plugin/totext/vendor/composer/autoload_real.php
/plugin/totext/vendor/composer/autoload_static.php
/plugin/totext/vendor/composer/installed.json
/plugin/totext/vendor/composer/installed.php
/plugin/totext/vendor/composer/platform_check.php
/plugin/totext/vendor/smalot/pdfparser/LICENSE.txt
/plugin/totext/vendor/smalot/pdfparser/README.md
/plugin/totext/vendor/smalot/pdfparser/composer.json
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Config.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Document.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Element.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementArray.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementBoolean.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementDate.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementHexa.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementMissing.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementName.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementNull.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementNumeric.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementString.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementStruct.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementXRef.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Encoding.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Encoding/AbstractEncoding.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Encoding/EncodingLocator.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Encoding/ISOLatin1Encoding.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Encoding/ISOLatin9Encoding.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Encoding/MacRomanEncoding.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Encoding/PDFDocEncoding.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Encoding/StandardEncoding.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Encoding/WinAnsiEncoding.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Exception/EmptyPdfException.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Exception/EncodingNotFoundException.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Exception/InvalidDictionaryObjectException.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Exception/MissingCatalogException.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Exception/MissingPdfHeaderException.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Exception/NotImplementedException.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Font.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Font/FontCIDFontType0.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Font/FontCIDFontType2.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Font/FontTrueType.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Font/FontType0.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Font/FontType1.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Font/FontType3.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Header.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/PDFObject.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Page.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Pages.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/Parser.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/RawData/FilterHelper.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/RawData/RawDataParser.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/XObject/Form.php
/plugin/totext/vendor/smalot/pdfparser/src/Smalot/PdfParser/XObject/Image.php
/plugin/totext/vendor/symfony/polyfill-mbstring/LICENSE
/plugin/totext/vendor/symfony/polyfill-mbstring/Mbstring.php
/plugin/totext/vendor/symfony/polyfill-mbstring/README.md
/plugin/totext/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php
/plugin/totext/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php
/plugin/totext/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php
/plugin/totext/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php
/plugin/totext/vendor/symfony/polyfill-mbstring/bootstrap.php
/plugin/totext/vendor/symfony/polyfill-mbstring/bootstrap72.php
/plugin/totext/vendor/symfony/polyfill-mbstring/bootstrap80.php
/plugin/totext/vendor/symfony/polyfill-mbstring/composer.json