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

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

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

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

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

Используйте библиотеку Docotic.Pdf для сжатия PDF-документов в приложениях для .NET Framework и .NET Core. Вы можете загрузить бинарные файлы библиотеки или использовать её пакет NuGet. Чтобы опробовать библиотеку без ограничений ознакомительного режима, вы можете получить бесплатный ограниченный по времени лицензионный ключ, используя форму здесь.

Библиотека Docotic.Pdf 9.3.17036-dev Регрессионные тесты 14,665 прошло Всего загрузок NuGet 4,191,515

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.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-документы.