Zum Inhalt springen
getnextpdf.com

Pro Edition

Document — Ausführliche Referenz

Das Document-Modul stellt drei Pro-Primitive für den Zusammenbau bereit: das Aufteilen nach Seitenbereichen, das Zusammenführen mehrerer Dokumente und den Aufbau des Collection-Dictionarys für PDF-Portfolios. PdfSplitter extrahiert Seitenbereiche in eigenständige, strukturell konforme PDFs und führt ganze Dokumente zu einer neu nummerierten Datei zusammen. PdfPortfolio erstellt das Collection-Dictionary, das eingebettete Dateien mit sortierbaren Schema-Spalten darstellt. Jeder Einstiegspunkt begrenzt die Eingabegröße und die Objektanzahl gegenüber feindlichen Eingaben.

Diese Funktion ist Teil von NextPDF Pro (nextpdf/pro) und wird mit einer Lizenzhülle der Pro-Stufe aktiviert. Eine Bereitstellung ohne diese Berechtigung lädt die Klassen der Funktion nicht. Editionen vergleichen und Lizenz erwerben.

Alle Modultypen liegen im Namespace NextPDF\Pro\Document. PageRange und MergeResult sind Core-Value-Objects aus NextPDF\Document.

SymbolParameterStandardverhaltenRückgabeLöst aus oder schlägt fehl mitHinweise
PdfSplitter::split()string $pdfData, list<PageRange> $ranges, int $maxBytes = 100_000_000, int $maxRanges = 1000Erstellt ein eigenständiges PDF-Segment pro BereichSplitResultInvalidArgumentException bei fehlendem %PDF-Header; OverflowException bei der Größen-, Bereichsanzahl- oder Closure-SchrankeSchranken laufen vor jedem Parsing
PdfSplitter::splitEvery()string $pdfData, int $pagesPerSegmentLeitet zusammenhängende N-Seiten-Bereiche ab; das letzte Segment kann kürzer seinSplitResultInvalidArgumentException, wenn $pagesPerSegment < 1 oder der Header fehltDelegiert an split() mit Standard-Obergrenzen
PdfSplitter::extractPages()string $pdfData, PageRange $rangeGibt einen Bereich als eigenständige PDF-Bytes zurückstringInvalidArgumentException bei fehlendem Header; OverflowException bei der Closure-SchrankeAuf diesem Pfad keine Obergrenzen-Parameter
PdfSplitter::mergeDocuments()list<string> $pdfs, int $maxInputs = 100, int $maxBytesEach = 100_000_000Führt Eingaben der Reihe nach zu einer neu nummerierten PDF zusammenMergeResultInvalidArgumentException bei leerer Liste oder Nicht-PDF-Eingabe; OverflowException bei der Anzahl-, Pro-Eingabe-Größen- oder Closure-SchrankeSeit 3.1.0; die höchste Eingabeversion bestimmt den Ausgabe-Header
SplitResultreadonly $segments, $ranges, $totalPagesTrägt rohe Segment-Bytes plus Quell-Metadatenfinal readonly Value-Object
SplitResult::count()Zählt erzeugte Segmenteint
SplitResult::segment()int $indexGibt die Bytes eines Segments zurückstringOutOfRangeException bei einem Index außerhalb des gültigen BereichsNullbasierter Index
PdfPortfolio::__construct()string $viewMode = 'tile'Validiert den View-Modus bei der KonstruktionInvalidArgumentException bei einem anderen Modus als tile, detail, hidden
PdfPortfolio::addSchema()PortfolioField $fieldHängt eine Schema-Spalte anselfFluent
PdfPortfolio::addEntry()PortfolioEntry $entryHängt einen Dateieintrag anselfFluent
PdfPortfolio::getSchema()Gibt die gesammelten Schema-Felder zurücklist<PortfolioField>
PdfPortfolio::getEntries()Gibt die gesammelten Dateieinträge zurücklist<PortfolioEntry>
PdfPortfolio::count()Zählt Dateieinträgeint
PdfPortfolio::generateCollectionDictionary()Gibt den Collection-Dictionary-String ausstringSchema- und Sort-Blöcke erscheinen nur, wenn Felder vorhanden sind
PortfolioEntry$filename, $data, $description = '', $mimeType = 'application/octet-stream', $customFields = []Unveränderliches Dateieintrag-Value-Objectsize() gibt die Byte-Länge der Daten zurück
PortfolioField$name, PortfolioFieldType $type, $displayName = '', $order = 0, $visible = trueUnveränderliches Schema-Spalten-Value-ObjecteffectiveDisplayName() fällt auf $name zurück
PortfolioFieldTypeString-Enum: Text, Date, Number, FileName, Description, Size, ModDate, CreationDateBildet jeden Fall über pdfSubtype() auf ein PDF-/Subtype abstring (S, D, N, F, Desc)Datumsartige Fälle teilen den Subtype D; numerische Fälle teilen N

