Вы говорите
То, что я до сих пор делал, - это получение всех текстовых объектов, а также объектов и местоположений изображений.
но вы не вдаваетесь в подробности, как вы это делаете. Я предполагаю, что вы используете соответствующую IRenderListener
реализацию.
Но IRenderListener
, как вы сами узнали,
только извлекает изображения и тексты.
Основными недостающими объектами являются пути и их использование.
Чтобы извлечь их, вы должны реализовать IExtRenderListener
, который расширяет IRenderListener
, но также получает информацию о путях. Чтобы понять методы обратного вызова, сначала обратите внимание, как инструкции, связанные с путем, работают в PDF-файлах:
Сначала есть инструкции для построения фактического пути; эти инструкции по существу
- перейти в какую-то позицию,
- добавить строку к некоторой позиции от предыдущей позиции,
- добавить кривую Безье к некоторой позиции от предыдущей позиции, используя некоторые контрольные точки, или
- добавить вертикальный прямоугольник в некоторой позиции, используя некоторую информацию о ширине и высоте.
Затем есть необязательная инструкция для пересечения текущего пути клипа с сгенерированным путем.
Наконец, есть инструкция для рисования для любой комбинации заполнения внутри пути и поглаживания вдоль пути, т.е. для выполнения обоих, либо одного, либо ни один.
Это соответствует обратным вызовам, которые вы получаете в своей реализации IExtRenderListener
:
/**
* Called when the current path is being modified. E.g. new segment is being added,
* new subpath is being started etc.
*
* @param renderInfo Contains information about the path segment being added to the current path.
*/
void ModifyPath(PathConstructionRenderInfo renderInfo);
вызывается один раз или чаще для построения фактического пути , PathConstructionRenderInfo
, содержащего фактический тип инструкции в его свойстве Operation
(сравните с PathConstructionRenderInfo
постоянными членами MOVETO
, LINETO
и т. д. для определения типа операции) и требуемых координат / размеров в свойстве SegmentData
. Свойство Ctm
дополнительно возвращает аффинное преобразование, которое в настоящее время установлено для применения ко всем операциям рисования.
Тогда
/**
* Called when the current path should be set as a new clipping path.
*
* @param rule Either {@link PathPaintingRenderInfo#EVEN_ODD_RULE} or {@link PathPaintingRenderInfo#NONZERO_WINDING_RULE}
*/
void ClipPath(int rule);
вызывается, если текущий путь клипа должен пересекаться с созданным путем.
Наконец
/**
* Called when the current path should be rendered.
*
* @param renderInfo Contains information about the current path which should be rendered.
* @return The path which can be used as a new clipping path.
*/
Path RenderPath(PathPaintingRenderInfo renderInfo);
Вызывается
, PathPaintingRenderInfo
содержащий операцию рисования в свойстве Operation
(любая комбинация PathPaintingRenderInfo
констант STROKE
и FILL
), правило для определения, что означает "внутри пути" в его Rule
свойство (NONZERO_WINDING_RULE
или EVEN_ODD_RULE
) и некоторые другие детали чертежа в свойствах Ctm
, LineWidth
, LineCapStyle
, LineJoinStyle
, MiterLimit
и LineDashPattern
.