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

Масштабирование страниц PDF на 70 % с помощью библиотеки losLab PDF в Delphi, C# и VB.Net

Уменьшите масштаб страниц PDF на 70% с помощью библиотеки losLab для работы с PDF.

При работе с PDF-файлами часто возникает необходимость масштабировать содержимое для различных целей. В данном сценарии мы хотим уменьшить размер всех страниц внутри PDF-файла на 70%. Это руководство описывает необходимые шаги, отвечает на соответствующие вопросы и предлагает решения.

Описание проблемы.

Нам необходимо уменьшить масштаб каждой страницы PDF-документа на 70%, сохраняя при этом исходный порядок страниц. Для этого требуется:

  1. Загрузка PDF-файла.
  2. Получение и масштабирование каждой страницы.
  3. Сохранение масштабированных страниц в новый PDF-файл.

Шаги для достижения цели.

  1. Инициализация среды:
    • Загрузите исходный PDF-файл.
    • Удалите любой ранее созданный выходной файл, чтобы избежать конфликтов.
  2. Настройка параметров масштабирования:
    • Определите коэффициент масштабирования (70%).
    • Рассчитайте границы, необходимые для центрирования масштабированного содержимого.
  3. Обработка каждой страницы в цикле:
    • Выберите первую страницу.
    • Получите содержимое страницы.
    • Создайте новую страницу с исходными размерами.
    • Нарисуйте масштабированный, обрезанный контент на новой странице.
    • Повторите для всех страниц.
  4. Сохраните новый PDF-файл и откройте его:
    • Сохраните измененные страницы в новый PDF-файл.
    • Автоматически откройте новый PDF-файл для просмотра результатов.

Реализация кода

