2013-11-04 168 views
4

我正在使用Apache pdfbox来提取文本。我可以从PDF中提取文本,但我不知道如何知道这个词是否是粗体? (代码建议会很好!!!) 这里是从PDF中提取纯文本的代码,工作正常。如何使用pdfbox从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); 
+1

你有一个带粗体文本的PDF示例吗?问题在于并不是所有的粗体字都被标记为粗体,而且还有更多不同的粗体字。因此,识别粗体字体或字符的模式可以是文档特定的。 – mkl

回答

15

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

在你有PDFTextStripper的情况下,以覆盖

protected void processTextPosition(TextPosition text) 

在你重写你检查有问题的文字是否符合您的要求(TextPosition包含讨论的文字多的信息,不仅是文本本身) ,如果确实如此,转发TextPosition textsuper实施。

的主要问题是,虽然认识到这文字大胆

粗体标准可以是字体名称中的字体粗体字,例如, 信使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)

可能有附加提示朝向粗体主义来检查,例如一个大线宽

double lineWidth = getGraphicsState().getLineWidth(); 

当渲染模式下消耗的轮廓,也:

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

您可能必须尝试用你手头上有哪些标准就足够了您的文件。

+0

但是,当您检测到TextPosition是粗体时,您可如何管理该文本(例如,使用? 来包装文本。是否在不调用晚餐的情况下完全覆盖processTextPosition? – lujop

+1

@lujop当我编写答案时,processTextPosition是唯一的方法人们可以适当地覆盖,将结果传输到输出是很困难的,同时(在1.8.11和2.0.x中)'writeString'成为一个可用的覆盖方法,并且由于该方法更接近最终输出,可以用来为粗体注入标签等,参见[这个答案](http://stackoverflow.com/a/40039407/1729265)。但请记住,有很多方法可以创建粗体文本,参见[这个答案](http://stackoverflow.com/a/26642060/1729265)。对于一个通用的解决方案,你必须检查所有这些。 – mkl

相关问题