Technisch artikel

PDF-lettertype-eigenschappen analyseren met PDFium VCL in Delphi

· PDF-programmeren

Het begrijpen van de lettertypen die in een PDF-document worden gebruikt, is essentieel voor kwaliteitscontrole, naleving van de toegankelijkheidsregels en forensisch onderzoek van documenten. De Lettertype-eigenschappen De demo laat zien hoe u toegang krijgt tot gedetailleerde lettertype-informatie voor tekens in een PDF met behulp van PDFium VCL.

Overzicht

Met deze demo kunt u op elk teken in een PDF klikken en de lettertype-eigenschappen bekijken, inclusief achternaam, gewicht, stijl, grootte en of het lettertype is ingesloten. Het is van onschatbare waarde voor PDF-analyse en probleemoplossing.

Belangrijkste kenmerken

  • Interactieve selectie – Klik op een personage om het te analyseren
  • Lettertype familienaam – De lettertypefamilie (bijvoorbeeld “Arial”, “Times New Roman”)
  • Lettertypebasisnaam – De interne PDF-lettertypenaam
  • Lettertype gewicht – Numeriek gewicht (400 = normaal, 700 = vet)
  • Lettergrootte – Grootte in punten
  • Cursieve hoek – Schuine hoek voor cursieve lettertypen
  • Stijging/afdaling – Verticale statistieken
  • Ingebedde status – Of het lettertype is ingesloten in de PDF
  • Lettertypegegevens – Toegang tot onbewerkte lettertypegegevens, indien ingesloten

PDFium DLL-vereisten

Voordat u een PDFium VCL-toepassing uitvoert, moet u ervoor zorgen dat de PDFium DLL-bestanden zijn geïnstalleerd:

  • pdfium32.dll / pdfium64.dll – Standaardversies (~5-6 MB)
  • pdfium32v8.dll / pdfium64v8.dll – Met V8 JavaScript-engine (~23-27 MB)

Installatie: Loop PDFiumVCL\DLLs\CopyDlls.bat als beheerder om de DLL's automatisch naar Windows-systeemmappen te kopiëren.

Lettertype-eigenschappen openen

Urvanov Syntaxis Markeerstift v2.9.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
procedure TfrmMain.UpdateFontInfo;
var
  FontInfo: TStringList;
begin
  FontInfo := TStringList.Create;
  try
    FontInfo.Add('=== Font Properties for Character Index: ' +
      IntToStr(PdfView.CurrentCharIndex) + ' ===');
    FontInfo.Add('');
    
    // Font family name
    try
      FontInfo.Add('Font Family Name: ' + PdfView.FontFamilyName);
    except
      FontInfo.Add('Font Family Name: \u003cError retrieving\u003e');
    end;
    
    // Font base name (internal PDF name)
    try
      FontInfo.Add('Font Base Name: ' + PdfView.FontBaseName);
    except
      FontInfo.Add('Font Base Name: \u003cError retrieving\u003e');
    end;
    
    // Font size for this character
    try
      FontInfo.Add('Font Size: ' +
        FloatToStr(PdfView.FontSize[PdfView.CurrentCharIndex]));
    except
      FontInfo.Add('Font Size: \u003cError retrieving\u003e');
    end;
    
    // Font weight (400=normal, 700=bold)
    try
      FontInfo.Add('Font Weight: ' + IntToStr(PdfView.FontWeight));
    except
      FontInfo.Add('Font Weight: \u003cError retrieving\u003e');
    end;
    
    // Italic angle (0 for upright, negative for italic)
    try
      FontInfo.Add('Font Italic Angle: ' + IntToStr(PdfView.FontItalicAngle));
    except
      FontInfo.Add('Font Italic Angle: \u003cError retrieving\u003e');
    end;
    
    // Vertical metrics
    try
      FontInfo.Add('Font Ascent: ' + FloatToStr(PdfView.FontAscent));
    except
      FontInfo.Add('Font Ascent: \u003cError retrieving\u003e');
    end;
    
    try
      FontInfo.Add('Font Descent: ' + FloatToStr(PdfView.FontDescent));
    except
      FontInfo.Add('Font Descent: \u003cError retrieving\u003e');
    end;
    
    // Embedded status
    try
      FontInfo.Add('Font Is Embedded: ' +
        BoolToStr(PdfView.FontIsEmbedded, True));
    except
      FontInfo.Add('Font Is Embedded: \u003cError retrieving\u003e');
    end;
    
    // Font data size (if embedded)
    try
      FontInfo.Add('Font Data Size: ' +
        IntToStr(Length(PdfView.FontData)) + ' bytes');
    except
      FontInfo.Add('Font Data Size: \u003cError retrieving\u003e');
    end;
    
    FontInfo.Add('');
    FontInfo.Add('Character: ' +
      PdfView.Character[PdfView.CurrentCharIndex]);
    
    memoFontInfo.Lines.Assign(FontInfo);
    
  finally
    FontInfo.Free;
  end;
