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

Библиотека .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-документов.