java - itext java pdf 到文本创建

标签 java itext pdftotext

我使用 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();
    }
}

最佳答案

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

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

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

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

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

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

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

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

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

关于java - itext java pdf 到文本创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13644419/

相关文章:

java - 更新查询在 mysql 中有效,但在 netbeans 中无效

java - 更改音频文件的音量并使用java.sound.sampled保存文件

java - iText DataMatrix 条码分辨率和质量

java - 如何使用 iText 在 (x,y) 位置的文档中将 PdfPTable 添加到 HTML 字符串?

java - 在 Itext 中添加希伯来字母注释

php - shell_exec() 不执行 pdftotext 命令

java - 我想使用java在PDF文档中添加一行

java - 在 Java 中使用递归的字符串排列

java - 如何手动安装 java 库并将/tmp 保持为 noexec?

pdf - 如何从命令行以CSV格式从PDF提取表数据?