Эта страница может содержать автоматически переведенный текст.

Сжатие PDF-документов в C# и VB.NET

Во многих случаях PDF-документы часто хотят сжать и оптимизировать. Меньшие PDF-документы проще передавать по сети и дешевле хранить. Уменьшение размера PDF-файла особенно важно для архивирования.

Оптимизация PDF-документов в C# и VB.NET

Библиотека .NET для оптимизации PDF-документов

Используйте Docotic.Pdf library для сжатия PDF-документов в приложениях .NET Framework и .NET Core. Библиотека доступна на NuGet и на нашем сайте. Получите библиотеку и бесплатный временный лицензионный ключ на странице Скачать C# .NET библиотеку PDF.

Docotic.Pdf предоставляет разные способы оптимизации:

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

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

Рассмотрим эти методы сжатия подробнее.

Оптимизация объектов PDF

Внутри PDF-файл представляет собой набор низкоуровневых объектов PDF: словарей, потоков, массивов и других. При сохранении PDF-файла Docotic.Pdf по умолчанию применяет следующие оптимизации без потерь:

  • сжимает потоки PDF с помощью кодирования Flate
  • удаляет неиспользуемые объекты PDF
  • встраивает косвенные объекты PDF
  • записывает объекты PDF без форматирования
  • упаковывает объекты PDF в сжатые потоки объектов

В этом примере показано, как оптимизировать объекты PDF в C#:

using BitMiracle.Docotic.Pdf;

using var pdf = new PdfDocument("input.pdf");
var saveOptions = new PdfSaveOptions();

// Эти параметры включены по умолчанию и применяются неявно:
//saveOptions.Compression = PdfCompression.Flate;
//saveOptions.RemoveUnusedObjects = true;
//saveOptions.OptimizeIndirectObjects = true;
//saveOptions.UseObjectStreams = true;
//saveOptions.WriteWithoutFormatting = true;

pdf.Save("compressed.pdf", saveOptions);

Все эти оптимизации не влияют на видимое содержимое PDF-документа (текст, изображения, закладки и все остальное). Они влияют только на то, как объекты PDF записываются и сжимаются в выходном PDF-файле.

Удаление неиспользуемых объектов PDF важно для других методов, рассмотренных ниже. Не задавайте свойству PdfSaveOptions.RemoveUnusedObjects значение false, если у вас нет веских причин сохранять неиспользуемые объекты.

Удаление дубликатов объектов в PDF-документах

При объединении PDF-документов созданный PDF-файл часто содержит дубликаты шрифтов и изображений. Замена дублирующихся объектов помогает уменьшить размер итогового PDF-файла. Вот пример этого действия в C#:

using var pdf = new PdfDocument("merged.pdf");
pdf.ReplaceDuplicateObjects();

pdf.Save("compressed.pdf");

Рекомендуется удалять дубликаты объектов перед сжатием изображений или отменой встраивания шрифтов. Иначе для оптимизации копий одних и тех же изображений или шрифтов потребуется выполнить много лишней работы.

Метод PdfDocument.ReplaceDuplicateObjects не заменяет встроенные изображения. Если документ содержит встроенные изображения, сначала используйте метод PdfCanvas.MoveInlineImagesToResources. Этот метод преобразует встроенные изображения в обычные, после чего метод ReplaceDuplicateObjects сможет также устранить дубликаты преобразованных изображений.

Сжатие изображений в PDF

Оптимизация изображений PDF обычно является наиболее эффективным методом сжатия для документов с растровыми изображениями.

Библиотека Docotic.Pdf предоставляет встроенные методы для повторного сжатия изображений PDF с использованием алгоритмов JPEG, CCITT Group 3 и 4 (fax), JPEG 2000 и zip/deflate. Вы также можете изменить размер изображений или уменьшить их масштаб, чтобы еще сильнее сократить размер PDF-файла. Либо можете оптимизировать изображения самостоятельно с помощью стороннего инструмента, а затем заменить изображения.

Посмотрите пример Оптимизация изображений в PDF-документе в C# и VB.NET на GitHub.

Создание подмножеств шрифтов

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

В этом примере показано, как оптимизировать шрифты PDF в C#:

using var pdf = new PdfDocument("text.pdf");
pdf.RemoveUnusedFontGlyphs();

pdf.Save("compressed.pdf");

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

Удаление метаданных

PDF-документы могут содержать несжатые метаданные XMP с информацией об авторе, ключевых словах, времени создания и так далее. Метаданные не влияют на видимое содержимое PDF-документа.

В этом примере показано, как удалить метаданные из PDF-файла в C#:

using var pdf = new PdfDocument("metadata.pdf");

