8

我正在使用 Apache pdfbox 来提取文本。我可以从pdf中提取文本,但我不知道如何知道这个词是否是粗体???(代码建议会很好!!!)这是从 pdf 中提取纯文本的代码,工作正常。

PDDocument document = PDDocument
    .load("/home/lipu/workspace/MRCPTester/test.pdf");
document.getClass();
if (document.isEncrypted()) {
    try {
        document.decrypt("");
    } catch (InvalidPasswordException e) {
        System.err.println("Error: Document is encrypted with a password.");
        System.exit(1);
    }
}

// PDFTextStripperByArea stripper = new PDFTextStripperByArea();
// stripper.setSortByPosition(true);
PDFTextStripper stripper = new PDFTextStripper();
stripper.setStartPage(1);
stripper.setEndPage(2);
stripper.setSortByPosition(true);
String st = stripper.getText(document);
4

1 回答 1

20

结果PDFTextStripper是纯文本。因此,在提取它之后,为时已晚。但是您可以覆盖它的某些方法,并且只允许根据您的意愿格式化的文本。

如果PDFTextStripper您必须覆盖

protected void processTextPosition( TextPosition text )

在您的覆盖中,您检查所讨论的文本是否满足您的要求(TextPosition包含有关所讨论文本的大量信息,而不仅仅是文本本身),如果满足,则将其转发TextPosition textsuper实现。

但是,主要问题是识别哪个文本是粗体的。

粗体标准可能是字体名称中的粗体字,例如Courier-BoldOblique - 您可以使用字体的方法访问文本的字体,text.getFont()并使用字体的后记名称getBaseFont()

String postscriptName = text.getFont().getBaseFont();

Criteria 也可能来自字体描述符 - 您使用该getFontDescriptor方法获取字体的字体描述符,并且字体描述符具有可选的字体权重值

float fontWeight = text.getFont().getFontDescriptor().getFontWeight();

该值定义为

(可选;PDF 1.5;应用于标记的 PDF 文档中的 Type 3 字体)标准字体名称或字体说明符的粗细(粗细)分量。可能的值应为 100、200、300、400、500、600、700、800 或 900,其中每个数字表示至少与其前一个一样暗的权重。值 400 表示正常重量;700 表示粗体。

这些值的具体解释因字体而异。

示例 一种字体中的 300 可能与另一种字体中的 500 最相似。

(表 122,第 9.8.1 节,ISO 32000-1)

可能还有其他提示要检查粗体,例如大线宽

double lineWidth = getGraphicsState().getLineWidth();

当渲染模式也绘制轮廓时:

int renderingMode = getGraphicsState().getTextState().getRenderingMode();

您可能必须尝试使用​​您手头的文件,哪些标准就足够了。

于 2013-11-04T21:55:41.753 回答