Понимание используемых шрифтов в документе PDF необходимо для контроля качества, соответствия требованиям доступности и криминалистического анализа документов. Свойства шрифта Демонстрация показывает, как получить доступ к подробной информации о шрифтах для символов в PDF-документе с использованием PDFium VCL.
Обзор
Эта демонстрация позволяет вам щелкнуть любой символ в PDF-документе и просмотреть его свойства шрифта, включая семейное имя, вес, стиль, размер и то, встроен ли шрифт. Это бесценно для анализа и устранения неполадок PDF-документов.
Основные функции
- Интерактивный выбор – Щелкните любой символ для его анализа.
- Семейное имя шрифта – Семейство шрифтов (например, "Arial", "Times New Roman").
- Базовое имя шрифта. Внутреннее имя шрифта в формате PDF.
- Толщина шрифта. Числовое значение толщины (400 = нормальный, 700 = полужирный).
- Размер шрифта. Размер в пунктах.
- Угол наклона. Угол наклона для шрифтов курсивом.
- Ascent/Descent – Вертикальные метрики
- Embedded Status – Указывает, встроена ли шрифтовая информация в PDF-файл
- Font Data – Получить доступ к необработанным данным шрифта, если они встроены
Требования к библиотеке PDFium DLL
Перед запуском любого приложения PDFium VCL, убедитесь, что файлы PDFium DLL установлены:
pdfium32.dll/pdfium64.dll– Стандартные версии (около 5-6 МБ)pdfium32v8.dll/pdfium64v8.dll– С JavaScript-движком V8 (около 23-27 МБ)
Установка: Запуск PDFiumVCL\DLLs\CopyDlls.bat от имени администратора для автоматической копии DLL-файлов в системные каталоги Windows.
Accessing Font Properties
|
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; |
Нажмите для анализа символа
|
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; |
Ручной ввод индекса символов.
|
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; |
Доступны свойства шрифта.
PDFium VCL предоставляет следующие свойства, связанные со шрифтами:
|
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 |
Использование свойств шрифта для анализа.
|
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; |
Проверка внедрения шрифтов.
|
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; |
Извлечение данных внедренных шрифтов.
|
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; |
Понимание значений толщины шрифта.
| 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 |
Примеры использования.
- Контроль качества. – Убедитесь, что в документах используются правильные шрифты.
- Доступность – Проверка соответствия шрифтов требованиям доступности
- Судебная экспертиза – Анализ происхождения и изменений документов
- Предварительная проверка для печати – Проверка внедрения шрифтов перед печатью
- Инвентаризация шрифтов – Каталог шрифтов, используемых в документах
Заключение.
Демонстрация свойств шрифтов показывает, как PDFium VCL обеспечивает глубокий доступ к информации о шрифтах в PDF-документах. Независимо от того, проверяете ли вы внедрение шрифтов для печатной продукции или анализируете типографику документа, эти API предоставляют вам необходимые инструменты.
Возможность щелкнуть на любом символе и мгновенно увидеть его свойства шрифта делает анализ PDF-документов интуитивно понятным и эффективным.
Исследуйте шрифты PDF более подробно с помощью компонента PDFium Delphi VCL..