itext java pdf到文本创建

Posted

技术标签:

【中文标题】itext java pdf到文本创建【英文标题】:itext java pdf to text creation 【发布时间】:2012-11-30 11:31:14 【问题描述】:

我使用 itext 将 pdf 转换为文本文件, 它实际上工作得很好,但对于某些话,它做了以下事情: 例如,在 pdf 中有类似“提出主要思想”的短语,但 itext 会创建一个输出,如 “提出主要想法”。有没有办法纠正这种行为?

            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();
    

【问题讨论】:

添加一个 code-sn-p 和一个简短的解释,说明你到目前为止所做的尝试。 【参考方案1】:

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

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

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

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

float spacing = lastEnd.subtract(start).length();
if (spacing > renderInfo.getSingleSpaceWidth()/2f)

    result.append(' ');

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

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

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

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

【讨论】:

我实现了 MySimpleTextExtractionStrategy 并使用:` if (spacing > renderInfo.getSingleSpaceWidth()/4f) result.append(' '); //System.out.println("在'之前插入隐含空格" + renderInfo.getText() + "'"); ` 现在比以前好多了,我猜是 %90 的覆盖率,但 %100 是不可能的吧?? 它找到一个像这样的字符,例如单词是“差异”而不是结果变成“差异”; “ff”字符是单个字符... 双 f 作为单个字形是很常见的东西,即所谓的连字。还有其他典型的连字。对于文本搜索,您显然可能希望解决它们,但除此之外,连字就是页面上的字符。 是的,一旦您将 100% 的间隙识别为空格,那么您肯定也会错误地将一些原本不是空格的间隙识别为空格。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

text would read as "t e x t"

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

为了避免您可以在 mkl 概述的代码中使用固定值:

float spacing = lastEnd.subtract(start).length();
if (spacing > someFixValue)

    result.append(' ');

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

【讨论】:

以上是关于itext java pdf到文本创建的主要内容,如果未能解决你的问题,请参考以下文章

java 已经获取pdf代码,如何把他pdf文件保存到本机 要求用输出流做

java itext 创建pdf,直接返回输出流做成下载,怎么做

如何使用 iText 或 android 上的其他库创建 PDF 文件?

使用iText和ColdFusion创建PDF

Itext 在 PDF 中嵌入字体

itext android 印地语 pdf 创建