使用PDFBox的PDF文本的字体信息

问题描述:

我是Apache PDFBox库的新手。使用PDFBox的PDF文本的字体信息

我要地图字体信息的PDF段落

我已经通过Questios How to extract font styles of text contents using pdfbox?

走了,但它并没有提供有关该段落写有字体信息。

例如,如果我的网页包含文本:

PARA1:宋体

PARA2:Times New Roman字体

那么我应该能够得到该PARA1是用宋体,而PARA2信息是用Times New Roman编写的。在上述问题提出

解决方案给出了PDF页面只包含

Arial和Times New Roman字体的信息。

+0

参考此链接访问其他数据。 http://*.com/questions/6939583/how-to-extract-font-styles-of-text-contents-using-pdfbox – PKhode

+0

@pappukhode我已经提到了我的问题链接 –

您使用PDFTextStripper类文件(参见其JavaDoc的评论)是这样的:

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

要获得特定字体的信息,因此,你必须有所改变。

字体信息可在这个类一直以来,只输出线时丢弃,看看它的source

protected void writePage() throws IOException 
{ 
    [...] 
    for(int i = 0; i < charactersByArticle.size(); i++) 
    { 
     [...] 
     List<TextPosition> line = new ArrayList<TextPosition>(); 
     [...] 
     while(textIter.hasNext()) 
     { 
      [...] 
      if(lastPosition != null) 
      { 
       [...] 
       if(!overlap(positionY, positionHeight, maxYForLine, maxHeightForLine)) 
       { 
        writeLine(normalize(line,isRtlDominant,hasRtl),isRtlDominant); 
        line.clear(); 
        [...] 
       } 
............ 

在该列表中的TextPosition实例line仍然有可用的所有格式信息,其中使用的字体,只有在“正常化”line时,它被简化为纯字符。

为了保持字体的信息,因此,您有不同的选择,这取决于你想如何检索字体信息:

  • 如果你想继续在检索所有页面内容(包括字体)通过getText一个String:您更改的方法

    private List<String> normalize(List<TextPosition> line, boolean isRtlDominant, boolean hasRtl) 
    

    包括一些字体标签您选择每当字体的变化(如[Arial])。不幸的是这种方法是私人的因此,您必须复制整个PDFTextStripper类并更改副本的代码。

  • 如果您想要检索不同结构(例如,为List<List<TextPosition>>),你可以从PDFTextStripper派生自己的脱衣舞类,添加一些变量所需的类型,并覆盖protected方法writePage上面提到的,复制它,唯一正确的之前或行

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

    与后得到了加强代码将信息添加到您的新变量。例如。

    public class MyPDFTextStripper extends PDFTextStripper 
    { 
        public List<List<TextPosition>> myLines = new ArrayList<List<TextPosition>>(); 
        [...] 
           if(!overlap(positionY, positionHeight, maxYForLine, maxHeightForLine)) 
           { 
            writeLine(normalize(line,isRtlDominant,hasRtl),isRtlDominant); 
            myLines.add(new ArrayList<TextPosition>(line)); 
            line.clear(); 
            [...] 
           } 
    

    现在,您可以拨打getTextMyPDFTextStripper的实例,检索纯文本的结果,并通过新的变量

要添加更多的字体,除了库字体,所以你需要专门添加字体文件。

+0

我只想知道哪个文本是写在哪个字体,字体已经安装在我的电脑上。 –