/Rotate atual de cada página no fluxo de conteúdo, nas caixas de página e nos retângulos de anotações, e depois repõe /Rotate em 0, para que o esquema visual se mantenha sem depender da dica de apresentação da 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 rasterizados) ignoram a entrada
de página /Rotate e apresentam páginas rodadas na orientação errada.
FlattenPageRotation aplica o inverso da rotação atual ao conteúdo da página, aos
retângulos de anotações e às caixas de página, e depois define
/Rotate como 0. Após a chamada, a página visível é
idêntica ao original rodado, mas já não depende do leitor
aplicar a dica de rotação
A sobrecarga de um único argumento processa todas as páginas; a
sobrecarga com PageNumbers aceita um array de base zero, para os chamadores
poderem aplanar um subconjunto. Páginas que já estão com /Rotate=0 são
contadas em Report.SkippedPageCount e ficam
intocadas
Internamente, cada página rodada 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 rodada devolvida
por FPDFPage_GetMediaBox
PageNumbers — índices de página de base zero a processar. Passe um array vazio (ou use a sobrecarga de um único argumento) para aplanar todas as páginasOptions — TPdfFlattenRotationOptions com TransformAnnotations, TransformPageBoxes e AutoUpdate. Default transforma as anotações, troca as caixas de página e chama UpdatePage após cada página rodadaReport — 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], em que W e H são as dimensões da MediaBox não rodadaTransformPageBoxes=False quando os chamadores tencionam reescrever as caixas eles própriosleft <= right / bottom <= topPageNumber atual do chamador é guardado e reposto em torno da chamada, para que os chamadores possam continuar a trabalhar com segurança na página anteriormente ativa/Rotate=0 são ignoradas e contadas em Report.SkippedPageCount; uma execução com tudo ignorado continua a devolver 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;