end;
[Formaattijd: 0,0013 seconden]

Klik om karakter te analyseren

Urvanov Syntaxis Markeerstift v2.9.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
procedure TfrmMain.PdfViewMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  CharIndex: Integer;
begin
  if not PdfView.Active then
    Exit;
    
  try
    // Get character at click position
    CharIndex := PdfView.CharacterIndexAtPos(X, Y, 10.0, 10.0);
    
    if CharIndex >= 0 then
    begin
      edtCharIndex.Text := IntToStr(CharIndex);
      PdfView.CurrentCharIndex := CharIndex;
      UpdateFontInfo;
    end;
    
  except
    on E: Exception do
    begin
      memoFontInfo.Lines.Clear;
      memoFontInfo.Lines.Add('Error getting character: ' + E.Message);
    end;
  end;
end;
[Formaattijd: 0,0004 seconden]

Handmatige karakterindexinvoer

Urvanov Syntaxis Markeerstift v2.9.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TfrmMain.btnGetFontInfoClick(Sender: TObject);
var
  CharIndex: Integer;
begin
  if not PdfView.Active then
  begin
    ShowMessage('Please open a PDF file first.');
    Exit;
  end;
  
  try
    CharIndex := StrToInt(edtCharIndex.Text);
    PdfView.CurrentCharIndex := CharIndex;
    UpdateFontInfo;
  except
    on E: Exception do
      ShowMessage('Invalid character index: ' + E.Message);
  end;
end;
[Formaattijd: 0,0004 seconden]

Lettertype-eigenschappen beschikbaar

PDFium VCL geeft deze lettertypegerelateerde eigenschappen weer:

Urvanov Syntaxis Markeerstift v2.9.1
1
2
3
4
5
6
7
8
9
10
11
12
13
// Font properties accessible via TPdf and TPdfView
property FontFamilyName: WString;  // e.g., "Arial", "Times New Roman"
property FontBaseName: WString;    // Internal PDF font name
property FontWeight: Integer;      // 100-900, 400=normal, 700=bold
property FontItalicAngle: Integer; // Degrees, 0=upright, negative=italic
property FontAscent: Single;       // Height above baseline
property FontDescent: Single;      // Depth below baseline (negative)
property FontIsEmbedded: Boolean;  // True if font is embedded
property FontData: TBytes;         // Raw font data if embedded
property FontHandle: FPDF_FONT;    // PDFium font handle
 
// Per-character property
property FontSize[Index: Integer]: Double;  // Font size for character
[Formaattijd: 0,0003 seconden]

Lettertype-eigenschappen gebruiken voor analyse

Urvanov Syntaxis Markeerstift v2.9.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
procedure AnalyzeDocumentFonts(Pdf: TPdf);
var
  FontList: TStringList;
  I: Integer;
  FontName: string;
  LastFontName: string;
