/Rotate courant de chaque page dans le flux de contenu, les boîtes de page et les rectangles d’annotations, puis ramène /Rotate à 0 afin que la mise en page visuelle soit préservée sans dépendre de l’indication de rotation à l’affichagefunction FlattenPageRotation(
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
function FlattenPageRotation(
const PageNumbers : array of Integer;
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
Nombreux outils en aval (anciennes chaînes d’impression, extracteurs d’images, préprocesseurs OCR, convertisseurs matriciels) ignorent l’entrée de page /Rotate et rendent les pages pivotées dans une mauvaise orientation. FlattenPageRotation applique l’inverse de la rotation courante au contenu de la page, aux rectangles d’annotations et aux boîtes de page, puis définit /Rotate à 0. Après l’appel, la page visible est identique à l’original pivoté, mais ne dépend plus de l’application de l’indication de rotation par le visualiseur
La surcharge à un argument traite toutes les pages ; la surcharge PageNumbers accepte un tableau à base zéro afin que les appelants puissent aplatir un sous-ensemble. Les pages déjà en /Rotate=0 sont comptées dans Report.SkippedPageCount et laissées intactes
En interne, chaque page pivotée passe par FPDFPage_CountObjects + FPDFPage_GetObject + FPDFPageObj_TransformF pour le contenu, puis FPDFPage_GetAnnot + FPDFAnnot_GetRect / FPDFAnnot_SetRect pour les annotations, puis FPDFPage_SetMediaBox / FPDFPage_SetCropBox pour les boîtes de page, et enfin FPDFPage_SetRotation avec 0. La matrice est dérivée du MediaBox non pivoté renvoyé par FPDFPage_GetMediaBox
PageNumbers — indices de pages à base zéro à traiter. Passez un tableau vide (ou utilisez la surcharge à un argument) pour aplatir toutes les pagesOptions — TPdfFlattenRotationOptions avec TransformAnnotations, TransformPageBoxes et AutoUpdate. Default transforme les annotations, permute les boîtes de page et appelle UpdatePage après chaque page pivotéeReport — TPdfFlattenRotationReport avec ProcessedPageCount, SkippedPageCount, FailedPageCount, TotalObjectsTransformed et TotalAnnotationsTransformed, plus Succeeded et ErrorMessage[0, 1, -1, 0, H, 0], 180° utilise [-1, 0, 0, -1, W, H], 270° utilise [0, -1, 1, 0, 0, W], où W et H sont les dimensions du MediaBox non pivotéTransformPageBoxes=False lorsque les appelants comptent réécrire eux-mêmes les boîtesleft <= right / bottom <= topPageNumber courant de l’appelant est sauvegardé et restauré autour de l’appel, si bien que l’appelant peut continuer à travailler sur sa page active précédente/Rotate=0 sont ignorées et comptées dans Report.SkippedPageCount ; une exécution tout-ignoré renvoie néanmoins True car rien n’a échoué
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;