1

我正在尝试从 PDF 中提取数据并将其拆分为某些类别。我能够从 PDF 中提取数据并根据其字体大小将其拆分为类别。例如:假设有3个类别,国家类别,首都类别和城市类别。我能够将所有国家、首都和城市归入各自的类别。但是我无法绘制出哪个首都属于哪个城市和哪个国家或哪个国家属于哪个城市和首都。*它是随机读取数据,我如何在不破坏顺序的情况下从下到上读取数据,所以我可以将第一个单词放在第一类,第二个放在第二个等等。*

或者有人知道一些更有效的方法吗?所以我可以将文本放入各自的类别并映射它。

我正在使用 Java,这是我的代码:

public class readPdfText {


public static void main(String[] args) {

    try{
        PdfReader reader = null;

    String src = "pdffile.pdf";
    try {

        reader = new PdfReader("pdfile.pdf");
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    SemTextExtractionStrategy  smt = new SemTextExtractionStrategy();


        for (int i = 1; i <= reader.getNumberOfPages(); i++) {

      PdfTextExtractor.getTextFromPage(reader, i, smt);

        }

    }catch(Exception e){

    }
}

}

SemTextExtractionStrategy 类:

 public class SemTextExtractionStrategy implements TextExtractionStrategy {

private String text;
StringBuffer str = new StringBuffer();
StringBuffer item = new StringBuffer();
StringBuffer cat = new StringBuffer();
StringBuffer desc = new StringBuffer();
float temp = 0;

@Override
public void beginTextBlock() {
}

@Override
public void renderText(TextRenderInfo renderInfo) {

    text = renderInfo.getText();

    Vector curBaseline = renderInfo.getBaseline().getStartPoint();
    Vector topRight = renderInfo.getAscentLine().getEndPoint();

    Rectangle rect = new Rectangle(curBaseline.get(0), curBaseline.get(1),
            topRight.get(0), topRight.get(1));
    float curFontSize = rect.getHeight();

    compare(text, curFontSize);


}

private void add(String text2, float curFontSize) {

    str.append(text2);
    System.out.println("str: " + str);
}

public void compare(String text2, float curFontSize) {
    // text2.getFont().getBaseFont().Contains("bold");
    // temp = curFontSize;
    boolean flag = check(text);
    if (temp == curFontSize) {

        str.append(text);

        /*
         * if (curFontSize == 11.222168){ item.append(str);
         * System.out.println(item); }else if (curFontSize == 10.420532){
         * desc.append(str); }
         */
        // str.append(text);
    } else {


         if (temp>9.8 && temp<10){
             String Contry= str.toString();
             System.out.println("Contry: "+Contry);

         }else if(temp>8 && temp <9){
             String itemPrice= str.toString();
             System.out.println("itemPrice: "+itemPrice);
         }else if(temp >7 && temp< 7.2){
             String captial= str.toString();
             System.out.println("captial: "+captial);
         }else if(temp >7.2 && temp <8){
             String city= str.toString();
             System.out.println("city: "+city);
         }else{
             System.out.println("size: "+temp+"   "+"str: "+str);
         }
        temp = curFontSize;
        // System.out.println(temp);
        str.delete(0, str.length());

        str.append(text);
    }

}

private boolean check(String text2) {

    return true;
}

@Override
public void endTextBlock() {
}

@Override
public void renderImage(ImageRenderInfo renderInfo) {
}

@Override
public String getResultantText() {
    return text;
}

}

4

1 回答 1

1

它是随机读取数据,我如何在不破坏序列的情况下从下到上读取数据,所以我可以将第一个单词放在第一类,第二个放在第二个等等。

不,不是随机的,而是按照内容流中相应绘制操作的顺序。

您的TextExtractionStrategy实现SemTextExtractionStrategy只是按照将文本转发给它的顺序使用文本,即绘制它的顺序。但是,绘图操作的顺序不必是阅读顺序,因为每个绘图操作都可以从页面上的自定义位置开始;如果在一页上使用多种字体,例如,可以按字体分组绘制文本。

如果要分析这样一个文档中的文本,首先要对得到的文本片段进行收集和排序,只有当页面中的所有文本都被解析后,才能开始分析。

LocationTextExtractionStrategy包含在 iText 发行版中)可以作为这样做的策略的示例。但是,它使用其内部类TextChunk来收集片段,并且此类不携带您在代码中使用的文本上升信息。

因此, ASemLocationTextExtractionStrategy必须使用扩展TextChunk类来保存该信息(或从中派生的一些信息,例如文本类别)。

此外,LocationTextExtractionStrategy唯一的排序从上到下,从左到右。如果您的 PDF 具有不同的设计,例如,如果它是多列的,那么您的排序必须进行调整,或者您必须使用过滤器并逐列分析页面。

顺便说一句,您确定字体大小的代码

Vector curBaseline = renderInfo.getBaseline().getStartPoint();
Vector topRight = renderInfo.getAscentLine().getEndPoint();

Rectangle rect = new Rectangle(curBaseline.get(0), curBaseline.get(1),
        topRight.get(0), topRight.get(1));
float curFontSize = rect.getHeight();

不返回实际字体大小,而只返回基线以上的上升。甚至仅适用于未旋转的文本;一旦旋转成为游戏的一部分,您的代码只会返回包围从基线开始到上升线结束的线的矩形的高度。从基线起点到上升线起点的直线长度至少与旋转无关。

或者有人知道一些更有效的方法吗?

您的任务似乎很大程度上取决于您尝试从中提取信息的 PDF。因此,如果没有该 PDF,有关更有效方法的提示将仍然含糊不清。

于 2014-01-15T09:16:14.013 回答