Предполетные pdf-файлы - PullRequest
1 голос
/ 22 июня 2011

У меня есть задача предварительно проверить существующий pdf-файл по следующим параметрам:

  1. Соответствие встроенных шрифтов и используемых шрифтов в текстовых слоях;
  2. Физический размер (ширина и высота в мм.) Документа.
  3. Цветовой профиль для каждого слоя изображения и всего документа.
  4. Отбор / обрезка / художественная коробка документа.

Мне нужно сделать это с помощью .net framework. Есть предложения?

Ответы [ 2 ]

0 голосов
/ 22 июня 2011

Я предвзятый (коммитер), но я предлагаю вам использовать iText.

Использование вами слова «слой» заставляет меня поверить, что вы не имеете в виду (или не понимаете), что такое «слой» обычноозначает в PDF.

В PDF слои также называются «необязательными группами содержимого».Части данной страницы, которые можно включать и выключать с использованием различных битов логики (например, текущий уровень масштабирования).

Текст и изображения в PDF могут иметь произвольную глубину / Z-порядок.Текст может быть поверх изображения, которое может перекрывать какой-то другой текст, который может быть нарисован поверх какого-то другого изображения, что ... вы понимаете.Так бывает не очень часто (если вообще когда-либо), но возможно .

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

iText может сделать это благодаря довольно новому пакету parser .В частности, PdfReaderContentParser с пользовательским RenderListener .

В ваших реализациях renderText и renderImage вы будете хранить / изучать все, что вам нужно.

Это дает вам большую часть пути к 1 и 3. Для извлечения информации о цвете / встраивании потребуется некоторое низкоуровневое изучение с PdfDictionary и др., А также некоторые знания PDF-спецификации .

Числа 2 и 4 довольно прикольные в зависимости от того, как вы их сформулировали, но действительность довольно проста.

Страницы PDF могут иметь 5 различных полей:

  1. МедиаПоле: начальный размер страницы.Требуется
  2. Поле кадрирования: размер готовой страницы.Необязательно, по умолчанию используется поле носителя, если оно явно не определено.
  3. Поле обрезки: некоторые другие элементы отделки принтера, отличные от поля обрезки.Необязательно, по умолчанию используется поле обрезки.
  4. Art box: ограничивающий прямоугольник, содержащий все видимое на странице (или что-то еще), по умолчанию используется поле обрезки.
  5. Bleed box: некоторая другая печатьвещь, по умолчанию (вы уже догадались!) поле кадрирования.

Все эти "значения по умолчанию для X" неявны.Если вы попросите поле обрезки, я могу получить значение «ноль», и в этом случае я должен проверить поле обрезки.Если я снова получаю нулевое значение, тогда мне нужно установить флажок носителя.

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

И когда вы хотите узнать одно из этих других полей, вам нужно знать, что это такое, когда это значение отсутствует.

Хорошо, это теория.Время работы гайки и болты (на Java):

Rectangle[] getBoxen(PdfReader reader, int pageINDEX) {
  Rectangle retRects[] = new Rectangle[5];
  retRects[0] = reader.getBoxSize(pageINDEX, "media");
  retRects[1] = reader.getBoxSize(pageINDEX, "crop");
  retRects[2] = reader.getBoxSize(pageINDEX, "trim");
  retRects[3] = reader.getBoxSize(pageINDEX, "art");
  retRects[4] = reader.getBoxSize(pageINDEX, "bleed");

  // handle defaults

  // crop box defaults to media box
  if (retRects[1] == null) {
    retRects[1] = retRects[0];
  }

  // everything else defaults to the crop box
  for (int i = 2; i < 4; ++i) {
    if (retRects[i] == null) {
      retRects[i] = retRects[1];
    }
  }

  return retRects; 
}
0 голосов
/ 22 июня 2011

Взгляните на iText или вы реализуете собственное решение на основе poppler , которое дает вам действительно низкоуровневый доступ к документам PDF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...