Вот код на C#, который выполняет вышеуказанные шаги:

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
private void button_Click(object sender, EventArgs e)
{
    // Delete the old file if it exists to avoid any conflicts.
    File.Delete("newpages.pdf");
 
    // Define variables for page dimensions and scaling factors.
    double pageWidth, pageHeight, horizBorder, vertBorder;
    double scaleFactor = 0.70; // 70% scaling reduction.
    int capturedPageId;
    int ret;
 
    // Load the original PDF document.
    PDFL.LoadFromFile("Pages.pdf");
    PDFL.SetOrigin(1);
 
    // Get the total number of pages in the document.
    int numPages = PDFL.PageCount();
 
    // Loop through all pages to process each one.
    for (int i = 1; i <= numPages; i++)
    {
        // Always select the first page as the pages get deleted after capture.
        PDFL.SelectPage(1);
 
        // Retrieve the dimensions of the current page.
        pageWidth = PDFL.PageWidth();
        pageHeight = PDFL.PageHeight();
 
        // Calculate the borders to center the scaled page content.
        horizBorder = pageWidth * (1.0 - scaleFactor) / 2;
        vertBorder = pageHeight * (1.0 - scaleFactor) / 2;
 
        // Capture the content of the first page. This action deletes the page from the document.
        capturedPageId = PDFL.CapturePage(1);
 
        // Create a new page with the original dimensions.
        int pageId = PDFL.NewPage();
        PDFL.SetPageDimensions(pageWidth, pageHeight);
 
        // Draw the captured page content onto the new page with the specified scaling.
        ret = PDFL.DrawCapturedPage(capturedPageId, horizBorder, vertBorder, pageWidth - 2 * horizBorder, pageHeight - 2 * vertBorder);
    }
 
    // Save the modified document as a new PDF file.
    PDFL.SaveToFile("newpages.pdf");
 
    // Open the newly created PDF file for review.
    System.Diagnostics.Process.Start(@"newpages.pdf");

Объяснение и обоснование:
  • Удаление файлов: Обеспечивает очистку любых предыдущих результатов, чтобы предотвратить ошибки или устаревшую информацию.
  • Коэффициент масштабирования: Установите значение 0.70, чтобы уменьшить размер содержимого до 70% от исходного.
  • Расчет границ: Центрирует масштабированное содержимое в пределах исходных размеров страницы.
  • Цикл обработки страниц: Перебирает все страницы, захватывая, масштабируя и отображая каждую из них последовательно.
  • Сохранение и открытие файлов: Завершает создание нового документа и открывает его для пользователя, чтобы он мог проверить внесенные изменения.

Следуя этому структурированному подходу, мы обеспечиваем, чтобы каждая страница в PDF файле была масштабирована последовательно и сохраняла свой первоначальный порядок, что приводит к профессионально обработанному документу.

Версия для Delphi:

Используйте Delphi для масштабирования страниц PDF на 70%:

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
procedure TForm1.ButtonClick(Sender: TObject);
var
  pageWidth, pageHeight, horizBorder, vertBorder: Double;
  scaleFactor: Double;
  capturedPageId, ret: Integer;
  numPages, pageId, i: Integer;
begin
  // Delete the old file if it exists to avoid any conflicts.
  if FileExists('newpages.pdf') then
    DeleteFile('newpages.pdf');
 
  // Define the scaling factor (70%).
  scaleFactor := 0.70; // 70% scaling reduction.
 
  // Load the original PDF document.
  PDFL.LoadFromFile('Pages.pdf');
  PDFL.SetOrigin(1);
 
  // Get the total number of pages in the document.
  numPages := PDFL.PageCount();
 
  // Loop through all pages to process each one.
  for i := 1 to numPages do
  begin
    // Always select the first page as the pages get deleted after capture.
    PDFL.SelectPage(1);
 
    // Retrieve the dimensions of the current page.
    pageWidth := PDFL.PageWidth();
    pageHeight := PDFL.PageHeight();
 
    // Calculate the borders to center the scaled page content.
    horizBorder := pageWidth * (1.0 - scaleFactor) / 2;
    vertBorder := pageHeight * (1.0 - scaleFactor) / 2;
 
    // Capture the content of the first page. This action deletes the page from the document.
    capturedPageId := PDFL.CapturePage(1);
 
    // Create a new page with the original dimensions.
    pageId := PDFL.NewPage();
    PDFL.SetPageDimensions(pageWidth, pageHeight);
 
    // Draw the captured page content onto the new page with the specified scaling.
    ret := PDFL.DrawCapturedPage(capturedPageId, horizBorder, vertBorder, pageWidth - 2 * horizBorder, pageHeight - 2 * vertBorder);
  end;
 
  // Save the modified document as a new PDF file.
  PDFL.SaveToFile('newpages.pdf');
 
  // Open the newly created PDF file for review.
  ShellExecute(0, 'open', 'newpages.pdf', nil, nil, SW_SHOWNORMAL);
end;

Версия для VB.Net:

Вот код на VB.Net для выполнения этой задачи:

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
Private Sub button_Click(sender As Object, e As EventArgs) Handles button.Click
    ' Delete the old file if it exists to avoid any conflicts.
    If File.Exists("newpages.pdf") Then
        File.Delete("newpages.pdf")
    End If
 
    ' Define variables for page dimensions and scaling factors.
    Dim pageWidth, pageHeight, horizBorder, vertBorder As Double
    Dim scaleFactor As Double = 0.70 ' 70% scaling reduction.
    Dim capturedPageId, ret As Integer
 
    ' Load the original PDF document.
    PDFL.LoadFromFile("Pages.pdf")
    PDFL.SetOrigin(1)
 
    ' Get the total number of pages in the document.
    Dim numPages As Integer = PDFL.PageCount()
 
    ' Loop through all pages to process each one.
    For i As Integer = 1 To numPages
        ' Always select the first page as the pages get deleted after capture.
        PDFL.SelectPage(1)
 
        ' Retrieve the dimensions of the current page.
        pageWidth = PDFL.PageWidth()
        pageHeight = PDFL.PageHeight()
 
        ' Calculate the borders to center the scaled page content.
        horizBorder = pageWidth * (1.0 - scaleFactor) / 2
        vertBorder = pageHeight * (1.0 - scaleFactor) / 2
 
        ' Capture the content of the first page. This action deletes the page from the document.
        capturedPageId = PDFL.CapturePage(1)
 
        ' Create a new page with the original dimensions.
        Dim pageId As Integer = PDFL.NewPage()
        PDFL.SetPageDimensions(pageWidth, pageHeight)
 
        ' Draw the captured page content onto the new page with the specified scaling.
        ret = PDFL.DrawCapturedPage(capturedPageId, horizBorder, vertBorder, pageWidth - 2 * horizBorder, pageHeight - 2 * vertBorder)
    Next
 
    ' Save the modified document as a new PDF file.
    PDFL.SaveToFile("newpages.pdf")
 
    ' Open the newly created PDF file for review.
    Process.Start("newpages.pdf")
End Sub

Обе версии кода, для VB.Net и Delphi, достигают того же результата, что и исходный код на C#, обеспечивая масштабирование каждой страницы в PDF файле на 70%, при этом сохраняя первоначальный порядок.