1

我使用 itext 将 pdf 转换为文本文件,它实际上效果很好,但对于某些单词,它会执行以下操作:例如,在 pdf 中有类似“提出主要思想”的短语,但 itext 创建了一个类似“presentthemainideas”的输出。无论如何要纠正这种行为?

            String pdf="/home/can/Downloads/NLP/textSummarization/A New Approach for  Multi-Document Update Summarization.pdf";
    String txt="/home/can/myWorkSpace/PDFConverterProject/outputs/bb.txt";
    StringBuffer text=new StringBuffer() ;
    String resultText="";
    PdfReader reader;
    try {
        reader = new PdfReader(pdf);
        PdfReaderContentParser parser = new PdfReaderContentParser(reader);
        PrintWriter out = new PrintWriter(new FileOutputStream(txt));
        TextExtractionStrategy strategy;
        for (int i = 1; i <= reader.getNumberOfPages(); i++) {
            strategy = parser.processContent(i, new SimpleTextExtractionStrategy());
            text.append(strategy.getResultantText());

        }
        resultText=text.toString();
        resultText = resultText.replaceAll("-\n", "");
        out.println("-->"+resultText);

        StringTokenizer stringTokenizer=new StringTokenizer(resultText, "\n");
        PrintWriter lineWriter = new PrintWriter(new FileOutputStream("/home/can/myWorkSpace/PDFConverterProject/outputs/line.txt"));
        while (stringTokenizer.hasMoreTokens()){
            String curToken = stringTokenizer.nextToken();
            lineWriter.println("line-->"+curToken);
        }
        lineWriter.flush();
        lineWriter.close();
        out.flush();
        out.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
4

3 回答 3

8

出现这种缺失空格字符的原因是您在呈现的 PDF 中看到的空格不一定与 PDF 的页面内容描述中的空格字符相对应。相反,您经常会在 PDF 中发现一个操作,它在渲染一个单词后将当前位置稍微向右移动,然后再渲染下一个单词。

不幸的是,同样的机制也被用来增强相邻字形的外观:在某些字母组合中,为了获得良好的外观和阅读体验,字形应该打印得比默认情况下更接近或更远。这是使用与上述相同的操作在 PDF 中完成的。

因此,在这种情况下,PDF 解析器必须使用启发式方法来确定这种转变是为了暗示一个空格字符,还是仅仅为了使字母组看起来更好。启发式可能会失败。

SimpleTextExtractionStrategy用作文本提取策略。这种情况下的启发式方法是这样实现的(目前在iText 5.x github git develop 分支的SimpleTextExtractionStrategy.javarenderText中的方法中):

float spacing = lastEnd.subtract(start).length();
if (spacing > renderInfo.getSingleSpaceWidth()/2f)
{
    result.append(' ');
}

因此,至少为空格字符的当前宽度一半宽的间隙被转换为空格字符。

这通常听起来很明智。但是,对于仅使用水平移位来分隔单词的文档,实际空格字符的当前宽度可能不是启发式方法的好衡量标准。

因此,您可以做的是尝试改进文本提取策略中的启发式方法。复制现有的,对其进行操作,然后在您的代码中使用它。

如果您为您的问题提供示例 PDF,我们可能会提供一些帮助。

于 2012-11-30T12:23:11.440 回答
1

您可以使用碧玉报告。它就像一个魅力

于 2013-07-01T13:56:22.843 回答
1

为了扩展 mkl 的精彩解释,这里是问题中提出的问题的具体变体的详细信息。我偶然发现了一个我想从中提取文本的文档。每个字母都用空格隔开。

text would read as "t e x t"

我尝试实现我自己的提取策略类,如 mkl 所述。无论我尝试将哪个因素应用于“单个空间宽度”值,文本的输出方式都与以前相同。所以我调试了我的代码来查看宽度值本身,结果是0

为了避免这种情况,您可以在 mkl 概述的代码中使用修复值:

float spacing = lastEnd.subtract(start).length();
if (spacing > someFixValue)
{
    result.append(' ');
}

如果您将自己的提取策略基于LocationTextExtractionStrategy,则要覆盖的方法是:IsChunkAtWordBoundary(...)

于 2015-12-22T09:05:57.767 回答