PDF узнает, подчеркнули ли текст или ячейку таблицы
Я играл с помощью метода PdfBox и PDFTextStripperByArea.
Мне удалось извлечь информацию, если текст жирный или курсив, но я не могу получить информацию подчеркивания.
Насколько я понимаю в PDF, подчеркивание делается путем рисования линий. Поэтому теоретически я должен получить некоторую информацию о строках где-то вокруг текста. Предоставляя эту информацию, я мог бы узнать, подчеркивается ли какой-либо текст или в таблице.
Вот мой код:
List<TextPosition> textPos = charactersByArticle.get(index);
for (TextPosition t : textPos)
{
if (t.getFont().getFontDescriptor() != null)
{
if (t.getFont().getFontDescriptor().getFontWeight() > BOLD_WEIGHT ||
t.getFont().getFontDescriptor().isForceBold())
{
isBold = true;
}
if (t.getFont().getFontDescriptor().isItalic())
{
isItalic = true;
}
}
}
Я попытался воспроизвести объект PDGraphicsState, который обрабатывается в методе processEncodedText в классе PDFStreamEngine, но нет информации о найденных там строках.
Любые предложения, по которым эта информация может быть получена из?
Ответы
Ответ 1
Вот что я выяснил до сих пор:
PDFBox использует файл ресурсов для привязанных операторов/инструкций PDF к определенным классам, которые затем обрабатывают информацию.
Если мы посмотрим на файл ресурсов PDFTextStripper.properties в разделе:
pdfbox\src\main\resources\org\apache\pdfbox\resources\
мы видим, что, например, оператор BT связан с
org.apache.pdfbox.util.operator.BeginText и т.д.
PDFTextStripper в
pdfbox\src\main\java\org\apache\pdfbox\util\
учитывает это и использует обработку PDF с этими классами.
, но все графические объекты игнорируются, поэтому нет информации о структуре подчеркивания или таблицы!
Теперь, если мы посмотрим на файл ресурсов PageDrawer.properties, мы увидим, что он ограничивается почти всеми доступными операторами. Который используется классом PageDrawer в
pdfbox\SRC\главная\Java\орг\Apache\pdfbox\PdfViewer\
Теперь "трюк" должен выяснить, какие графические операторы представляют собой те, кто представляет подчеркивание и таблицы, и использовать их в комбинации с PDFTextStripper.
Теперь это означало бы чтение спецификации файла PDF, которая в настоящее время способна много работать.
Если кто-то знает, какие операторы несут ответственность за какие действия для рисования подчеркиваний и строк таблицы, пожалуйста, дайте мне знать.
Ответ 2
вы можете использовать Itext для создания отчетов в формате PDF.
с помощью itext вы можете легко поставить строки.
попробуйте следующее.
document.add(новый LineSeparator (0.5f, 50, null, 0, 198));
приведенный выше код используется для создания строк в pdf-отчете. и установите размеры в соответствии с вашим выбором.
надеюсь, что это поможет вам.
Ответ 3
Насколько я понял pdfbox, нет опции, по которой вы можете прочитать подчеркивание. Возможно, вы можете попробовать itextpdf для этой цели.
Ответ 4
Как вы отметили - PDFBox использует файлы ресурсов, чтобы привязывать операторы/инструкции PDF к посетителям, которые будут обрабатывать информацию.
Вероятно, лучше всего начать с копирования существующего посетителя в формате PDFBox в свою собственную папку-источник, а затем добавить/расширить реализацию оттуда.
Мой давний опыт PostScript напоминает операторы "moveto" и "lineto". Поскольку PDF ориентирован примерно на PS, вы будете искать что-то подобное.
http://learnpostscript.wordpress.com/category/lineto/
Формат PDF - это b * tch - это HTML, сделано неправильно. Он представляет собой графическую реализацию, а не семантику. Даже реконструировать предложения сложно - слова или даже отдельные персонажи позиционируются, "пространство" или "новая линия" должны быть алгоритмически реконструированы. Короче говоря, Adobe - это * дыры. А Reader - это неэргономичная, небезопасная, небезопасная, раздутая свинья.
Тем не менее, вы можете выполнить свое требование - если вы готовы поставить, скажем, 12 часов работы. Помимо обнаружения по позициям, подчеркивания обычно будут издаваться в PDF сразу после их текста. вы можете защелкнуть ваше обнаружение по заказу PDF-документа, а не только по позиции страницы.
Также попробуйте создать тривиальный двухстрочный PDF с подчеркнутым текстом. Тогда посмотрите, что вы можете сделать, проанализируя его! Подчеркивание должно выходить как собачьи бананы, и как только вы сможете это обнаружить, вы будете хорошо в пути.
PDFBox не очень хорош для расширяемости, это в основном просто большая куча алгоритмов. По этой причине просто скопируйте источник PDFTextStripper (и, возможно, у него есть PageDrawer для справки) и прототип.
Надеюсь, это поможет!
Ответ 5
В соответствии с api getfont() возвращает размер шрифта.
Вы можете использовать метод getStyle() и он вернет STYLE_UNDERLINE
для подчеркнутого шрифта. Таким образом, вы можете получить стиль подчеркивания.