/Rotate actual de cada página en el flujo de contenido, las cajas de página y los rectángulos de anotación, y luego restablece /Rotate a 0, de modo que la disposición visual se conserva sin depender de la sugerencia de visualización de rotaciónfunction 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, convertidores 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 las cajas de página,
y luego establece /Rotate en 0. Después de la llamada la página visible es
idéntica al original rotado, pero ya no depende de que el visor aplique la
sugerencia de rotación
La sobrecarga de un solo argumento procesa todas las páginas; la
sobrecarga con PageNumbers acepta un arreglo basado en cero para que quien llame
pueda 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, luego
FPDFPage_GetAnnot + FPDFAnnot_GetRect /
FPDFAnnot_SetRect para las anotaciones, después
FPDFPage_SetMediaBox / FPDFPage_SetCropBox
para las cajas de página y, por último, FPDFPage_SetRotation
con 0. La matriz se deriva del MediaBox sin rotar que devuelve
FPDFPage_GetMediaBox
PageNumbers — índices de página basados en cero que se procesarán. Pase un arreglo vacío (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 las cajas de página y llama a UpdatePage después de cada página rotadaReport — TPdfFlattenRotationReport con ProcessedPageCount, SkippedPageCount, FailedPageCount, TotalObjectsTransformed y TotalAnnotationsTransformed, además de 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 quien llame pretenda reescribir las cajas por su cuentaleft <= right / bottom <= topPageNumber actual de quien llama se guarda y se restaura alrededor de la llamada, de modo que quien llame puede 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;