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

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

}

}

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

回答:

我是iText文本提取子系统的作者。您需要做的是开发自己的文本提取策略(如果您看一下如何PdfTextExtractor.getTextFromPage实现的话,就会发现您可以提供可插拔的策略)。

您将如何确定列的开始和停止位置完全取决于您-这是一个难题-PDF没有列的任何概念(哎呀,它甚至没有词的概念-

只是将列放在一起默认策略提供的文本提取非常棘手)。如果您知道高级列的位置,则可以在文本渲染侦听器回调中使用区域过滤器(iText库中有代码可以执行此操作,最新版本的《

iText In Action》提供了详细示例) 。

如果需要从任意数据中获取列,则需要先进行一些算法工作(如果有工作的话,我很乐意看一下)。有关如何解决此问题的一些想法:

  1. 使用类似于默认文本提取策略(LocationAware …)中使用的算法,以获取单词和X / Y位置的列表(一定要同时考虑旋转角度)
  2. 对于每个单词,画一条假想的线贯穿页面的整个高度。扫描以相同的X位置开头的所有其他单词。
  3. 扫描时,还要查找与X位置相交的单词(但不要以X位置开头)。这将为您提供页面上列起始/终止Y位置的潜在位置。
  4. 有了X和Y列后,就可以采用区域过滤方法

另一种可能同样可行的方法是分析绘制操作并查找长的水平和垂直线(假定列以表格形式划分)。现在,iText内容解析器没有这些操作的回调,但是可以很容易地添加它们。

以上是 使用iText从pdf文件中提取文本列 的全部内容, 来源链接: utcz.com/qa/413683.html

回到顶部