Как я могу проверить, использует ли PDF-файл встроенные шрифты?

У меня есть папка, в которую несколько клиентов загружают несколько файлов PDF. Некоторые из них используют встроенные шрифты, некоторые нет.
Я работал над службой, которая оптимизирует (с точки зрения размера файла) PDF-файлы в этой папке.
Каждый пользователь может загружать около 400 файлов весом от 80 до 10 Мб, и моя задача - оптимизировать их до минимально возможного размера файла с минимальными потерями качества.

Библиотека PDF отлично справляется с этим. Моя единственная проблема заключается в том, что я не могу удалить все встроенные шрифты из всех файлов, поскольку некоторые файлы могут использовать эти шрифты, и в результате получится файл, который я не смогу использовать.

Итак, мои вопросы:

  1. Как я могу определить, какие файлы используют, а какие файлы не используют встроенные шрифты?
  2. Как можно удалить только неиспользуемые шрифты при оптимизации файлов, использующих встроенные шрифты?

я хочу удалить все встроенные шрифты из большинства файлов, но сохранить встроенные шрифты в тех файлах, где они мне действительно нужны. Я понимаю, что это зависит от шрифтов, которые у меня есть в моей системе (эти файлы должны оставаться в одной системе, так что переносимость не так важна для меня), поэтому я пытаюсь найти способ определить, прежде чем оптимизировать, какие файлы будут выглядеть нормально без встроенных шрифтов, и какие файлы мне нужно, чтобы сохранить встроенные шрифты.

2 ответа

В Adobe PDF Library версии 15 и выше есть сервис, который оптимизирует PDF-файлы для вас.

Оптимизатор имеет функцию для поднабора всех встроенных шрифтов. Что это будет делать, так это создавать подмножество каждого шрифта, ограниченное только глифами того шрифта, которые фактически используются в документе. API ниже.

void Datalogics::PDFL::PDFOptimizer::SetOption (OptimizerOption option, bool value)
void Datalogics::PDFL::PDFOptimizer::Optimize (Document document, string newPath)

Это вариант, который вам нужен

SubsetAllEmbeddedFonts 

APDFL имеет вызов PDFontIsEmbedded(). Класс Font интерфейса DotNet имеет свойство Embedded. Сохранение с помощью GarbageCollect SaveFlag должно удалить любые непрямые косвенные объекты, включая шрифты.

Обратите внимание, что словари ресурсов потенциально могут совместно использоваться несколькими страницами, поэтому шрифты, не используемые одной страницей, могут использоваться другой страницей, использующей тот же словарь ресурсов.

Другие вопросы по тегам