Эта страница может содержать автоматически переведенный текст.
Сжать PDF-документы в C# и VB.NET
Во многих случаях обычным является желание сжать и оптимизировать PDF-документы. PDF-документы меньшего размера легче передавать по сети и дешевле хранить. Уменьшение размера PDF-файла особенно важно важно для целей архивирования.
Библиотека .NET для оптимизации PDF-документов
Используйте библиотеку Docotic.Pdf для сжатия PDF-документов в приложениях .NET Framework и .NET Core. Библиотека доступна на NuGet и на нашем сайте. Получите библиотеку и бесплатный лицензионный ключ с ограниченным сроком действия на странице Скачать PDF библиотеку C# .NET.
9.5.17615-dev 14,813 прошло Всего загрузок NuGet 4,924,084Docotic.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.ReplaceDuplateObjects не
заменяет встроенные (inline) изображения. Если ваш документ содержит встроенные изображения,
начните с использования метода
PdfCanvas.MoveInlineImagesToResources.
Метод преобразует встроенные изображения в обычные, а затем метод ReplaceDuplateObjects
сможет
дедуплицировать преобразованные изображения.
Сжать изображения в 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-документ доступным (accessible) для вспомогательных устройств
Удаление такой информации помогает уменьшить размер PDF-файла. Но PDF-файл больше не будет помечен тегами и не будет доступен для вспомогательных устройств. В этом примере показано, как удалить информацию о структуре из PDF в С#:
using (var pdf = new PdfDocument("tagged.pdf"))
{
pdf.RemoveStructureInformation();
pdf.Save("compressed.pdf");
}
Удалить неиспользуемые ресурсы из PDF
Страницы PDF и объекты XObject могут ссылаться на большее количество шрифтов, изображений или шаблонов, чем они используют. Вы можете использовать метод PdfDocument.RemoveUnusedResources для удаления неиспользуемых ресурсов из PDF. Вот пример на С#:
using (var pdf = new PdfDocument("input.pdf"))
{
pdf.RemoveUnusedResources();
pdf.Save("compressed.pdf");
}
Удалить служебную информацию приложений из PDF
PDF-документы, созданные с помощью программного обеспечения Adobe, могут включать служебные данные приложений (private application data). Такие данные хранятся в словарях 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>
/// Этот метод извлекает любой шрифт:
/// * установленный в ОС
/// * или если его имя включено в список «всегда извлекать»
/// * и его имя не включено в список «всегда сохранять».
/// </summary>
private static void unembedFonts(PdfDocument pdf)
{
string[] alwaysUnembedList = new string[] { "MyriadPro-Regular" };
string[] alwaysKeepList = new string[] { "ImportantFontName", "AnotherImportantFontName" };
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;
byte[] fontBytes = loader.Load(font.Name, font.Bold, font.Italic);
if (fontBytes != null)
{
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 для сжатия PDF в C# и VB.NET. Docotic.Pdf предоставляет множество эффективных средств оптимизации.
Загрузите и попробуйте полную версию примера Сжать PDF-документ в C# и VB.NET с GitHub.
Свяжитесь с нами, и мы посоветуем, как добиться наилучшей степени сжатия для ваших PDF-документы.