使用iText从pdf文件中提取文本列

Rim*_*im 6 java pdf text-extraction itext

我需要使用iText从pdf文件中提取文本.

问题是:一些pdf文件包含2列,当我提取文本时,我得到一个文本文件,其中列被合并为结果(即同一行中两列的文本)

这是代码:

public class pdf
{
    private static String INPUTFILE = "http://www.revuemedecinetropicale.com/TAP_519-522_-_AO_07151GT_Rasoamananjara__ao.pdf" ;
    private static String OUTPUTFILE = "c:/new3.pdf";

    public static void main(String[] args) throws DocumentException, IOException {
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(OUTPUTFILE));
        document.open();

        PdfReader reader = new PdfReader(INPUTFILE);
        int n = reader.getNumberOfPages();

        PdfImportedPage page;

        // Go through all pages
        for (int i = 1; i <= n; i++) {
            page = writer.getImportedPage(reader, i);
            Image instance = Image.getInstance(page);
            document.add(instance);
        }

        document.close();

        PdfReader readerN = new PdfReader(OUTPUTFILE);
        for (int i = 1; i <= n; i++) {
            String myLine = PdfTextExtractor.getTextFromPage(readerN,i);
            System.out.println(myLine);

            try {             
                FileWriter fw = new FileWriter("c:/yo.txt",true);
                fw.write(myLine);
                fw.close();
            }catch (IOException ioe) {ioe.printStackTrace(); }
    }
}
Run Code Online (Sandbox Code Playgroud)

你能帮我完成这个任务吗?

Kev*_*Day 26

我是iText文本提取子系统的作者.您需要做的是开发自己的文本提取策略(如果您了解如何PdfTextExtractor.getTextFromPage实现,您将看到您可以提供可插入的策略).

如何确定列的开始和停止位置完全取决于您 - 这是一个难题 - PDF没有任何列的概念(哎呀,它甚至没有单词的概念 - 只是把它放在一起默认策略提供的文本提取非常棘手).如果您知道列的高级位置,那么您可以在文本渲染侦听器回调中使用区域过滤器(iText库中有代码用于执行此操作,最新版本的iText In Action书籍提供了详细示例) .

如果你需要从任意数据中获取列,你就会有一些算法工作(如果你得到了一些工作,我很乐意看看).关于如何处理这个问题的一些想法:

  1. 使用类似于默认文本提取策略(LocationAware ...)中使用的算法来获取单词列表和X/Y位置(确保也考虑旋转角度)
  2. 对于每个单词,绘制一条运行页面整个高度的虚线.扫描从相同X位置开始的所有其他单词.
  3. 扫描时,还要查找与X位置相交的单词(但不要在X位置开始).这将为您提供页面上列开始/停止Y位置的潜在位置.
  4. 一旦有了X和Y列,就可以使用区域过滤方法

另一种可能同样可行的方法是分析绘制操作并寻找长的水平和垂直线(假设列以类似于表的格式划分).目前,iText内容解析器没有针对这些操作的回调,但是可以毫无困难地添加它们.

  • 谢谢@kevin [PDF阅读器如何做得这么好?](http://stackoverflow.com/questions/22675690/if-identifying-text-structure-in-pdf-documents-is-so-difficult-how-do -pdf-里德) (2认同)
  • @ david004我非常怀疑PDF阅读器在所有PDF文件上都做得非常出色.使用我们在单词之间插入的分隔符(这是我怀疑PDF阅读器应用程序正在进行的操作)可能会更加聪明.基本上,如果一个字符和下一个字符之间的距离大于某个阈值(可能是空格字符宽度的两倍?),请使用制表符而不是空格.对于很多场景来说这可能已经足够了 - 但对于通用解析来说肯定不够好.如果它会有所帮助,我可以考虑添加标签插入行为...... (2认同)