Signaturen der Einstiegspunkte:

public function split(string $pdfData, array $ranges, int $maxBytes = 100_000_000, int $maxRanges = 1000): SplitResult
public function mergeDocuments(
array $pdfs,
int $maxInputs = 100,
int $maxBytesEach = 100_000_000,
): MergeResult
public function __construct(
private readonly string $viewMode = 'tile',
)
public function generateCollectionDictionary(): string

Aufteilen und Zusammenführen teilen sich eine Objektgraph-Pipeline:

  • Die Eingabe muss mit dem %PDF-Header beginnen. Größen- und Anzahl-Schranken laufen vor dem Parsing und lösen bei Überschreitung OverflowException aus.
  • Blattseiten werden durch Suche nach Seitenobjekt-Markern erkannt; Seitenbaum-Knoten werden bei der Zählung ausgeschlossen.
  • Der Parser indexiert jedes unkomprimierte indirekte Objekt mit einer stream-bewussten Terminator-Suche. Das erste Auftreten einer Objekt-ID gewinnt, sodass Overrides aus inkrementellen Updates nicht angewendet werden.
  • Vererbbare Seitenbaum-Attribute (/Resources, /MediaBox, /CropBox, /Rotate) werden durch Durchlaufen der /Parent-Kette auf jede extrahierte Seite materialisiert, sodass Segmente eigenständig sind.
  • Die transitive Closure der indirekten Referenzen jeder Seite wird gesammelt – ohne die /Parent-Rückkante – und in einen frischen, zusammenhängenden ID-Raum neu nummeriert.
  • Der Serializer gibt den Header, den Catalog, den Pages-Baum, die Seitenobjekte und die Closure-Objekte aus, danach eine Cross-Reference-Tabelle mit byte-genauen Offsets und ein startxref, das auf das Schlüsselwort xref zeigt.
  • mergeDocuments wiederholt die Pipeline pro Eingabe in einen gemeinsamen ID-Raum. Die höchste Eingabe-PDF-Version bestimmt den Ausgabe-Header. Es ist der konforme Ersatz für den deaktivierten Core-Merger, der fail-closed bleibt.
  • Die Ausgabe ist deterministisch. Es werden keine Zeitstempel oder zufälligen Bezeichner ausgegeben, sodass identische Eingabe identische Bytes ergibt.

