html Analizowanie właściwości czcionki PDF za pomocą PDFium VCL w Delphi | losLab Software Development Blog

Artykuł techniczny

Analizowanie właściwości czcionki PDF za pomocą PDFium VCL w Delphi

· Programowanie PDF

Zrozumienie czcionek używanych w dokumencie PDF jest niezbędne do kontroli jakości, zgodności z dostępnością i analizy dokumentów. The Właściwości czcionki pokazuje, jak uzyskać dostęp do szczegółowych informacji o czcionce dla znaków w PDF przy użyciu PDFium VCL.

Przegląd

To demo umożliwia kliknięcie dowolnego znaku w PDF i wyświetlenie właściwości jego czcionki, w tym nazwy rodziny, grubości, stylu, rozmiaru i tego, czy czcionka jest osadzona. Jest nieoceniony przy analizie PDF i rozwiązywaniu problemów.

Kluczowe funkcje

  • Interaktywny wybór – Kliknij dowolny znak, aby go przeanalizować
  • Nazwa rodziny czcionek – Rodzina czcionek (e.g., „Arial”, „Times New Roman”)
  • Nazwa podstawowa czcionki – Wewnętrzna nazwa czcionki PDF
  • Grubość czcionki – Waga numeryczna (400 = normalna, 700 = pogrubiona)
  • Rozmiar czcionki – Rozmiar w punktach
  • Kąt kursywy – Kąt nachylenia dla czcionek kursywy
  • Wznoszenie/Zejście – Metryki pionowe
  • Stan osadzania – Czy czcionka jest osadzona w PDF
  • Dane czcionki – Dostęp do surowych danych czcionek, jeśli są osadzone

PDFium Wymagania DLL

Przed uruchomieniem jakiejkolwiek aplikacji PDFium VCL upewnij się, że są zainstalowane pliki DLL PDFium:

  • pdfium32.dll / pdfium64.dll – Wersje standardowe (~5-6 MB)
  • pdfium32v8.dll / pdfium64v8.dll – Z silnikiem V8 JavaScript (~23-27 MB)

Instalacja: Uruchom PDFiumVCL\DLLs\CopyDlls.bat jako Administrator, aby automatycznie kopiować biblioteki DLL do katalogów systemu Windows.

Dostęp do właściwości czcionki

Zakreślacz składni Urvanov 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;
[Czas formatowania: 0,0013 sekundy]

Kliknij, aby przeanalizować znak

Zakreślacz składni Urvanov 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;
[Czas formatowania: 0,0004 sekundy]

Ręczne wprowadzanie indeksu znaków

Zakreślacz składni Urvanov 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;
[Czas formatowania: 0,0004 sekundy]

Dostępne właściwości czcionki

PDFium VCL udostępnia następujące właściwości związane z czcionkami:

Zakreślacz składni Urvanov 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
[Czas formatowania: 0,0003 sekundy]

Używanie właściwości czcionki do analizy

Zakreślacz składni Urvanov 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;
[Czas formatowania: 0,0003 sekundy]

Sprawdzanie osadzania czcionek

Zakreślacz składni Urvanov 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;
[Czas formatowania: 0,0003 sekundy]

Wyodrębnianie danych osadzonych czcionek

Zakreślacz składni Urvanov 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;
[Czas formatowania: 0,0003 sekundy]

Zrozumienie wartości grubości czcionki

Wartość masy Nazwa zwyczajowa
100 Cienki
200 Dodatkowe światło
300 Światło
400 Normalny/Regularny
500 Średni
600 Półpogrubione
700 Pogrubienie
800 Bardzo pogrubiony
900 Czarny

Przypadki użycia

  • Kontrola jakości – Sprawdź, czy w dokumentach użyto prawidłowych czcionek
  • Dostępność – Sprawdź, czy czcionki spełniają wymagania dostępności
  • Analiza kryminalistyczna – Analizuj pochodzenie i modyfikacje dokumentów
  • Drukuj inspekcję wstępną – Przed rozpoczęciem produkcji sprawdź osadzenie czcionek
  • Spis czcionek – Czcionki katalogowe używane w dokumentach

Wniosek

Demo Właściwości czcionki pokazuje, jak PDFium VCL zapewnia głęboki dostęp do informacji o czcionkach w dokumentach PDF. Niezależnie od tego, czy sprawdzasz osadzanie czcionek na potrzeby druku, czy analizujesz typografię dokumentu, te interfejsy API zapewniają potrzebne narzędzia.

Możliwość kliknięcia dowolnego znaku i natychmiastowego sprawdzenia jego właściwości czcionki sprawia, że analiza PDF jest intuicyjna i wydajna.

Poznaj czcionki PDF dogłębnie PDFium Delphi VCL Komponent.