begin
  FontList := TStringList.Create;
  FontList.Sorted := True;
  FontList.Duplicates := dupIgnore;
  
  try
    Pdf.PageNumber := 1;
    LastFontName := '';
    
    for I := 0 to Pdf.CharacterCount - 1 do
    begin
      // Access font for each character
      // (In practice, use CurrentCharIndex pattern)
      
      // Check FontFamilyName changes
      // Add unique fonts to list
    end;
    
    ShowMessage('Document uses ' + IntToStr(FontList.Count) + ' fonts');
    
  finally
    FontList.Free;
  end;
end;
[Formaattijd: 0,0003 seconden]

Lettertype-insluiting controleren

Urvanov Syntaxis Markeerstift v2.9.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
procedure CheckFontEmbedding(Pdf: TPdf);
var
  EmbeddedFonts, NonEmbeddedFonts: TStringList;
begin
  EmbeddedFonts := TStringList.Create;
  NonEmbeddedFonts := TStringList.Create;
  
  try
    EmbeddedFonts.Sorted := True;
    EmbeddedFonts.Duplicates := dupIgnore;
    NonEmbeddedFonts.Sorted := True;
    NonEmbeddedFonts.Duplicates := dupIgnore;
    
    // Analyze fonts...
    
    if NonEmbeddedFonts.Count > 0 then
    begin
      ShowMessage('Warning: ' + IntToStr(NonEmbeddedFonts.Count) +
        ' fonts are not embedded. Document may not display correctly ' +
        'on systems without these fonts installed.');
    end
    else
    begin
      ShowMessage('All fonts are embedded. Document will display ' +
        'consistently on all systems.');
    end;
    
  finally
    EmbeddedFonts.Free;
    NonEmbeddedFonts.Free;
  end;
end;
[Formaattijd: 0,0003 seconden]

Ingebedde lettertypegegevens extraheren

Urvanov Syntaxis Markeerstift v2.9.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure ExtractEmbeddedFont(Pdf: TPdf; const OutputFile: string);
var
  FontData: TBytes;
  FileStream: TFileStream;
begin
  if Pdf.FontIsEmbedded then
  begin
    FontData := Pdf.FontData;
    
    if Length(FontData) > 0 then
    begin
      FileStream := TFileStream.Create(OutputFile, fmCreate);
      try
        FileStream.WriteBuffer(FontData[0], Length(FontData));
        ShowMessage('Font extracted: ' + IntToStr(Length(FontData)) + ' bytes');
      finally
        FileStream.Free;
      end;
    end;
  end
  else
    ShowMessage('Font is not embedded in the document.');
end;
[Formaattijd: 0,0003 seconden]

Waarden voor lettertypegewicht begrijpen

Weight Value Common Name
100 Thin
200 Extra Light
300 Light
400 Normal/Regular
500 Medium
600 Semi Bold
700 Bold
800 Extra Bold
900 Black

Gebruiksscenario's

  • Kwaliteitscontrole – Controleer of de juiste lettertypen in documenten worden gebruikt
  • Toegankelijkheid – Controleer of lettertypen voldoen aan de toegankelijkheidsvereisten
  • Forensische analyse – Analyseer de oorsprong en wijzigingen van documenten
  • Preflight afdrukken – Controleer de insluiting van lettertypen vóór productie
  • Lettertype-inventaris – Cataloguslettertypen die in documenten worden gebruikt

Conclusie

De demo Lettertype-eigenschappen laat zien hoe PDFium VCL diepgaande toegang biedt tot lettertype-informatie in PDF-documenten. Of u nu de insluiting van lettertypen voor printproductie controleert of documenttypografie analyseert, deze APIs bieden u de tools die u nodig heeft.

De mogelijkheid om op elk teken te klikken en direct de lettertype-eigenschappen te zien, maakt de PDF-analyse intuïtief en efficiënt.

Ontdek PDF-lettertypen diepgaand mee PDFium Delphi VCL-onderdeel.