XmpMetadata xmp = pdf.Metadata;
xmp.Unembed();
pdf.Info.Clear(false);

pdf.Save("compressed.pdf");

Удаление информации о структуре

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

  • создавать Tagged PDF-документы
  • делать PDF-документ доступным для вспомогательных устройств

Удаление такой информации помогает уменьшить размер PDF-файла. Но PDF больше не будет Tagged и не будет доступен для вспомогательных устройств. В этом примере показано, как удалить информацию о структуре из PDF в C#:

using var pdf = new PdfDocument("tagged.pdf");
pdf.RemoveStructureInformation();

pdf.Save("compressed.pdf");

Удаление неиспользуемых ресурсов из PDF

Страницы PDF и XObject могут ссылаться на большее количество шрифтов, изображений или шаблонов, чем они используют. Вы можете использовать метод PdfDocument.RemoveUnusedResources, чтобы удалить неиспользуемые ресурсы из PDF. Вот пример на C#:

using var pdf = new PdfDocument("input.pdf");
pdf.RemoveUnusedResources();

pdf.Save("compressed.pdf");

Удаление частных данных приложения из PDF

PDF-документы, созданные ПО Adobe, могут содержать частные данные приложения. Такие данные приложения хранятся в словарях page-piece.

В этом примере показано, как очистить и сжать PDF в C#, удалив словари page-piece:

using var pdf = new PdfDocument("input.pdf");
pdf.RemovePieceInfo();

pdf.Save("compressed.pdf");

Сведение полей форм и аннотаций в PDF

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

using var pdf = new PdfDocument("form.pdf");
pdf.FlattenControls();

pdf.Save("compressed.pdf");

Кроме того, вы можете свести все аннотации и элементы управления с помощью метода PdfDocument.FlattenWidgets.

Также метод PdfWidget.Flatten позволяет сводить отдельные аннотации или элементы управления.

Отмена встраивания шрифтов

Встраивание шрифтов PDF имеет полный смысл для пользовательских или редких шрифтов. В то же время широко доступные шрифты, такие как Arial или Verdana, могут без веской причины увеличивать размер PDF-файла. Вы можете отменить встраивание популярных шрифтов, доступных на целевых платформах. Пример кода C#:

using var pdf = new PdfDocument("input.pdf");
UnembedFonts(pdf);
pdf.Save("compressed.pdf");

/// <summary>
/// Этот метод отменяет встраивание любого шрифта, который:
/// * установлен в ОС
/// * или имя которого включено в список "always unembed"
/// * и имя которого не включено в список "always keep".
/// </summary>
private static void UnembedFonts(PdfDocument pdf)
{
    string[] alwaysUnembedList = ["MyriadPro-Regular"];
    string[] alwaysKeepList = ["ImportantFontName", "AnotherImportantFontName"];

    using var ms = new MemoryStream();

    foreach (PdfFont font in pdf.GetFonts())
    {
        if (!font.Embedded ||
            font.EncodingName == "Built-In" ||
            Array.Exists(alwaysKeepList, name => font.Name == name))
        {
            continue;
        }

        if (font.Format == PdfFontFormat.TrueType || font.Format == PdfFontFormat.CidType2)
        {
            SystemFontLoader loader = SystemFontLoader.Instance;

            ms.Position = 0;
            if (loader.TryLoad(font.Name, font.Bold, font.Italic, ms))
            {
                font.Unembed();
                continue;
            }
        }

        if (Array.Exists(alwaysUnembedList, name => font.Name == name))
            font.Unembed();
    }
}

Не используйте этот метод для PDF/A-документов. PDF/A-документ должен встраивать все шрифты.

Всегда проверяйте PDF-документы с невстроенными шрифтами в целевых операционных системах (Windows, Linux, macOS, iOS, Android) и PDF-просмотрщиках (Adobe, Foxit и т. д.).

Другие способы уменьшить размер PDF

Выше перечислено много методов оптимизации. Однако вы можете сжать PDF-документы еще сильнее, удалив неважное содержимое. Docotic.Pdf позволяет удалять из PDF-документов следующие объекты:

  • аннотации
  • вложения
  • закладки
  • поля форм
  • страницы
  • скрипты
  • прозрачность

Вы также можете удалять текст, изображения и векторную графику со страниц PDF. Также возможно сведение текста.

Заключение

Вы можете использовать Docotic.Pdf library для сжатия PDF в C# и VB.NET. Docotic.Pdf предоставляет множество эффективных способов оптимизации.

Скачайте и попробуйте полный пример Сжатие PDF-документа в C# и VB.NET с GitHub.

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