/Rotate di ogni pagina nel content stream, nei box di pagina e nei rettangoli delle annotazioni, poi riporta /Rotate a 0 così il layout visivo è preservato senza fare affidamento sull'hint di visualizzazione della rotazionefunction FlattenPageRotation(
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
function FlattenPageRotation(
const PageNumbers : array of Integer;
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
Molti strumenti a valle (pipeline di stampa datate, estrattori di immagini,
preprocessori OCR, convertitori raster) ignorano la voce di pagina
/Rotate e renderizzano le pagine ruotate con l'orientamento
sbagliato. FlattenPageRotation applica l'inverso della rotazione corrente
al contenuto della pagina, ai rettangoli delle annotazioni e ai box di
pagina, poi imposta /Rotate a 0. Dopo la chiamata la pagina
visibile è identica all'originale ruotato, ma non dipende più dal
visualizzatore che applica l'hint di rotazione
L'overload a singolo argomento elabora ogni pagina; l'overload
PageNumbers accetta un array a base zero così i chiamanti
possono appiattire un sottoinsieme. Le pagine già a
/Rotate=0 vengono conteggiate in
Report.SkippedPageCount e lasciate intatte
Internamente ogni pagina ruotata passa attraverso
FPDFPage_CountObjects + FPDFPage_GetObject
+ FPDFPageObj_TransformF per il contenuto, poi
FPDFPage_GetAnnot + FPDFAnnot_GetRect /
FPDFAnnot_SetRect per le annotazioni, poi
FPDFPage_SetMediaBox / FPDFPage_SetCropBox
per i box di pagina e infine FPDFPage_SetRotation
con 0. La matrice è derivata dal MediaBox non ruotato restituito
da FPDFPage_GetMediaBox
PageNumbers — indici di pagina a base zero da elaborare. Passare un array vuoto (o usare l'overload a singolo argomento) per appiattire tutte le pagineOptions — TPdfFlattenRotationOptions con TransformAnnotations, TransformPageBoxes e AutoUpdate. Default trasforma le annotazioni, scambia i box di pagina e chiama UpdatePage dopo ogni pagina ruotataReport — TPdfFlattenRotationReport con ProcessedPageCount, SkippedPageCount, FailedPageCount, TotalObjectsTransformed e TotalAnnotationsTransformed, più Succeeded e ErrorMessage[0, 1, -1, 0, H, 0], 180° usa [-1, 0, 0, -1, W, H], 270° usa [0, -1, 1, 0, 0, W], dove W e H sono le dimensioni del MediaBox non ruotatoTransformPageBoxes=False quando i chiamanti intendono riscrivere i box da solileft <= right / bottom <= topPageNumber corrente del chiamante viene salvato e ripristinato attorno alla chiamata, così i chiamanti possono continuare in sicurezza a lavorare sulla loro pagina precedentemente attiva/Rotate=0 vengono saltate e conteggiate in Report.SkippedPageCount; un'esecuzione con tutte le pagine saltate restituisce comunque True perché nulla è fallito
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;