当前位置: 首页 > 面试题库 >

itext java pdf到文本创建

姚向晨
2023-03-14
问题内容

我使用itext将pdf转换为文本文件,它实际上工作良好,但是对于某些词它可以完成以下操作:例如,在pdf中,有诸如“ present the main
idea”之类的短语,但是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();
    }
}

问题答案:

缺少空格字符的原因是,您在渲染的PDF中看到的空格不一定与PDF页面内容描述中的空格相对应。取而代之的是,您通常会在PDF中找到一个操作,该操作在渲染一个单词后将当前位置稍微向右移,然后再渲染下一个单词。

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

因此,在这种情况下,PDF解析器必须使用试探法来确定这种移位是否意味着暗含空格字符,还是仅意味着使字母组看起来更好。试探法可能会失败。

SimpleTextExtractionStrategy用作文本提取策略。这种情况下的试探法是这样实现的(如当前在iText
SVN干线renderText中的SimpleTextExtractionStrategy.java中的方法中一样):

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

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

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

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

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



 类似资料:
  • 问题内容: 我一直在阅读和谷歌搜索,但似乎找不到这个简单的答案。 我有一个读取文件的功能,但是如果文件不存在,则会出现混乱。我想做的是一个函数,该函数在读取之前会检查文件是否存在,如果不存在,则会创建一个空文件。这就是我所拥有的。 问题答案: 不要尝试先检查是否存在,因为如果同时创建了文件,那么您将面临一场竞赛。您可以打开带有标志的文件以创建该文件(如果不存在):

  • 问题内容: 如果我在不带字符“ |”的脚本下运行 它正常工作,但是当我添加字符“ |”时 如何添加字符“ |”不起作用 使用sql脚本将文本文件? 谢谢 问题答案: 管道字符在批处理命令中具有特殊含义,因此必须使用脱字符将其转义。这应该工作: 尽管这实际上不是将数据写入文本文件的好方法:通常,SQL Server不应具有写入C:驱动器根目录的权限,并且默认情况下处于禁用状态。我建议你看看喜欢的替代

  • 问题内容: 我想打开一个本地文件,并返回一个。原因是我需要向正在使用的库中提供,例如: 问题答案: 返回一个 http://play.golang.org/p/BskGT09kxL

  • 问题内容: 我想在此处创建的文件夹中创建一个文本文件。 但是此代码不会将文本文件创建到该文件夹​​中。而是将文本文件放置在该文件夹之外。 问题答案: java.io.File的构造函数之一带有一个父目录。您可以改为:

  • 我有一个下拉列表,由选择元素初始化。 如何创建mvvm绑定到选定的数据文本字段? 我没有数据源。 我必须绑定到选定的文本。例如:和 更新

  • 使用log4j library 1.1.4和slf4j-api 1.7.25在我的应用程序中进行日志记录可以很好地工作。 但是在将log4j库从1.1.4版本更新到1.1.5(或更高版本)之后,日志文件只会停止创建,不会产生任何异常或警告。即使是1.1.5版本也相当老,所以我宁愿使用更新的版本。配置的工作方式一定发生了变化,但我找不到是什么。 这段简单的代码将在Log4J1.1.4中创建滚动日志文