/Rotate każdej strony w strumień treści, pola strony i prostokąty adnotacji, po czym zeruje /Rotate na 0, dzięki czemu układ wizualny jest zachowany bez polegania na podpowiedzi obrotu przy wyświetlaniufunction FlattenPageRotation(
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
function FlattenPageRotation(
const PageNumbers : array of Integer;
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
Wiele narzędzi pośrednich (starsze pipeline'y drukowania, ekstraktory obrazów,
preprocesory OCR, konwertery rastrowe) ignoruje wpis /Rotate
strony i renderuje obrócone strony w złej orientacji.
FlattenPageRotation stosuje odwrotność bieżącego obrotu do treści strony,
prostokątów adnotacji i pól strony, po czym ustawia
/Rotate na 0. Po wywołaniu widoczna strona jest
identyczna z obróconym oryginałem, ale już nie zależy od tego,
czy przeglądarka zastosuje podpowiedź obrotu
Wersja jednoargumentowa przetwarza każdą stronę; wersja
z PageNumbers przyjmuje tablicę indeksowaną od zera, więc wywołujący może
spłaszczyć podzbiór stron. Strony już ustawione na /Rotate=0 są
liczone w Report.SkippedPageCount i pozostawione
bez zmian
Wewnętrznie każda obrócona strona przechodzi przez
FPDFPage_CountObjects + FPDFPage_GetObject
+ FPDFPageObj_TransformF dla treści, następnie
FPDFPage_GetAnnot + FPDFAnnot_GetRect /
FPDFAnnot_SetRect dla adnotacji, dalej
FPDFPage_SetMediaBox / FPDFPage_SetCropBox
dla pól strony, a na końcu FPDFPage_SetRotation
z wartością 0. Macierz jest wyprowadzana z nieobróconego MediaBox zwróconego
przez FPDFPage_GetMediaBox
PageNumbers — indeksy stron od zera do przetworzenia. Przekaż pustą tablicę (albo użyj wersji jednoargumentowej), aby spłaszczyć każdą stronęOptions — TPdfFlattenRotationOptions z TransformAnnotations, TransformPageBoxes i AutoUpdate. Default przekształca adnotacje, zamienia pola stron i wywołuje UpdatePage po każdej obróconej stronieReport — TPdfFlattenRotationReport z ProcessedPageCount, SkippedPageCount, FailedPageCount, TotalObjectsTransformed i TotalAnnotationsTransformed, a także Succeeded i ErrorMessage[0, 1, -1, 0, H, 0], 180° używa [-1, 0, 0, -1, W, H], 270° używa [0, -1, 1, 0, 0, W], gdzie W i H to wymiary nieobróconego MediaBoxTransformPageBoxes=False, gdy wywołujący zamierza przepisać pola samodzielnieleft <= right / bottom <= topPageNumber wywołującego jest zapisywany i przywracany wokół wywołania, więc można bezpiecznie kontynuować pracę na wcześniej aktywnej stronie/Rotate=0 są pomijane i liczone w Report.SkippedPageCount; przebieg, w którym wszystko zostało pominięte, nadal zwraca True, bo nic nie zawiodło
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;