gpt4 book ai didi

java - PdfBox - 使用获取字体信息

转载 作者:行者123 更新时间:2023-11-29 05:31:43 27 4
gpt4 key购买 nike

我正在尝试使用 Square Annotation 从 pdf 中获取文本。我使用以下代码使用 PDFBOX.
从 PDF 中提取文本代码

try {    
PDDocument document = null;
try {
document = PDDocument.load(new File("//Users//" + usr + "//Desktop//BoldTest2 2.pdf"));
List allPages = document.getDocumentCatalog().getAllPages();
for (int i = 0; i < allPages.size(); i++) {
PDPage page = (PDPage) allPages.get(i);
Map<String, PDFont> pageFonts = page.getResources().getFonts();
List<PDAnnotation> la = page.getAnnotations();
for (int f = 0; f < la.size(); f++) {
PDAnnotation pdfAnnot = la.get(f);
PDFTextStripperByArea stripper = new PDFTextStripperByArea();
stripper.setSortByPosition(true);
PDRectangle rect = pdfAnnot.getRectangle();

float x = 0;
float y = 0;
float width = 0;
float height = 0;
int rotation = page.findRotation();

if (rotation == 0) {
x = rect.getLowerLeftX();
y = rect.getUpperRightY() - 2;
width = rect.getWidth();
height = rect.getHeight();
PDRectangle pageSize = page.findMediaBox();
y = pageSize.getHeight() - y;
}
Rectangle2D.Float awtRect = new Rectangle2D.Float(x, y, width, height);
stripper.addRegion(Integer.toString(f), awtRect);
stripper.extractRegions(page);
PrintTextLocation2 prt = new PrintTextLocation2();
if (pdfAnnot.getSubtype().equals("Square")) {
testTxt = testTxt + "\n " + stripper.getTextForRegion(Integer.toString(f));
}
}
}
} catch (Exception ex) {
} finally {
if (document != null) {
document.close();
}
}
} catch (Exception ex) {
}

通过使用此代码,我只能获取 PDF 文本。如何在文本中获取字体信息,如 BOLD ITALIC。非常感谢建议或引用。

最佳答案

PDFTextStripperByArea 扩展的 PDFTextStripper 规范化(即删除格式)文本(参见 JavaDoc comment ):

* This class will take a pdf document and strip out all of the text and ignore the
* formatting and such.

如果你查看源代码,你会看到字体信息在这个类中是可用的,但是在打印之前它被归一化了:

protected void writePage() throws IOException
{
[...]
List<TextPosition> line = new ArrayList<TextPosition>();
[...]
if(!overlap(positionY, positionHeight, maxYForLine, maxHeightForLine))
{
writeLine(normalize(line,isRtlDominant,hasRtl),isRtlDominant);
line.clear();
[...]
}
............

ArrayList 中的TextPosition 实例具有所有格式信息。解决方案可以专注于根据要求重新定义现有方法。我在下面列出了一些选项:

  • private List normalize(List line, boolean isRtlDominant, boolean hasRtl)

如果你想要你自己的normalize方法,你可以复制整个PDFTextStripper在您的项目中上课并更改副本的代码。让我们将这个新类称为 MyPDFTextStripper,然后根据要求定义新方法。同样复制PDFTextStripperByArea作为 MyPDFTextStripperByArea 将扩展 MyPDFTextStripper

  • protected void writePage()

如果您只需要一个新的writePage 方法,您可以简单地扩展PDFTextStripper。 ,并覆盖此方法,然后如上所述创建 MyPDFTextStripperByArea

  • writeLine(normalize(line,isRtlDominant,hasRtl),isRtlDominant)

其他解决方案可能通过将 pre-normalization 信息存储在某个变量中然后使用它来覆盖 writeLine 方法。

希望这对您有所帮助。

关于java - PdfBox - 使用获取字体信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20855376/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com