Portfolio-Zusammenbau:

  • Der Konstruktor validiert den View-Modus. Das ausgegebene /View-Token ist /T, /D bzw. /H für tile, detail und hidden.
  • generateCollectionDictionary() gibt /Type /Collection, das /View-Token, einen /Schema-Block, wenn Felder vorhanden sind, und eine /Sort-Direktive auf das erste Schema-Feld (aufsteigend) aus.
  • Jedes Schema-Feld gibt /Subtype (aus pdfSubtype()), /N (escapter Anzeigename), /O (Reihenfolge) und /V (Sichtbarkeit) aus.
  • Feldnamen werden zu gültigen PDF-Name-Tokens bereinigt; Nicht-Wort-Zeichen werden zu Unterstrichen. String-Werte werden als PDF-Literal-Strings escapt.
  • Dateieinträge werden über getEntries() zur Einbettung durch die Schreibschicht bereitgestellt. Das Collection-Dictionary selbst trägt nur View, Schema und Sort.
  • Ein Bereich, der keine Seiten trifft, ergibt ein minimales Ein-Seiten-Segment (612 x 792 MediaBox), keinen Fehler.
  • Ein Dokument ohne erkennbare Seiten-Marker wird als eine Seite gezählt.
  • Seiten, die in Object-Streams gespeichert sind, werden nicht erkannt; nur unkomprimierte indirekte Objekte nehmen an der Extraktion teil.
  • Bei doppelten Objekt-IDs wird die Revision mit dem niedrigsten Offset verwendet; spätere Revisionen aus inkrementellen Updates werden ignoriert.
  • Die Referenz-Closure pro Segment ist auf 50,000 Objekte begrenzt; ein bösartig selbstreferenzieller oder Fan-out-Graph löst OverflowException aus.
  • Standard-Obergrenzen: 100 MB Eingabe, 1,000 Bereiche, 100 Merge-Eingaben. Alle sind pro Aufruf durch den Aufrufer einstellbar.
  • splitEvery() weist eine Segmentgröße unter 1 mit InvalidArgumentException zurück.
  • SplitResult::segment() weist einen Index außerhalb des gültigen Bereichs mit OutOfRangeException zurück.
  • Zwei Schema-Feldnamen, die sich nur in der Interpunktion unterscheiden, werden zum selben Dictionary-Schlüssel bereinigt; das spätere Feld überdeckt im ausgegebenen Schema stillschweigend das frühere.
  • Dieses Modul führt keine kryptografischen Operationen durch; der FIPS-Modus ändert sein Verhalten nicht.

Die Segment- und Merge-Ausgabe folgt dem Seitenobjekt-Modell von ISO 32000-2; die Quelle annotiert die relevanten Klauseln. Extern überprüfbare Aussagen:

  • Trailer-Layout, startxref-Byte-Offset und der %%EOF-Terminator folgen ISO 32000-2:2020, §7.5.5 — Referenz ef0f2a4b563b84f81b3e6428612bc47c510d94fc8096849d339abf0f3247d845.
  • Die /View-Werte des Collection-Dictionarys (/T, /D, /H) folgen ISO 32000-2:2020, §12.3.5 — Referenz 5cefaaeb40f3ff98e3aba135ac57c9424a05c43144c1b9b5156bfd4295e08ddd.
  • Die Collection-Feld-Einträge /Subtype, /N, /O und /V folgen ISO 32000-2:2020, §12.3.5 (collection field dictionary) — Referenz 6300fbfdc8a913a8dc6f6ae34eff99f2bd03c4313a77777cdd5a8dd856d9537a.

Diese Aussagen beschreiben implementierte Funktionalität, die durch die Tests des Moduls verifiziert ist. Die Unterstützung eines Konstrukts ist keine Konformitätsaussage, und Konformität ist keine Zertifizierung; NextPDF besitzt für dieses Modul keine Zertifizierung durch Dritte.

  • Alle Modulklassen sind final; die Result- und Value-Object-Typen sind readonly. Die Splitter- und Portfolio-Typen stammen aus 1.9.0; mergeDocuments() wurde in 3.1.0 hinzugefügt.
  • PageRange und MergeResult sind Core-Typen, sodass Aufrufstellen editions-portabel bleiben.
  • Segment-Trailer tragen nur /Size und /Root; es wird kein /ID-Dateibezeichner und kein /Info-Dictionary ausgegeben.
  • Für inkrementelle Update- oder Signatur-Workflows übergeben Sie die Segment-Bytes an das Writer-Modul, anstatt sie an Ort und Stelle nachzubearbeiten.
  • Das Modul protokolliert keine Dokumentinhalte.

Diese Seite dokumentiert ausschließlich extern beobachtbares Verhalten und die unterstützte öffentliche API-Oberfläche. Interne Namespace-Pfade, Hilfsklassen, Mechanismus-Tabellen, Runbook-Dateinamen und Ticket-Präfixe liegen außerhalb des Geltungsbereichs.