/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 多載接受自零起算的陣列,讓呼叫端
可以只攤平其中一部分。已經是 /Rotate=0 的頁面
會計入 Report.SkippedPageCount,
並保持不動
內部對每個旋轉頁面的處理流程是:
內容透過
FPDFPage_CountObjects + FPDFPage_GetObject
+ FPDFPageObj_TransformF,
註解透過
FPDFPage_GetAnnot + FPDFAnnot_GetRect /
FPDFAnnot_SetRect,
頁面框透過
FPDFPage_SetMediaBox / FPDFPage_SetCropBox,
最後以 0 呼叫 FPDFPage_SetRotation。
矩陣由 FPDFPage_GetMediaBox 傳回的
未旋轉 MediaBox 推導而來
PageNumbers — 要處理的頁面索引,自零起算。傳入空陣列(或改用單參數多載)即可攤平每一頁Options — TPdfFlattenRotationOptions,包含 TransformAnnotations、TransformPageBoxes 與 AutoUpdate。Default 會轉換註解、對調頁面框,並在每個旋轉頁面處理完後呼叫 UpdatePageReport — TPdfFlattenRotationReport,包含 ProcessedPageCount、SkippedPageCount、FailedPageCount、TotalObjectsTransformed 與 TotalAnnotationsTransformed,另有 Succeeded 與 ErrorMessage[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 的不變條件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;