【问题标题】:How to extract bold text from pdf using pdfbox?如何使用pdfbox从pdf中提取粗体文本?
【发布时间】:2013-11-15 06:20:42
【问题描述】:

我正在使用 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);

【问题讨论】:

  • 您有带有粗体文本的 PDF 示例吗?问题是并非所有粗体字体都被标记为粗体,而且还有不同的穷人粗体变体。因此,识别粗体或字符的模式可以是文档特定的。

标签: java pdf pdfbox


【解决方案1】:

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

如果是PDFTextStripper,您必须覆盖

protected void processTextPosition( TextPosition text )

在您的覆盖中,您检查相关文本是否满足您的要求(TextPosition 包含有关相关文本的大量信息,而不仅仅是文本本身),如果是,请将 TextPosition text 转发到 @987654328 @ 实现。

不过,主要的问题是识别哪个文本是粗体

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

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

标准也可能来自字体描述符——你使用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)

可能还有其他提示要检查 bold-ism,例如大线宽

double lineWidth = getGraphicsState().getLineWidth();

渲染模式也画轮廓时:

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

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

【讨论】:

  • 但是当您检测到 TextPosition 是粗体时,您如何管理它(例如用 包装文本?您是否在不调用 supper 的情况下完全覆盖 processTextPosition?
  • @lujop 当我写下答案processTextPosition 是唯一可以适当覆盖的方法时,将结果传输到输出是很困难的。同时(在 1.8.11 和 2.0.x 中)writeString 也成为了一种可用的覆盖方法,并且由于该方法更接近最终输出,它可以用于为粗体等注入标签,参见。 this answer。但请记住,有很多方法可以创建粗体文本,参见。 this answer。对于一般解决方案,您必须检查所有这些。
猜你喜欢
  • 2018-09-07
  • 2019-04-23
  • 1970-01-01
  • 2012-12-30
  • 2014-07-11
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
相关资源
最近更新 更多