Het opsplitsen van een grote PDF lijkt in theorie op het bijsnijden van een array: je pakt de pagina's die je nodig hebt en schrijft ze naar een nieuw bestand. In de praktijk is een PDF geen array, en wat in het begin zo simpel lijkt, is eigenlijk een structuur van refererende objecten (kruisverwijzingstabellen). Het extraheren van één enkele pagina betekent dat je niet alleen de paginadictionary moet overbrengen, maar ook de lettertypen, afbeeldingen, resource-dictionaries en de ouder-kind paginaboom (page tree) structuur waar die pagina van afhankelijk is. Pdfium (via de Pdfium Component) lost dit efficiënt op met de FPDF_ImportPages API, die referentieketens afhandelt en intacte subsets schrijft zonder de bytes opnieuw te coderen

Waarom het opsplitsen van PDF's complex is
In een correct gevormde PDF kan pagina 10 refereren aan een lettertypeobject /F1 dat hoog bovenaan het bestand in een /Resources-dictionary wordt gedefinieerd. Als je pagina 10 wegrukt en in een leeg document dumpt zonder die lettertypedefinitie mee te nemen, valt de gerenderde pagina op magische wijze terug op systeemlettertypen of wordt helemaal blanco weergegeven. Omgekeerd, als je gewoon de hele originele PDF kopieert en de ongewenste pagina's uit de /Pages-array verwijdert, genereer je de uitvoer betrouwbaar, maar produceer je een document van twaalf megabyte dat slechts twee zichtbare pagina's bevat (omdat alle niet-gekoppelde afbeeldingsobjecten in de inhoud blijven hangen). Pdfium doorloopt handmatig het importpad en doet het zware werk: diepe kopieën (deep copy) maken van alleen de vereiste afhankelijkheden om de nieuwe subsetbestanden schoon, stand-alone en optimaal qua grootte te houden
De basis opsplitsing: Een document in tweeën delen
De standaard flow op hoog niveau is dat je een doeldocument instelt, objecten laadt en pagina's overzet van de brondictionary naar het doel. Dit proces in Delphi gebruikt Pdfium Component en abstraheert de paginalading in een methode die rechtstreeks communiceert met FPDF_ImportPages
var
SourcePdf: TPdfDocument;
TargetPdf: TPdfDocument;
SourcePageCount, SplitPoint: Integer;
begin
SourcePdf := TPdfDocument.Create;
TargetPdf := TPdfDocument.Create;
try
SourcePdf.LoadFromFile('AnnualReport.pdf');
SourcePageCount := SourcePdf.PageCount;
if SourcePageCount > 10 then
begin
SplitPoint := 10;
// Eerste helft (Pagina's 1 tot 10)
TargetPdf.NewDocument;
TargetPdf.ImportPages(SourcePdf, '1-10', 0);
TargetPdf.SaveToFile('AnnualReport_Part1.pdf');
// Tweede helft (Pagina's 11 tot einde)
TargetPdf.NewDocument;
TargetPdf.ImportPages(SourcePdf, IntToStr(SplitPoint + 1) + '-' + IntToStr(SourcePageCount), 0);
TargetPdf.SaveToFile('AnnualReport_Part2.pdf');
end;
finally
SourcePdf.Free;
TargetPdf.Free;
end;
end;
Belangrijke logica hier: ImportPages accepteert een met komma's of koppeltekens gescheiden string. 1-10 betekent "trek pagina 1 tot 10, inclusief" over. Deze parsering is robuust en scheidt de interne objecten op C-niveau op verzoek efficiënt af. Het laatste argument, 0, geeft de bestemmingsindex in het doeldocument aan, we appenden vanaf de index van het nieuw gemaakte PDF-object
Paginareeksen parseren: "1, 3, 5-7"
Pdfium's C API accepteert expliciet reeksen. Als je facturen per ID extraheert en de benodigde bereiken alleen willekeurige pagina's zijn, is de C API-syntaxis extreem vergevingsgezind. Je kunt '1,3,5-7' overgeven om precies die pagina's in exact die chronologische lay-out op te slaan in één bewerking. Dit bespaart een enorme overhead voor bestands-I/O in plaats van te loopen en één bestandsopslag uit te voeren voor elke getargete pagina. De Pdfium Component stuurt de string direct door, dus het formaat is 1-gebaseerd, precies wat gebruikers in een printvenster typen
Uitvoer bestandsgrootte versus afhankelijkheden
Wanneer Pdfium ImportPages aanroept, brengt het gedeelde resources over. Als een bedrijfslogo is ingesloten als een Image XObject dat wordt gebruikt op pagina's 1 tot 100, en je haalt pagina 5 en 6 uit, controleert Pdfium de afhankelijkheid van de XObject-resource en sluit het dat byteblok eenmalig in in je doel-PDF. De TPdfDocument.ImportPages roept op verantwoorde wijze geen onnodige overheads aan, vandaar de schone uitvoergrootte, in tegenstelling tot pure text-parser logica die je misschien ergens anders online op StackOverflow-scripts tegenkomt. Het is veilige, door de standaard gevalideerde binaire scheiding
Foutafhandeling en geselecteerde bestanden
Houd er rekening mee dat formuliervelden, annotaties en digitale handtekeningen worden losgekoppeld bij import als deze formuliervelden interacteren over pagina's die achterblijven in de brondictionary. Over het algemeen breekt het splitsen van digitaal ondertekende PDF's altijd de cryptografische hash van het PDF-document (het bewijs van knoeien). U zult merken dat opgesplitste bestanden ongeldige AcroForm-waarschuwingen weergeven in Acrobat als u dit forceert. U moet dus het document strippen of weigeren er digitaal ondertekende PDF's in te scannen. Lees de FPDF foutcodes na bewerking als je met kritieke PDF-verwerking werkt, voor robuustheid in je Delphi-laag