Integrera PDFium VCL Component-flöden i Delphi- och C++Builder-applikationer, eller PDFium LCL Component-flöden i Lazarus/FPC, med källkodskomponenter för visning, rendering, formulär, utskrift, preflight-rapporter och standardinriktad validering.
Den här artikeln är skriven för team som lägger till review, markup, approval, or quality-control panels to a Delphi PDF viewer. Den behandlar annotation review UI som produktionsnära dokumentteknik, inte som ett isolerat komponentanrop.
Den praktiska risken är att anteckningar är enkla att visa men svåra att lita på när sidrotation, författarskap, svar, dolda tillstånd eller koordinatkonverteringar inte hanteras konsekvent. Därför behöver flödet ett skrivet kontrakt, observerbar diagnostik och realistiska regressionsfiler.
Arkitekturbeslut
Separera granskningsläget från sidrenderingen. vilka anteckningstyper som kan visas, filtreras, besvaras, exporteras eller låsas / författaridentitet, statusetiketter och om granskningsdata lagras i PDF-filen
- vilka anteckningstyper som kan visas, filtreras, besvaras, exporteras eller låsas
- författaridentitet, statusetiketter och om granskningsdata lagras i PDF-filen
- koordinatkonvertering för rotation, zoom, beskärningsrutor och högupplösta skärmar
- skrivskyddat läge för signerade, skyddade eller externt styrda dokument
Implementeringsflöde
Indexera anteckningar innan granskningsåtgärder visas. Ordningen nedan gör arbetsflödet granskbart för Delphi- och C++Builder-team.
- läs in anteckningsmetadata i ett granskningsindex innan sidöverlager ritas
- normalisera sidkoordinater och behåll en stabil referens för varje anteckning
- tillämpa filter efter författare, status, typ, sida och datum utan att tolka om sidorna
- knyt markering i granskningslistan till vyportsnavigering och markeringsbeteende
- exportera granskningssammanfattningar med tillräckligt sammanhang för arbetsflöden utanför visaren
Valideringsbevis
Granskningsunderlag som stödjer samarbete. Behåll dessa fält tillsammans med utdata eller supportunderlaget.
- annotation type, author, page, bounds, status, and reply count
- coordinate transform used for the current zoom, rotation, and crop box
- permission decision when a user attempts to edit a locked or signed document
- exported review summary with stable page references
Coordinates and intent matter
Ett professionellt granskningsgränssnitt behandlar anteckningar som strukturerad data med författare, datum, sidplatser, utseende, svar, status och behörigheter. Canvas-vyn är bara en presentation av den modellen.
Kundsynligt beteende
Användarna ser inte den interna anropsordningen. De ser om filen öppnas, valideras, skrivs ut, redigeras, importeras eller avvisas. Arbetsflödet ska omvandla resultat från granskningsgränssnittet för anteckningar till tillstånd som användarna kan agera på.
- läs in anteckningsmetadata i ett granskningsindex innan sidöverlager ritas
- normalisera sidkoordinater och behåll en stabil referens för varje anteckning
- tillämpa filter efter författare, status, typ, sida och datum utan att tolka om sidorna
- rotated pages can make highlights appear detached from the original text
- popup annotations and replies may be missed when only visible marks are scanned
Tekniska granskningsnoteringar för annotation review UI
Använd dessa granskningsnoteringar för att säkerställa att funktionen har passerat demo-nivån och kan försvaras under leverans, support och kundeskalering.
- Beslut: vilka anteckningstyper som kan visas, filtreras, besvaras, exporteras eller låsas. Implementeringspresspunkt: normalisera sidkoordinater och behåll en stabil referens för varje anteckning. Acceptansbevis: permission decision when a user attempts to edit a locked or signed document. Regressionsutlösare: annotations on cropped pages need coordinates tied to the intended page box
- Beslut: författaridentitet, statusetiketter och om granskningsdata lagras i PDF-filen. Implementeringspresspunkt: tillämpa filter efter författare, status, typ, sida och datum utan att tolka om sidorna. Acceptansbevis: exported review summary with stable page references. Regressionsutlösare: rotated pages can make highlights appear detached from the original text
- Beslut: koordinatkonvertering för rotation, zoom, beskärningsrutor och högupplösta skärmar. Implementeringspresspunkt: knyt markering i granskningslistan till vyportsnavigering och markeringsbeteende. Acceptansbevis: annotation type, author, page, bounds, status, and reply count. Regressionsutlösare: popup annotations and replies may be missed when only visible marks are scanned
- Beslut: skrivskyddat läge för signerade, skyddade eller externt styrda dokument. Implementeringspresspunkt: exportera granskningssammanfattningar med tillräckligt sammanhang för arbetsflöden utanför visaren. Acceptansbevis: coordinate transform used for the current zoom, rotation, and crop box. Regressionsutlösare: read-only review must still allow selection, navigation, filtering, and export
- Beslut: vilka anteckningstyper som kan visas, filtreras, besvaras, exporteras eller låsas. Implementeringspresspunkt: läs in anteckningsmetadata i ett granskningsindex innan sidöverlager ritas. Acceptansbevis: permission decision when a user attempts to edit a locked or signed document. Regressionsutlösare: annotations on cropped pages need coordinates tied to the intended page box
- Beslut: författaridentitet, statusetiketter och om granskningsdata lagras i PDF-filen. Implementeringspresspunkt: normalisera sidkoordinater och behåll en stabil referens för varje anteckning. Acceptansbevis: exported review summary with stable page references. Regressionsutlösare: rotated pages can make highlights appear detached from the original text
- Beslut: koordinatkonvertering för rotation, zoom, beskärningsrutor och högupplösta skärmar. Implementeringspresspunkt: tillämpa filter efter författare, status, typ, sida och datum utan att tolka om sidorna. Acceptansbevis: annotation type, author, page, bounds, status, and reply count. Regressionsutlösare: popup annotations and replies may be missed when only visible marks are scanned
Gränsfall
- rotated pages can make highlights appear detached from the original text
- popup annotations and replies may be missed when only visible marks are scanned
- read-only review must still allow selection, navigation, filtering, and export
- annotations on cropped pages need coordinates tied to the intended page box
Delphi / C++Builder notes
PDFium Component should sit behind a small service boundary that receives files, streams, profiles, and credentials, then returns output paths, warnings, metrics, and validation status. Important terms include annotation, markup, reply, page bounds, rotation, review status.
Delphi-kodexempel
Följande Delphi-skiss visar en praktisk servicegräns för detta ämne. Håll policykontroller, loggning och validering utanför det smala produktanropet så att arbetsflödet går att testa.
procedure TReviewForm.LoadAnnotationQueue(const FileName: string);
var
PageNo: Integer;
begin
PdfView.LoadFromFile(FileName);
FQueue.Clear;
for PageNo := 1 to PdfView.PageCount do
AddPageAnnotationsToQueue(PdfView, PageNo, FQueue);
FQueue.SortByAuthorAndDate;
ShowNextReviewItem;
end;
Produktionschecklista
- Kör arbetsflödet på en tom fil, en normal kundfil och en värstafallfil
- Öppna den genererade PDF-filen med rätt visare, validator, skrivare eller nedströmsapplikation
- Logga produktversion, profilversion, inmatningshash, utdatasökväg, förfluten tid och antal varningar
- Håll lösenord, certifikat, tillfälliga filer och kunddata under tydliga lagringsregler
- Lägg till regressionsdokument när en kundfil avslöjar ett nytt gränsfall
Produktdokumentation
Fler kodexempel
A := Pdf.Annotation[Item.Index];
A.HasColor := True;
A.Color := $0000B0FF; // amber
A.ColorAlpha := 160;
try
Pdf.Annotation[Item.Index] := A;
except
on EPdfError do
begin
// The annotation owns a pre-rendered /AP stream; the dictionary
// color alone cannot change what viewers paint
Item.AppearanceLocked := True;
StatusBar.SimpleText := 'Color is fixed by the annotation appearance';
end;
end;Pdf.PageNumber := Item.PageNo;
Pdf.DeleteAnnotation(Item.Index); // raises EPdfError on failure
Bmp := Pdf.RenderPage(0, 0, ViewWidth, ViewHeight, ro0, [reAnnotations]);
try
PaintPageBitmap(Bmp);
finally
Bmp.Free; // RenderPage hands bitmap ownership to the caller
end;
RebuildPageEntries(Item.PageNo); // indices after Item.Index shifted