使用iText进行PDF文本提取

13

我们正在进行信息提取的研究,并希望使用iText。

我们正在探索iText。根据我们所审查的文献,iText是使用的最佳工具。在iText中是否可能按行从pdf中提取文本?我已经阅读了StackOverflow上与我的问题相关的一个问题帖子,但它只能读取文本而不能提取它。能否有人帮助我解决这个问题?谢谢。


3
我不完全清楚你在做什么。阅读文本和提取文本通常是相同的。iText 不会为你将文本保存到文件中,但一旦你有了文本,你应该能够很容易地完成保存过程。只要文本确实是文本(而不是轮廓或位图),iText 可以非常出色地提取文本。在搜索本网站时,也可以查找 iTextSharp,它是 iText 的 .Net 端口。它有更多的问题/答案,对于 C#,代码几乎完全相同。 - Chris Haas
3个回答

21

就像Theodore所说的那样,您可以从PDF中提取文本,就像Chris指出的那样

只要它实际上是文本(而不是轮廓或位图)

最好的方法是购买Bruno Lowagie的书Itext in Action。在第二版的第15章中介绍了如何提取文本。

但是您可以查看他的网站以获取示例。http://itextpdf.com/examples/iia.php?id=279

然后,您可以解析它以创建一个纯文本文件。 以下是代码示例:

/*
 * This class is part of the book "iText in Action - 2nd Edition"
 * written by Bruno Lowagie (ISBN: 9781935182610)
 * For more info, go to: http://itextpdf.com/examples/
 * This example only works with the AGPL version of iText.
 */

package part4.chapter15;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;

import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
import com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy;
import com.itextpdf.text.pdf.parser.TextExtractionStrategy;

public class ExtractPageContent {

    /** The original PDF that will be parsed. */
    public static final String PREFACE = "resources/pdfs/preface.pdf";
    /** The resulting text file. */
    public static final String RESULT = "results/part4/chapter15/preface.txt";

    /**
     * Parses a PDF to a plain text file.
     * @param pdf the original PDF
     * @param txt the resulting text
     * @throws IOException
     */
    public void parsePdf(String pdf, String txt) throws IOException {
        PdfReader 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());
            out.println(strategy.getResultantText());
        }
        reader.close();
        out.flush();
        out.close();
    }

    /**
     * Main method.
     * @param    args    no arguments needed
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        new ExtractPageContent().parsePdf(PREFACE, RESULT);
    }
}

注意许可证

此示例仅适用于iText的AGPL版本。

如果您查看其他示例,它将展示如何省略文本的某些部分或如何提取pdf的某些部分。

希望这有所帮助。


这个程序运行得非常好,没有任何修改!感谢Bruno和你指出它。 - gsl

3
iText可以实现这一点,但是无法保证文本块的粒度,这取决于生成您的文档所使用的实际pdf渲染器。很可能每个单词甚至每个字母都有自己的文本块。这些文本块也不需要按词汇顺序排列,为了获得可靠的结果,您可能需要根据它们的坐标重新排序文本块。此外,您可能还需要计算是否需要在文本块之间插入空格。

1
在较新版本的iText中:
public static void main(String[] args) throws Exception {
    try (var document = new PdfDocument(new PdfReader("your.pdf"))) {
        var strategy = new SimpleTextExtractionStrategy();
        for (int i = 1; i < document.getNumberOfPages(); i++) {
            String text = PdfTextExtractor.getTextFromPage(document.getPage(i), strategy);
            System.out.println(text);
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接