Я предвзятый (коммитер), но я предлагаю вам использовать iText.
Использование вами слова «слой» заставляет меня поверить, что вы не имеете в виду (или не понимаете), что такое «слой» обычноозначает в PDF.
В PDF слои также называются «необязательными группами содержимого».Части данной страницы, которые можно включать и выключать с использованием различных битов логики (например, текущий уровень масштабирования).
Текст и изображения в PDF могут иметь произвольную глубину / Z-порядок.Текст может быть поверх изображения, которое может перекрывать какой-то другой текст, который может быть нарисован поверх какого-то другого изображения, что ... вы понимаете.Так бывает не очень часто (если вообще когда-либо), но возможно .
Но мое понимание того, что вы пытаетесь спросить , заключается в том, что выВам нужны координаты и графическое состояние каждого фрагмента текста и любого изображения на данной странице.
iText может сделать это благодаря довольно новому пакету parser .В частности, PdfReaderContentParser с пользовательским RenderListener .
В ваших реализациях renderText и renderImage вы будете хранить / изучать все, что вам нужно.
Это дает вам большую часть пути к 1 и 3. Для извлечения информации о цвете / встраивании потребуется некоторое низкоуровневое изучение с PdfDictionary
и др., А также некоторые знания PDF-спецификации .
Числа 2 и 4 довольно прикольные в зависимости от того, как вы их сформулировали, но действительность довольно проста.
Страницы PDF могут иметь 5 различных полей:
- МедиаПоле: начальный размер страницы.Требуется
- Поле кадрирования: размер готовой страницы.Необязательно, по умолчанию используется поле носителя, если оно явно не определено.
- Поле обрезки: некоторые другие элементы отделки принтера, отличные от поля обрезки.Необязательно, по умолчанию используется поле обрезки.
- Art box: ограничивающий прямоугольник, содержащий все видимое на странице (или что-то еще), по умолчанию используется поле обрезки.
- 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;
}