/Rotate každé stránky do obsahového proudu, stránekových rámců a obdélníků anotací a poté resetuje /Rotate na 0, takže vizuální rozvržení zůstane zachováno bez spoléhání na rotační hint pro zobrazenífunction FlattenPageRotation(
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
function FlattenPageRotation(
const PageNumbers : array of Integer;
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
Mnoho downstream nástrojů (starší tiskové pipeline, extraktory obrázků, OCR preprocesory, rastrové konvertory) ignoruje stránkovou položku /Rotate a vykresluje otočené stránky ve špatné orientaci.
FlattenPageRotation aplikuje inverz aktuální rotace na obsah stránky, obdélníky anotací a stránkové rámce a poté nastaví
/Rotate na 0. Po volání je viditelná stránka totožná s otočeným originálem, ale už nespoléhá na to,
že prohlížeč aplikuje rotační hint
Overload s jedním argumentem zpracovává každou stránku; overload
s PageNumbers přijímá pole indexované od nuly, takže volající mohou
zploštit podmnožinu. Stránky už na /Rotate=0 se
započítají do Report.SkippedPageCount a zůstanou
nedotčeny
Interně projde každá otočená stránka sekvencí
FPDFPage_CountObjects + FPDFPage_GetObject
+ FPDFPageObj_TransformF pro obsah, poté
FPDFPage_GetAnnot + FPDFAnnot_GetRect /
FPDFAnnot_SetRect pro anotace, dále
FPDFPage_SetMediaBox / FPDFPage_SetCropBox
pro stránkové rámce a nakonec FPDFPage_SetRotation
s 0. Matice se odvozuje z neotočeného MediaBoxu vráceného
funkcí FPDFPage_GetMediaBox
PageNumbers — indexy stránek od nuly ke zpracování. Prázdné pole (nebo použití overloadu s jedním argumentem) zploští každou stránkuOptions — TPdfFlattenRotationOptions s TransformAnnotations, TransformPageBoxes a AutoUpdate. Default transformuje anotace, vyměňuje stránkové rámce a po každé otočené stránce volá UpdatePageReport — TPdfFlattenRotationReport s ProcessedPageCount, SkippedPageCount, FailedPageCount, TotalObjectsTransformed a TotalAnnotationsTransformed, plus Succeeded a ErrorMessage[0, 1, -1, 0, H, 0], 180° používá [-1, 0, 0, -1, W, H], 270° používá [0, -1, 1, 0, 0, W], kde W a H jsou rozměry neotočeného MediaBoxuTransformPageBoxes=Falseleft <= right / bottom <= topPageNumber volajícího se uloží a kolem volání obnoví, takže volající mohou bezpečně pokračovat v práci na své dříve aktivní stránce/Rotate=0 se přeskočí a započítají do Report.SkippedPageCount; běh, kdy se přeskočí vše, stále vrací True, protože nic neselhalo
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;