/Rotate をコンテンツストリーム、ページボックス、注釈矩形に焼き込み、/Rotate を 0 にリセットするため、回転表示ヒントに依存せず視覚レイアウトが保持されますfunction FlattenPageRotation(
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
function FlattenPageRotation(
const PageNumbers : array of Integer;
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
多くの下流ツール(古い印刷パイプライン、画像抽出ツール、
OCR 前処理、ラスタコンバーター)は /Rotate
ページエントリを無視し、回転ページを誤った向きでレンダリングします。
FlattenPageRotation は現在の回転の逆を
ページコンテンツ、注釈矩形、ページボックスに適用し、
/Rotate を 0 に設定します。呼び出し後、表示されるページは
回転された元と同一ですが、ビューアが回転ヒントを適用することに
依存しなくなります
単一引数のオーバーロードはすべてのページを処理し、
PageNumbers オーバーロードは 0 始まりの配列を受け取るため、呼び出し側は
サブセットをフラット化できます。既に /Rotate=0 のページは
Report.SkippedPageCount に数えられ、
変更されません
内部的には、回転された各ページについて、コンテンツには
FPDFPage_CountObjects + FPDFPage_GetObject
+ FPDFPageObj_TransformF を実行し、注釈には
FPDFPage_GetAnnot + FPDFAnnot_GetRect /
FPDFAnnot_SetRect を実行し、ページボックスには
FPDFPage_SetMediaBox / FPDFPage_SetCropBox
を実行し、最後に FPDFPage_SetRotation
を 0 で実行します。マトリックスは FPDFPage_GetMediaBox が返す
未回転の MediaBox から導出されます
PageNumbers — 処理する 0 始まりのページインデックス。すべてのページをフラット化するには、空の配列を渡します(または単一引数のオーバーロードを使用します)Options — TransformAnnotations、TransformPageBoxes、AutoUpdate を持つ TPdfFlattenRotationOptions。Default は注釈を変換し、ページボックスを交換し、回転された各ページの後に UpdatePage を呼び出しますReport — ProcessedPageCount、SkippedPageCount、FailedPageCount、TotalObjectsTransformed、TotalAnnotationsTransformed、および Succeeded と ErrorMessage を持つ TPdfFlattenRotationReport[0, 1, -1, 0, H, 0]、180° は [-1, 0, 0, -1, W, H]、270° は [0, -1, 1, 0, 0, W] を使用します。W と H は未回転 MediaBox の寸法ですTransformPageBoxes=False で無効化してくださいleft <= right / bottom <= top の不変条件を反転させることがあるため、変換後の 4 つの角すべてから再構築されますPageNumber は呼び出しの前後で保存・復元されるため、以前アクティブだったページで安全に作業を続けられます/Rotate=0 のページはスキップされ、Report.SkippedPageCount に数えられます。すべてスキップされた実行でも失敗がないため True が返ります
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;