/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
для блоков страницы и в конце FPDFPage_SetRotation
с 0. Матрица строится из неповернутого MediaBox, возвращаемого
FPDFPage_GetMediaBox
PageNumbers — индексы страниц с отсчётом от нуля для обработки. Передайте пустой массив (или используйте перегрузку с одним аргументом), чтобы преобразовать каждую страницуOptions — TPdfFlattenRotationOptions с полями TransformAnnotations, TransformPageBoxes и AutoUpdate. Default преобразует аннотации, заменяет блоки страницы и вызывает UpdatePage после каждой повёрнутой страницыReport — 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 — размеры неповернутого MediaBoxTransformPageBoxes=False, если вызывающий код собирается переписать блоки самостоятельноleft <= right / bottom <= topPageNumber) сохраняется и восстанавливается вокруг вызова, поэтому можно безопасно продолжать работу с ранее активной страницей/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;