Техническая статья

Создание PDF-документов с нуля с помощью PDFium VCL в Delphi

Хотя PDFium в основном известен возможностями просмотра и обработки PDF-файлов, PDFium VCL также предоставляет мощные возможности для создания PDF-файлов. Создание PDF Демонстрация показывает, как программно создавать PDF-документы с текстом, фигурами, таблицами и водяными знаками.

Обзор

Эта демонстрация создает новый PDF-документ с различными элементами, включая форматированный текст, геометрические фигуры, простую таблицу и диагональный водяной знак. Она демонстрирует основные API для создания PDF-файлов, доступные в PDFium VCL.

Основные функции

  • Создание новых документов – Создание PDF-файлов с нуля
  • Добавление текста – Вставка форматированного текста с использованием пользовательских шрифтов, размеров и цветов.
  • Рисование фигур. – Создание прямоугольников, путей и других геометрических фигур.
  • Создание таблиц. – Создание простых текстовых таблиц.
  • Добавление водяных знаков. – Вставка повернутого, полупрозрачного текста.

Требования к библиотеке 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.

Создание нового PDF-документа.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure CreateNewPdf;
var
  Pdf: TPdf;
begin
  Pdf := TPdf.Create(nil);
  try
    // Create empty document
    Pdf.CreateDocument;
    Pdf.Active := True;
    
    // Add first page (A4 size: 595 x 842 points)
    Pdf.AddPage(1, 595, 842);
    Pdf.PageNumber := 1;
    
    // Add content here...
    
    // Save the document
    Pdf.SaveAs('output.pdf');
    
  finally
    Pdf.Active := False;
    Pdf.Free;
  end;
end;

Добавление текста.

The AddText Метод добавляет стилизованный текст на текущую страницу:

1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TPdf.AddText(
  const Text, Font: WString;   // Text content and font name
  FontSize: Single;            // Font size in points
  X, Y: Double;                // Position (from bottom-left)
  Color: TColor = clBlack;     // Text color
  Alpha: Byte = $FF;           // Transparency (0-255)
  Angle: Double = 0.0          // Rotation angle in degrees
);
 
// Examples
Pdf.AddText('Hello World', 'Arial', 24, 50, 750, clBlack, $FF, 0.0);
Pdf.AddText('Subtitle', 'Times New Roman', 14, 50, 720, clGray, $FF, 0.0);
Pdf.AddText('Rotated Text', 'Arial', 18, 300, 400, clRed, $80, 45.0);

Полный пример создания PDF-документа

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
procedure TFormMain.CreateSimplePDF;
begin
  Pdf.CreateDocument;
  Pdf.Active := True;
  try
    // Add A4 page
    Pdf.AddPage(0, 595, 842);
    
    // Title
    Pdf.AddText(EditTitle.Text, 'Arial', 18, 50, 750, clBlack, $FF, 0.0);
    
    // Author line
    Pdf.AddText('By: ' + EditAuthor.Text, 'Arial', 12, 50, 720, clGray, $FF, 0.0);
    
    // Body text
    Pdf.AddText('This is a simple PDF document created with PDFium VCL.',
      'Arial', 12, 50, 680, clBlack, $FF, 0.0);
    Pdf.AddText('You can add various elements to your PDF:',
      'Arial', 12, 50, 650, clBlack, $FF, 0.0);
      
    // Optional features
    if CheckShapes.Checked then
      AddShapes;
      
    if CheckTable.Checked then
      AddTable;
      
    if CheckWatermark.Checked then
      AddWatermark;
      
    // Save
    Pdf.SaveAs('Sample.pdf');
    
  finally
    Pdf.Active := False;
  end;
end;

Рисование фигур с помощью CreatePath

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Create a path starting at (X, Y)
procedure TPdf.CreatePath(
  X, Y: Single;                           // Starting point
  FillMode: TPdfFillMode = fmNone;        // None, Alternate, or Winding
  FillColor: TColor = clBlack;            // Fill color
  FillAlpha: Byte = $FF;                  // Fill transparency
  Stroke: Boolean = True;                 // Draw outline
  StrokeColor: TColor = clBlack;          // Outline color
  StrokeAlpha: Byte = $FF;                // Outline transparency
  StrokeWidth: Single = 1.0;              // Line width
  LineCap: TPdfLineCap = lcDefault;       // Line end style
  LineJoin: TPdfLineJoin = ljDefault;     // Line join style
  BlendMode: TPdfBlendMode = bmDefault    // Color blending
);
 
// Create a rectangle path
procedure TPdf.CreatePath(
  X, Y, Width, Height: Single;            // Rectangle bounds
  // Same optional parameters as above...
);

Примеры рисования фигур

