2017-02-17 24 views
3

Я изучаю варианты компоновки документа PDF, который должен быть очень аккуратным и точным.PDFBox: обрезание текста при записи в PDPageContentStream или PDPage

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

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

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

enter image description here

Спасибо, JM

ответ

3

Сначала создайте путь, например, с PDPageContentStream.addRect(). Затем позвоните PDPageContentStream.clip(). Это пересечет текущий путь обрезки с вашим путем. Затем нарисуйте все, что вы хотите подрезать.

Не забудьте поставить все это между saveGraphicsState() и restoreGraphicsState(), или ваш обтравочный контур станет пустым в какое-то время из-за его пересечения снова.

Чтобы убедиться, что ваш путь обрезки верен во время разработки, замените вызов clip() на stroke(), чтобы вы могли видеть, где он находится.

+0

Hhmmm, я просто увидел, что все методы отсечения 'PDPageContentStream' автоматически запускают' n' для пути. Почему так? Почему запрет на поглаживание и/или наполнение одновременно? – mkl

+0

@mkl «Это всегда было так» :-) Я не вижу необходимости изменять это, я никогда не видел «W» с чем-то другим, кроме «n» в PDF-файлах, на которые я смотрел. –

+0

Thxs @TilmanHausherr, он работал как шарм. Если возможно, мне интересно, почему в PDFBox нет функций высокого уровня. Я предполагаю, что все мы должны разработать свою собственную функцию для выравнивания по левому краю, выравнивания по правому краю, обрезания, выравнивания текста и остального. Я удивлен, что это не часть набора. Любая идея почему? – jmc34