/Rotate i innehållsströmmen, sidrutorna och annoteringsrektanglarna och nollställer sedan /Rotate till 0 så att den visuella layouten bevaras utan att förlita sig på rotationstipsetfunction FlattenPageRotation(
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
function FlattenPageRotation(
const PageNumbers : array of Integer;
const Options : TPdfFlattenRotationOptions;
out Report : TPdfFlattenRotationReport): Boolean; overload;
Många efterföljande verktyg (äldre utskriftspipelines, bildextraktorer,
OCR-förbehandlare, rasterkonverterare) ignorerar sidposten /Rotate
och renderar roterade sidor i fel orientering.
FlattenPageRotation tillämpar inversen av den aktuella rotationen på
sidinnehållet, annoteringsrektanglarna och sidrutorna och sätter sedan
/Rotate till 0. Efter anropet är den synliga sidan
identisk med den roterade originalsidan, men den förlitar sig inte längre på
att visaren tillämpar rotationstipset
Overloaden med ett argument bearbetar alla sidor;
PageNumbers-overloaden tar en nollbaserad array så att anroparen kan
baka in rotationen för en delmängd. Sidor som redan har /Rotate=0
räknas i Report.SkippedPageCount och lämnas
orörda
Internt körs varje roterad sida genom
FPDFPage_CountObjects + FPDFPage_GetObject
+ FPDFPageObj_TransformF för innehållet, sedan
FPDFPage_GetAnnot + FPDFAnnot_GetRect /
FPDFAnnot_SetRect för annoteringarna, därefter
FPDFPage_SetMediaBox / FPDFPage_SetCropBox
för sidrutorna och till sist FPDFPage_SetRotation
med 0. Matrisen härleds från den oroterade MediaBox som
FPDFPage_GetMediaBox returnerar
PageNumbers — nollbaserade sidindex att bearbeta. Skicka en tom array (eller använd overloaden med ett argument) för att baka in rotationen på alla sidorOptions — TPdfFlattenRotationOptions med TransformAnnotations, TransformPageBoxes och AutoUpdate. Default transformerar annoteringar, byter ut sidrutorna och anropar UpdatePage efter varje roterad sidaReport — TPdfFlattenRotationReport med ProcessedPageCount, SkippedPageCount, FailedPageCount, TotalObjectsTransformed och TotalAnnotationsTransformed, plus Succeeded och ErrorMessage[0, 1, -1, 0, H, 0], 180° använder [-1, 0, 0, -1, W, H], 270° använder [0, -1, 1, 0, 0, W], där W och H är den oroterade MediaBoxens måttTransformPageBoxes=False när anroparen själv tänker skriva om rutornaleft <= right / bottom <= topPageNumber sparas och återställs runt anropet, så anroparen kan tryggt fortsätta arbeta på sin tidigare aktiva sida/Rotate=0 hoppas över och räknas i Report.SkippedPageCount; en körning där alla sidor hoppas över returnerar ändå True, eftersom inget misslyckades
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;