1
2
3
4
5
6
7
8
9
10
11
12
procedure TFormMain.AddShapes;
begin
  // Filled rectangle with blue color at 50% opacity
  Pdf.CreatePath(100, 550, 150, 80, fmWinding, $FFCCAA, $80);
  Pdf.AddPath;
  Pdf.AddText('Rectangle', 'Arial', 10, 120, 580, clBlack, $FF, 0.0);
  
  // Another filled shape (green)
  Pdf.CreatePath(350, 590, 80, 80, fmWinding, $CCFFCC, $80);
  Pdf.AddPath;
  Pdf.AddText('Shape', 'Arial', 10, 370, 580, clBlack, $FF, 0.0);
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
procedure DrawTriangle(Pdf: TPdf);
begin
  // Start path at first vertex
  Pdf.CreatePath(200, 300, fmWinding, clBlue, $80, True, clNavy, $FF, 2.0);
  
  // Draw lines to other vertices
  Pdf.LineTo(300, 300);
  Pdf.LineTo(250, 400);
  
  // Close the path
  Pdf.ClosePath;
  
  // Add to page
  Pdf.AddPath;
end;
 
procedure DrawCurve(Pdf: TPdf);
begin
  Pdf.CreatePath(100, 200, fmNone, clBlack, $FF, True, clRed, $FF, 2.0);
  Pdf.MoveTo(100, 200);
  
  // Bezier curve with control points
  Pdf.BezierTo(
    150, 250,   // Control point 1
    200, 250,   // Control point 2
    250, 200    // End point
  );
  
  Pdf.AddPath;
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
procedure TFormMain.AddTable;
var
  X, Y: Double;
  I: Integer;
begin
  X := 100;
  Y := 450;
  
  // Table header
  Pdf.AddText('Item', 'Arial', 10, X, Y, clBlack, $FF, 0.0);
  Pdf.AddText('Quantity', 'Arial', 10, X + 100, Y, clBlack, $FF, 0.0);
  Pdf.AddText('Price', 'Arial', 10, X + 200, Y, clBlack, $FF, 0.0);
  
  // Draw header underline
  Pdf.CreatePath(X, Y - 5, 250, 0.5, fmNone, clBlack, $FF,
    True, clBlack, $FF, 1.0);
  Pdf.AddPath;
  
  // Table rows
  for I := 1 to 3 do
  begin
    Y := Y - 20;
    Pdf.AddText('Item ' + IntToStr(I), 'Arial', 9, X, Y, clBlack, $FF, 0.0);
    Pdf.AddText(IntToStr(I), 'Arial', 9, X + 100, Y, clBlack, $FF, 0.0);
    Pdf.AddText('$' + IntToStr(I * 10) + '.00', 'Arial', 9,
      X + 200, Y, clBlack, $FF, 0.0);
  end;
end;

Добавление водяных знаков

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TFormMain.AddWatermark;
begin
  // Large, semi-transparent, rotated text
  Pdf.AddText('SAMPLE', 'Arial', 72, 200, 200, clGray, $30, 45.0);
end;
 
// More sophisticated watermark
procedure AddDiagonalWatermark(Pdf: TPdf; const Text: string);
begin
  // Center of A4 page
  Pdf.AddText(Text, 'Arial', 60,
    595 / 2 - 100,  // X centered
    842 / 2,        // Y centered
    $CCCCCC,        // Light gray
    $40,            // 25% opacity
    45.0            // 45 degree rotation
  );
end;

Добавление изображений

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure AddImageToPdf(Pdf: TPdf; const ImageFile: string);
var
  Picture: TPicture;
begin
  Picture := TPicture.Create;
  try
    Picture.LoadFromFile(ImageFile);
    
    // Add at position with automatic sizing
    Pdf.AddPicture(Picture, 50, 400);
    
    // Or with specific dimensions
    Pdf.AddPicture(Picture, 50, 400, 200, 150);
    
  finally
    Picture.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
procedure CreateMultiPagePdf;
var
  Pdf: TPdf;
  I: Integer;
begin
  Pdf := TPdf.Create(nil);
  try
    Pdf.CreateDocument;
    Pdf.Active := True;
    
    for I := 1 to 5 do
    begin
      // Add page
      Pdf.AddPage(I, 595, 842);
      Pdf.PageNumber := I;
      
      // Add content
      Pdf.AddText('Page ' + IntToStr(I), 'Arial', 24,
        250, 400, clBlack, $FF, 0.0);
    end;
    
    Pdf.SaveAs('multipage.pdf');
    
  finally
    Pdf.Active := False;
    Pdf.Free;
  end;
end;

Размеры страниц.

Format Width (pts) Height (pts)
A4 Portrait 595 842
A4 Landscape 842 595
Letter Portrait 612 792
Letter Landscape 792 612
Legal Portrait 612 1008

Примеры использования.

  • Генерация отчетов. – Создание отформатированных отчетов из данных.
  • Создание счетов. – Генерация счетов и квитанций.
  • Генерация сертификатов. – Создание сертификатов с использованием шаблонов.
  • Шаблоны документов – Заполняйте шаблоны динамическим содержимым

Заключение.

Демонстрация создания PDF показывает, что PDFium VCL – это не просто инструмент для просмотра, а полноценный набор инструментов для работы с PDF. Благодаря поддержке текста, фигур, изображений и многостраничных документов, вы можете создавать профессиональные PDF-файлы полностью программным путем.

В сочетании с возможностями просмотра и манипулирования компонентом, PDFium VCL предоставляет все необходимое для комплексной работы с PDF в приложениях Delphi.

Изучите создание PDF с Компонент PDFium VCL и добавьте динамическую генерацию документов в ваши приложения.