К сожалению, PDFBox из коробки не предоставляет класс для визуализации содержимого произвольных XObjects (например, шрифт char 3), по крайней мере, насколько я могу видеть.
Но он предоставляет класс для рендеринга полных страниц PDF; таким образом, для отображения заданного глифа шрифта 3-го типа можно просто создать страницу, содержащую только этот глиф, и отобразить эту временную страницу!
Предполагая, что, например, шрифт типа 3 определяется на первой странице PDDocument document
и имеет имя F1
, все его символьные проки может быть обработан следующим образом:
PDPage page = document.getPage(0);
PDResources pageResources = page.getResources();
COSName f1Name = COSName.getPDFName("F1");
PDType3Font fontF1 = (PDType3Font) pageResources.getFont(f1Name);
Map<String, Integer> f1NameToCode = fontF1.getEncoding().getNameToCodeMap();
COSDictionary charProcsDictionary = fontF1.getCharProcs();
for (COSName key : charProcsDictionary.keySet())
{
COSStream stream = (COSStream) charProcsDictionary.getDictionaryObject(key);
PDType3CharProc charProc = new PDType3CharProc(fontF1, stream);
PDRectangle bbox = charProc.getGlyphBBox();
if (bbox == null)
bbox = charProc.getBBox();
Integer code = f1NameToCode.get(key.getName());
if (code != null)
{
PDDocument charDocument = new PDDocument();
PDPage charPage = new PDPage(bbox);
charDocument.addPage(charPage);
charPage.setResources(pageResources);
PDPageContentStream charContentStream = new PDPageContentStream(charDocument, charPage);
charContentStream.beginText();
charContentStream.setFont(fontF1, bbox.getHeight());
charContentStream.getOutput().write(String.format("<%2X> Tj\n", code).getBytes());
charContentStream.endText();
charContentStream.close();
File result = new File(RESULT_FOLDER, String.format("4700198773-%s-%s.png", key.getName(), code));
PDFRenderer renderer = new PDFRenderer(charDocument);
BufferedImage image = renderer.renderImageWithDPI(0, 96);
ImageIO.write(image, "PNG", result);
charDocument.close();
}
}
(RenderType3Character.java метод испытания testRender4700198773
)
Учитывая textPosition
переменные в коде OP, он вполне вероятна попытка это из текста выписки ион используется кейс. Таким образом, ему придется либо предварительно генерировать растровые изображения, как указано выше, и просто искать их по имени или адаптировать код в соответствии с доступной информацией в своем прецеденте (например, у него может не быть оригинальной страницы под рукой, только шрифт объект, в этом случае он не может копировать ресурсы исходной страницы, но вместо этого может создать новый объект ресурсов и добавить к нему объект шрифта).
К сожалению, ОП не предоставил образец PDF. Таким образом, я использовал один из другого вопроса переполнения стека, 4700198773.pdf от extract text with custom font result non readble для моего теста. Очевидно, что могут остаться проблемы с собственными файлами OP.
Помогает ли мой ответ? Если нет, просьба поделиться образцом PDF-реферала для ваших шрифтов Type 3. Как уже упоминалось в моем ответе, а затем обсуждался с @Tilman в комментариях к нему, могут существовать варианты шрифтов Type 3 для обработки по-разному ... – mkl