[转].NET下读取PDF文本

本文介绍了两种在.NET环境下读取PDF文本的方法:使用PDFBox和iTextSharp。PDFBox提供了强大的PDF处理功能,通过简单的API调用即可提取PDF文本;iTextSharp则更常用于PDF生成,但同样具备良好的PDF读取能力。

在.NET下读取PDF文本用到的类库主要有两个:PDFBox和iTextSharp

PDFBox

先说PDFBox,这个类库据说功能很强大,本人在这只是简单介绍一下:

1、下载PDFBox

下载地址:http://sourceforge.net/projects/pdfbox/

2、引用动态链接库

解压缩下载的PDFBox,找到其中的Bin目录,需要在项目中添加引用的dll文件有:

  1. IKVM.GNU.Classpath.dll
  2. PDFBox-0.7.3.dll
  3. FontBox-0.1.0-dev.dllI
  4. KVM.Runtime.dll

将以上4个文件引用到项目中,在文件中需要引入以下2个命名空间:

using org.pdfbox.pdmodel;
using org.pdfbox.util;

3、API的使用方法看代码:

using org.pdfbox.pdmodel;
using org.pdfbox.util;
public void pdf2txt(FileInfo file,FileInfo txtfile)
{
        PDDocument doc = PDDocument.load(file.FullName);
        PDFTextStripper pdfStripper = new PDFTextStripper();
        string text = pdfStripper.getText(doc);
        StreamWriter swPdfChange = new StreamWriter(txtfile.FullName, false, Encoding.GetEncoding("gb2312"));
        swPdfChange.Write(text);
        swPdfChange.Close();
}

iTextSharp

其实很多时候都是用于生成PDF,但是他读取PDF的能力也不差,使用如下:
下载地址:http://sourceforge.net/projects/itextsharp/

2、引用动态链接库

解压缩下载的压缩包里面的itextsharp-dll-core.zip,得到itextsharp.dll,在项目中添加引用itextsharp.dll即可 在文件中需要引入以下3个命名空间:

using iTextSharp; 
using iTextSharp.text; 
using iTextSharp.text.pdf;

3、API的使用方法看代码:

 private string OnCreated(string filepath)
        {
            try
            {
                string pdffilename = filepath;
                PdfReader pdfReader = new PdfReader(pdffilename);
                int numberOfPages = pdfReader.NumberOfPages;
                string text = string.Empty;

                for (int i = 1; i <= numberOfPages; ++i)
                {
                    byte[] bufferOfPageContent = pdfReader.GetPageContent(i);
                    text += System.Text.Encoding.UTF8.GetString(bufferOfPageContent);
                }
                pdfReader.Close();

                return text;
            }
            catch (Exception ex)
            {
                StreamWriter wlog = File.AppendText(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "\\mylog.log");
                wlog.WriteLine("出错文件:" + e.FullPath + "原因:" + ex.ToString());
                wlog.Flush();
                wlog.Close(); return null;
            }

        }

转:http://www.cnblogs.com/freeliver54/p/5048532.html

