/Rotate actual de cada página en el flujo de contenido, los cuadros de página y los rectángulos de anotación, y después restablece /Rotate a 0 para que la disposición visual se conserve sin depender de la indicación de rotación de pantallafunction FlattenPageRotation(
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
function FlattenPageRotation(
const PageNumbers : array of Integer;
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
Muchas herramientas posteriores (pipelines de impresión antiguos, extractores de imágenes,
preprocesadores de OCR, conversores a raster) ignoran la entrada de página /Rotate
y renderizan las páginas rotadas en una orientación incorrecta.
FlattenPageRotation aplica la inversa de la rotación actual al
contenido de la página, a los rectángulos de anotación y a los cuadros de página, y después establece
/Rotate en 0. Tras la llamada la página visible es
idéntica al original rotado, pero ya no depende de que el
visor aplique la indicación de rotación
La sobrecarga de un solo argumento procesa todas las páginas; la
sobrecarga con PageNumbers acepta una matriz basada en cero para que los llamadores puedan
aplanar un subconjunto. Las páginas que ya están en /Rotate=0 se
cuentan en Report.SkippedPageCount y se dejan
intactas
Internamente cada página rotada pasa por
FPDFPage_CountObjects + FPDFPage_GetObject
+ FPDFPageObj_TransformF para el contenido, después por
FPDFPage_GetAnnot + FPDFAnnot_GetRect /
FPDFAnnot_SetRect para las anotaciones, luego por
FPDFPage_SetMediaBox / FPDFPage_SetCropBox
para los cuadros de página y finalmente por FPDFPage_SetRotation
con 0. La matriz se deriva del MediaBox sin rotar devuelto
por FPDFPage_GetMediaBox
PageNumbers — índices de página basados en cero que se procesarán. Pase una matriz vacía (o use la sobrecarga de un solo argumento) para aplanar todas las páginasOptions — TPdfFlattenRotationOptions con TransformAnnotations, TransformPageBoxes y AutoUpdate. Default transforma las anotaciones, intercambia los cuadros de página y llama a UpdatePage después de cada página rotadaReport — TPdfFlattenRotationReport con ProcessedPageCount, SkippedPageCount, FailedPageCount, TotalObjectsTransformed y TotalAnnotationsTransformed, más Succeeded y ErrorMessage[0, 1, -1, 0, H, 0], 180° usa [-1, 0, 0, -1, W, H], 270° usa [0, -1, 1, 0, 0, W], donde W y H son las dimensiones del MediaBox sin rotarTransformPageBoxes=False cuando los llamadores pretendan reescribir los cuadros por su cuentaleft <= right / bottom <= topPageNumber actual del llamador se guarda y se restaura alrededor de la llamada, de modo que los llamadores pueden seguir trabajando con seguridad en su página previamente activa/Rotate=0 se omiten y se cuentan en Report.SkippedPageCount; una ejecución con todas las páginas omitidas aun así devuelve True porque nada falló
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;