使用ItextSharp读取C#中的PDF列

时间:2014-08-26 05:24:27

标签: c# itextsharp

在我的程序中,我从PDF文件中提取文本,效果很好。 ItextSharp逐行从PDF中提取文本。但是,当PDF文件包含2列时,提取的文本不正常,因为每行连接两列。

我的问题是:如何逐列提取文本?

以下是我的代码。 PDF文件是阿拉伯语。对不起,我的英语不太好。

PdfReader reader = new PdfReader(@"D:\test pdf\Blood Journal.pdf");
int intPageNum = reader.NumberOfPages;
string[] words;
string line;

for (int i = 1; i <= intPageNum; i++)
{
    text = PdfTextExtractor.GetTextFromPage(reader, i, 
               new LocationTextExtractionStrategy());

    words = text.Split('\n');
    for (int j = 0, len = words.Length; j < len; j++)
    {
        line = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(words[j]));
        // other things here
    }

    // other things here
}

1 个答案:

答案 0 :(得分:3)

您可能希望使用RegionTextRenderFilter来限制列区域,然后使用LocationTextExtractionStrategy来提取文本。但是,这需要您正在解析的PDF文件的先验知识,即您需要有关列的位置和大小的信息。

更详细地说,您需要传入列的坐标以定义矩形,然后从该矩形中提取文本。样本将是这样的:

PdfReader reader = new PdfReader(@"D:\test pdf\Blood Journal.pdf");
int intPageNum = reader.NumberOfPages;    

private string GetColumnText(float llx, float lly, float urx, float ury)
{
    // reminder, parameters are in points, and 1 in = 2.54 cm = 72 points
    var rect = new iTextSharp.text.Rectangle(llx, lly, urx, ury);

    var renderFilter = new RenderFilter[1];
    renderFilter[0] = new RegionTextRenderFilter(rect);

    var textExtractionStrategy =
            new FilteredTextRenderListener(new LocationTextExtractionStrategy(),
                                           renderFilter);

    var text = PdfTextExtractor.GetTextFromPage(reader, intPageNum,
                                                textExtractionStrategy);

    return text;
}

这是另一篇讨论你想要的内容的帖子,你也可以查一下:iTextSharp - Reading PDF with 2 columns。但是他们也没有找到解决方案:(