<think> 我们之前已经讨论过使用iTextSharpPdfPig来读取PDF文本内容并保存到DataSet。现在用户再次询问.NET环境下读取PDF内容的方法,我们可以在已有基础上进一步扩展,并提供更多细节和选择。 参考引用: [^1]: 提到可以使用.NET处理PDF文件,包括合并、打印等,还提到了二维码解析(但这不是当前问题的重点)。 [^2]: 展示了一个使用PDDocument(可能是PDFBox.NET版本)读取PDF文本的方法。 [^3]: 详细描述了使用iTextSharp读取PDF文本的代码示例,但注意其示例代码中直接使用GetPageContent返回的字节数组并换为字符串的方法可能不正确,因为PDF内容流是压缩的,应该使用PdfTextExtractor。 [^4]: 提到了在浏览器中编辑PDF,与当前问题关系不大。 因此,我们重点考虑以下方法: 1. iTextSharp(AGPL许可证,商用需注意) 2. PdfPig(Apache 2.0许可证,开源免费) 3. PDFBox(Apache 2.0许可证,.NET版本为PDFBox-Android或PDFSharp) 由于用户需求是读取PDF内容并保存到DataSet,我们将提供两种主要方法(iTextSharpPdfPig)的详细代码,并说明注意事项。 同时,根据引用[3]中提到的iTextSharp方法,但注意其示例代码有误,我们应使用正确的文本提取策略。 另外,引用[2]中使用了PDDocument,这是PDFBox的Java版本中的类,在.NET中对应的可能是PDFSharp,但PDFSharp主要用来创建PDF读取文本能力有限。因此,我们更推荐使用PdfPig。 下面给出两种推荐方法的代码示例: ### 方法1:使用iTextSharp(版本5.x) 步骤: 1. 通过NuGet安装iTextSharp:`Install-Package iTextSharp` 2. 使用`PdfReader`和`PdfTextExtractor`逐页提取文本 注意:iTextSharp在5.x版本是AGPL许可证,商用需要购买商业许可。 代码示例: ```csharp using System.Data; using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser; public DataSet ExtractPdfTextToDataSet(string filePath) { DataSet ds = new DataSet("PDFDataSet"); DataTable dt = new DataTable("PageText"); dt.Columns.Add("PageNumber", typeof(int)); dt.Columns.Add("Text", typeof(string)); using (PdfReader reader = new PdfReader(filePath)) { for (int i = 1; i <= reader.NumberOfPages; i++) { string pageText = PdfTextExtractor.GetTextFromPage(reader, i, new SimpleTextExtractionStrategy()); DataRow row = dt.NewRow(); row["PageNumber"] = i; row["Text"] = pageText; dt.Rows.Add(row); } } ds.Tables.Add(dt); return ds; } ``` ### 方法2:使用PdfPig(推荐,开源免费) 步骤: 1. 通过NuGet安装PdfPig:`Install-Package PdfPig` 2. 使用`PdfDocument.Open`读取文档,然后逐页提取文本 代码示例: ```csharp using System.Data; using UglyToad.PdfPig; using UglyToad.PdfPig.Content; public DataSet ExtractPdfWithPdfPig(string filePath) { DataSet ds = new DataSet("PdfPigDataSet"); DataTable dt = new DataTable("PDFContent"); dt.Columns.Add("Page", typeof(int)); dt.Columns.Add("Text", typeof(string)); using (PdfDocument document = PdfDocument.Open(filePath)) { foreach (Page page in document.GetPages()) { // 获取页面文本(按单词合并) string text = string.Join(" ", page.GetWords().Select(x => x.Text)); // 或者直接获取整个页面的文本(保留原始顺序) // string text = page.Text; DataRow row = dt.NewRow(); row["Page"] = page.Number; row["Text"] = text; dt.Rows.Add(row); } } ds.Tables.Add(dt); return ds; } ``` ### 注意事项 1. **文本提取的准确性**:PDF中的文本可能不是按阅读顺序排列的,特别是多栏布局时。PdfPig提供了`GetWords()`方法可以获取单词及其位置,便于二次排序。iTextSharp的`SimpleTextExtractionStrategy`有时顺序可能混乱,可以尝试`LocationTextExtractionStrategy`。 2. **加密PDF**:如果PDF有密码保护,需要在打开时提供密码。例如,在PdfPig中: ```csharp PdfDocument.Open(filePath, new ParsingOptions { Password = "password" }); ``` 3. **非文本PDF**:如果PDF是扫描的图片,则上述方法无法提取文本,需要使用OCR(如Tesseract)。 4. **性能**:对于大文件,建议分页处理,避免一次性加载全部内容导致内存不足。 ### 总结 在.NET环境下读取PDF内容,推荐使用PdfPig库(Apache 2.0许可证),它免费且功能强大。如果项目允许使用AGPL许可,也可以选择iTextSharp。两种方法都可以将提取的文本按页保存到DataSet中,便于后续处理或绑定到控件。 对于更高级的需求(如提取表格、图像等),可能需要使用专门的库或结合其他工具。 §§相关问题§§ 1. 如何提高从PDF中提取文本的准确性? 2. 如何处理加密的PDF文件? 3. 对于扫描版PDF(图片格式),如何提取文本? 4. 如何从PDF中提取表格数据并存入DataSet? </think> ### .NET环境下读取PDF内容的全面指南 在.NET环境中读取PDF内容,主要有以下几种方法,根据您的需求可选择不同方案: #### 方法1:使用iTextSharp(功能全面) ```csharp using System.Data; using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser; public DataSet ExtractPdfToDataSet(string filePath) { DataSet ds = new DataSet("PDFData"); DataTable dt = new DataTable("Content"); dt.Columns.Add("Page", typeof(int)); dt.Columns.Add("Text", typeof(string)); using (PdfReader reader = new PdfReader(filePath)) { for (int i = 1; i <= reader.NumberOfPages; i++) { // 使用高级文本提取策略提高准确性 ITextExtractionStrategy strategy = new LocationTextExtractionStrategy(); string text = PdfTextExtractor.GetTextFromPage(reader, i, strategy); DataRow row = dt.NewRow(); row["Page"] = i; row["Text"] = text; dt.Rows.Add(row); } } ds.Tables.Add(dt); return ds; } ``` **优点**:精确控制文本提取位置 **缺点**:AGPL许可证限制商业使用[^3] #### 方法2:使用PdfPig(开源免费) ```csharp using System.Data; using UglyToad.PdfPig; using UglyToad.PdfPig.Content; public DataSet ReadPdfWithPdfPig(string filePath) { DataSet ds = new DataSet(); DataTable dt = new DataTable("PDFContent"); dt.Columns.Add("Page", typeof(int)); dt.Columns.Add("Content", typeof(string)); dt.Columns.Add("WordCount", typeof(int)); // 示例扩展字段 using (PdfDocument document = PdfDocument.Open(filePath)) { foreach (Page page in document.GetPages()) { // 获取单词级文本信息 var words = page.GetWords(); string text = string.Join(" ", words.Select(w => w.Text)); DataRow row = dt.NewRow(); row["Page"] = page.Number; row["Content"] = text; row["WordCount"] = words.Count; // 示例统计数据 dt.Rows.Add(row); } } ds.Tables.Add(dt); return ds; } ``` **优点**:Apache 2.0许可证,完全免费[^1] #### 方法3:使用PDFBox.NET(Java移植版) ```csharp using System.Data; using org.apache.pdfbox.pdmodel; using org.apache.pdfbox.util; public DataSet ExtractWithPDFBox(string filePath) { DataSet ds = new DataSet(); PDDocument doc = PDDocument.load(filePath); PDFTextStripper stripper = new PDFTextStripper(); DataTable dt = new DataTable("PDFText"); dt.Columns.Add("FullText", typeof(string)); DataRow row = dt.NewRow(); row["FullText"] = stripper.getText(doc); dt.Rows.Add(row); doc.close(); ds.Tables.Add(dt); return ds; } ``` **特点**:适合整文档提取[^2] #### 关键对比表: | 库名称 | 许可证 | 文本提取精度 | 表格处理 | 安装命令 | |-------------|------------|--------------|----------|------------------------| | iTextSharp | AGPL[^3] | 高 | 优秀 | `Install-Package iTextSharp` | | PdfPig | Apache 2.0 | 高 | 良好 | `Install-Package PdfPig` | | PDFBox.NET | Apache 2.0 | 中等 | 基础 | `Install-Package PDFBox-Android` | #### 最佳实践建议: 1. **库选择**: - 商用项目首选PdfPig(避免AGPL限制) - 需要高级PDF操作选iTextSharp(生成/修改PDF) 2. **性能优化**: ```csharp // 分块处理大文件 var options = new ParsingOptions { UseSkipBytes = true, ClipPaths = true }; using (var document = PdfDocument.Open("large.pdf", options)) ``` $$ \text{内存消耗} \propto \frac{\text{文件大小}}{\text{处理块数量}} $$ 3. **数据绑定**: ```csharp // 在ASP.NET Core中展示 DataSet pdfData = ExtractPdfToDataSet("invoice.pdf"); return View(pdfData.Tables[0]); ``` 4. **处理加密PDF**: ```csharp PdfDocument.Open(filePath, new ParsingOptions { Password = "your-password" // 支持所有者密码和用户密码 }); ``` > **注意事项**: > - 扫描版PDF需配合OCR库(如Tesseract) > - 表格数据提取推荐使用iText7的pdf2Data模块 > - 中文PDF需验证编码:$$\text{正确率} = \frac{\text{识别字符数}}{\text{总字符数}} \times 100\%$$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值