【发布时间】:2011-09-11 09:16:36
【问题描述】:
我目前正在构建一个 .NET 应用程序,其中一项要求是它必须将 pdf 文件转换为 XML 文件。有没有人成功做到这一点?如果有,你用过什么?
【问题讨论】:
-
您要“转换”哪种 pdf? PDF 文件不是“结构化的”,因此通常从它们中提取信息是一项艰巨的任务。我认为您应该详细说明您要达到的目标。
我目前正在构建一个 .NET 应用程序,其中一项要求是它必须将 pdf 文件转换为 XML 文件。有没有人成功做到这一点?如果有,你用过什么?
【问题讨论】:
我以前做过很多次这种项目。
你需要做的事情:
1.) 查看这个项目Extract Text from PDF in C#。该项目使用 ITextSharp。
PDFParser 类
1 使用系统; 2 使用 System.IO; 3 使用iTextSharp.text.pdf; 4 5 命名空间 PdfToText 6 { 7 /// 8 /// 解析 PDF 文件并从中提取文本。 9 /// 10 公共类PDFParser 11 { 12 /// BT = 文本对象运算符的开始 13 /// ET = 文本对象运算符的结束 14 /// Td 移动到下一行的开头 15 /// 5 Ts = 上标 16 /// -5 Ts = 下标 17 18 #region 字段 19 20 #region _numberOfCharsToKeep 21 /// 22 /// 提取文本时要保留的字符数。 23 /// 24 私有静态 int _numberOfCharsToKeep = 15; 25 #结束区域 26 27 #结束区域 28 29 #区域提取文本 30 /// 31 /// 从 PDF 文件中提取文本。 32 /// 33 /// pdf文件的完整路径。 34 /// 输出文件名。 35 /// 提取的文本 36 public bool ExtractText(string inFileName, string outFileName) 37 { 38 StreamWriter outFile = null; 39 尝试 40 { 41 //为给定的PDF文件创建一个阅读器 42 PdfReader 阅读器 = 新 PdfReader(inFileName); 43 //outFile = File.CreateText(outFileName); 44 outFile = new StreamWriter(outFileName, false, System.Text.Encoding.UTF8); 45 46 Console.Write("处理中:"); 47 48 整数总长度 = 68; 49 float charUnit = ((float)totalLen) / (float)reader.NumberOfPages; 50 int totalWritten= 0; 51 浮动 curUnit = 0; 52 53 for (int page = 1; page = 1.0f) 59 { 60 for (int i = 0; i = 1.0f) 70 { 71 for (int i = 0; 我 104 /// 此方法处理未压缩的 Adobe(文本)对象 105 /// 并提取文本。 106 /// 107 /// 未压缩 108 /// 109 私有字符串 ExtractTextFromPDFBytes(byte[] 输入) 110 { 111如果(输入==空||输入。长度== 0)返回“”; 112 113试试 114 { 115 字符串结果字符串 = ""; 116 117 // 显示我们当前是否在文本对象中的标志 第118章 119 120 // 显示下一个字符是否为文字的标志 121 // 例如'\\' 获取 '\' 字符或 '\(' 获取 '(' 122布尔下一个文字=假; 123 124 // () 括号嵌套级别。文本出现在 () 内 125 int括号深度= 0; 126 127 // 保留以前的字符以获取提取数字等: 128 字符 [] 以前的字符 = 新字符 [_numberOfCharsToKeep]; 129 for (int j = 0; j = ' ') && (c = 128) && (c 235 /// 检查某个 2 字符标记是否刚刚出现(例如 BT) 236 /// 237 /// 搜索到的令牌 238 /// 最近的字符数组 239 /// 240 私有 bool CheckToken(string[] tokens, char[] 最近) 第241章 242 foreach(令牌中的字符串令牌) 第243章 第244章 245(最近 [_numberOfCharsToKeep - 2] == 令牌 [1])&& 246((最近[_numberOfCharsToKeep-1] =='')|| 247(最近[_numberOfCharsToKeep - 1] == 0x0d)|| 248(最近[_numberOfCharsToKeep-1] == 0x0a))&& 249((最近[_numberOfCharsToKeep-4] =='')|| 250(最近[_numberOfCharsToKeep - 4] == 0x0d)|| 251(最近[_numberOfCharsToKeep - 4] == 0x0a)) 252) 第253章 254返回真; 第255章 第256章 257 返回错误; 第258章 第259章 260 } 第261章2.) 解析提取的文本并创建 xml 文件。
我之前的一些担忧是 pdf 文件在页面内包含损坏的链接或 url。现在,以防万一您也担心这个问题,正则表达式可以轻松解决您的问题,但我建议您稍后再处理。
现在这里是一个关于如何创建 xml 的示例代码。了解代码是如何工作的,以后你就会知道如何处理自己的代码。
希望对您有所帮助:)
【讨论】:
您可以使用iTextSharp 等pdf 库来查询您的pdf 文件。一旦您访问了您需要的数据,您就可以轻松地创建一个 xml 文件。网上有大量关于如何使用 c# 和其他 .net 语言创建 xml 文件的信息。如果您有具体问题,请提出;-)
【讨论】:
我最终使用了 Byte Scout's PDF Extractor SDK 。效果很好。
【讨论】:
看看 pdf2Data。
http://itextpdf.com/blog/pdf2data-extract-information-invoices-and-templates
它基于模板将 pdf 文件转换为 XML 文件。模板是使用选择器定义的,允许最终用户指定诸如“选择第二页上的表格”或“选择以这种特定字体编写的文本”等内容。
请记住,我隶属于 iText,因此即使我对 PDF 的了解很广,我也可能被认为偏向于 iText 产品(因为我帮助开发它们)。
【讨论】: