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

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

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

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

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

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

Библиотека Docotic.Pdf 9.5.17615-dev Регрессионные тесты 14,813 прошло Всего загрузок NuGet 4,924,084

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