/Rotate atual de cada página no fluxo de conteúdo, nas caixas de página e nos retângulos de anotação e então redefine /Rotate para 0, de modo que o layout visual seja preservado sem depender da dica de exibição de rotaçãofunction FlattenPageRotation(
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
function FlattenPageRotation(
const PageNumbers : array of Integer;
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
Muitas ferramentas a jusante (pipelines de impressão antigos, extratores de
imagens, pré-processadores de OCR, conversores raster) ignoram a entrada de
página /Rotate e renderizam páginas rotacionadas na orientação
errada. FlattenPageRotation aplica a inversa da rotação atual ao conteúdo da
página, aos retângulos de anotação e às caixas de página, e então define
/Rotate como 0. Após a chamada, a página visível é idêntica ao
original rotacionado, mas não depende mais de o visualizador aplicar a dica
de rotação
A sobrecarga de um único argumento processa todas as páginas; a
sobrecarga PageNumbers aceita um array base zero para que os chamadores
possam achatar um subconjunto. Páginas já com /Rotate=0 são
contadas em Report.SkippedPageCount e deixadas
intactas
Internamente, cada página rotacionada passa por
FPDFPage_CountObjects + FPDFPage_GetObject
+ FPDFPageObj_TransformF para o conteúdo, depois
FPDFPage_GetAnnot + FPDFAnnot_GetRect /
FPDFAnnot_SetRect para as anotações, depois
FPDFPage_SetMediaBox / FPDFPage_SetCropBox
para as caixas de página e, por fim, FPDFPage_SetRotation
com 0. A matriz é derivada da MediaBox não rotacionada retornada
por FPDFPage_GetMediaBox
PageNumbers — índices de páginas base zero a processar. Passe um array vazio (ou use a sobrecarga de um único argumento) para achatar todas as páginas.Options — TPdfFlattenRotationOptions com TransformAnnotations, TransformPageBoxes e AutoUpdate. Default transforma anotações, troca as caixas de página e chama UpdatePage após cada página rotacionada.Report — TPdfFlattenRotationReport com ProcessedPageCount, SkippedPageCount, FailedPageCount, TotalObjectsTransformed e TotalAnnotationsTransformed, além de 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], onde W e H são as dimensões da MediaBox não rotacionada.TransformPageBoxes=False quando os chamadores pretenderem reescrever as caixas por conta própria.left <= right / bottom <= top.PageNumber atual do chamador é salvo e restaurado ao redor da chamada, de modo que os chamadores podem continuar trabalhando com segurança na página que estava ativa antes./Rotate=0 são ignoradas e contadas em Report.SkippedPageCount; uma execução inteiramente ignorada ainda retorna True porque nada falhou.
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;