/Rotate jeder Seite in den Content-Stream, die Seitenboxen und die Annotationsrechtecke ein und setzt /Rotate danach auf 0 zurück, sodass das visuelle Layout erhalten bleibt, ohne auf den Drehungs-Anzeigehinweis angewiesen zu seinfunction FlattenPageRotation(
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
function FlattenPageRotation(
const PageNumbers : array of Integer;
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
Viele nachgelagerte Werkzeuge (ältere Druckpipelines, Bild-Extraktoren,
OCR-Vorverarbeiter, Rasterkonverter) ignorieren den Seiten-Eintrag
/Rotate und rendern gedrehte Seiten in der falschen Ausrichtung.
FlattenPageRotation wendet die Umkehrung der aktuellen Drehung auf
den Seiteninhalt, die Annotationsrechtecke und die Seitenboxen an und setzt
/Rotate dann auf 0. Nach dem Aufruf ist die sichtbare Seite
identisch mit dem gedrehten Original, hängt aber nicht mehr davon ab,
dass der Viewer den Drehungshinweis anwendet
Die Überladung mit einem Argument verarbeitet jede Seite; die
PageNumbers-Überladung nimmt ein nullbasiertes Array entgegen, damit Aufrufer
eine Teilmenge abflachen können. Seiten, die bereits /Rotate=0 haben, werden
in Report.SkippedPageCount gezählt und
unangetastet gelassen
Intern durchläuft jede gedrehte Seite
FPDFPage_CountObjects + FPDFPage_GetObject
+ FPDFPageObj_TransformF für den Inhalt, dann
FPDFPage_GetAnnot + FPDFAnnot_GetRect /
FPDFAnnot_SetRect für Anmerkungen, dann
FPDFPage_SetMediaBox / FPDFPage_SetCropBox
für die Seitenboxen und schließlich FPDFPage_SetRotation
mit 0. Die Matrix wird aus der ungedrehten MediaBox abgeleitet, die
FPDFPage_GetMediaBox zurückgibt
PageNumbers — nullbasierte Seitenindizes zum Verarbeiten. Übergeben Sie ein leeres Array (oder verwenden Sie die Ein-Argument-Überladung), um jede Seite abzuflachenOptions — TPdfFlattenRotationOptions mit TransformAnnotations, TransformPageBoxes und AutoUpdate. Default transformiert Anmerkungen, tauscht die Seitenboxen und ruft UpdatePage nach jeder gedrehten Seite aufReport — TPdfFlattenRotationReport mit ProcessedPageCount, SkippedPageCount, FailedPageCount, TotalObjectsTransformed und TotalAnnotationsTransformed, plus Succeeded und ErrorMessage[0, 1, -1, 0, H, 0], 180° verwendet [-1, 0, 0, -1, W, H], 270° verwendet [0, -1, 1, 0, 0, W], wobei W und H die ungedrehten MediaBox-Maße sindTransformPageBoxes=False, wenn Aufrufer die Boxen selbst neu schreiben wollenleft <= right / bottom <= top kippen kannPageNumber des Aufrufers wird um den Aufruf herum gesichert und wiederhergestellt, sodass Aufrufer sicher auf ihrer zuvor aktiven Seite weiterarbeiten können/Rotate=0 haben, werden übersprungen und in Report.SkippedPageCount gezählt; ein Durchlauf, der nur überspringt, gibt dennoch True zurück, weil nichts fehlgeschlagen ist
var
Options: TPdfFlattenRotationOptions;
Report: TPdfFlattenRotationReport;
begin
Pdf1.FileName := 'C:\Scanned.pdf';
Pdf1.Active := True;
Options := TPdfFlattenRotationOptions.Default;
Pdf1.FlattenPageRotation(Options, Report);
Pdf1.SaveAs('C:\Scanned_flat.pdf');
end;