使用C#提取PDF指定文本并转为结构化JSON/Excel的问题咨询
问题根因
你当前的核心问题是没有对PDF提取出的原始文本做结构化解析,直接将整段长字符串传入JsonConvert.SerializeObject,序列化的结果自然只是带转义的纯字符串,不会生成键值对结构的JSON。
解决思路
你现有Spire套件完全可以覆盖需求,无需引入其他依赖,按以下步骤调整即可:
- 原始文本预处理:将PDF提取的文本按行拆分,过滤空行、去除每行首尾空白字符
- 结构化解析:根据你提供的样例结构编写解析逻辑,将每行内容转换为键值对存入字典
- 输出结构化数据:可选择序列化字典得到目标格式JSON,或直接将字典内容写入Excel
1. 新增文本解析逻辑
添加解析方法将原始文本转为Dictionary<string, string>:
using System.Collections.Generic; using System.Text.RegularExpressions; private static Dictionary<string, string> ParseTermSheetText(string rawText) { var result = new Dictionary<string, string>(); // 按换行符拆分文本,过滤空行 var lines = rawText.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries) .Select(l => l.Trim()) .Where(l => !string.IsNullOrEmpty(l)) .ToList(); if (lines.Count < 5) return result; // 样例最少5行,可根据实际调整 // 处理前两行Analysis字段 result.Add("Analysis", lines[1]); // 处理后续键值对行,用2个以上空格作为分隔符拆分 for (int i = 2; i < lines.Count; i++) { var parts = Regex.Split(lines[i], @"\s{2,}"); // 匹配2个及以上连续空格 if (parts.Length >= 2) { var key = parts[0].Trim(); var value = string.Join(" ", parts.Skip(1)).Trim(); if (!result.ContainsKey(key)) { result.Add(key, value); } } } return result; }
2. 调整序列化逻辑
修改Serialize_into_Json方法,直接序列化解析得到的字典:
private static string Serialize_into_Json(Dictionary<string, string> data) { // 格式化输出JSON,缩进可按需移除 return JsonConvert.SerializeObject(data, Newtonsoft.Json.Formatting.Indented); }
3. 调整Convert_To_Json_Format方法
private void Convert_To_Json_Format(string baseTextFile) { string streamText = new StreamReader(baseTextFile).ReadToEnd(); // 先解析为结构化字典 var structuredData = ParseTermSheetText(streamText); // 序列化得到目标JSON string serializeData = Serialize_into_Json(structuredData); string newFile = @"my_disk:\my_path\structured_data.json"; File.WriteAllText(newFile, serializeData); // 直接导出Excel可选,无需经过JSON ExportToExcel(structuredData, @"my_disk:\my_path\output.xlsx"); System.Diagnostics.Process.Start(newFile); }
4. 新增Excel导出方法(可选,直接用Spire.Xls实现)
private void ExportToExcel(Dictionary<string, string> data, string outputPath) { Spire.Xls.Workbook workbook = new Spire.Xls.Workbook(); workbook.CreateEmptySheets(1); Spire.Xls.Worksheet sheet = workbook.Worksheets[0]; // 写入表头 sheet.Range[1, 1].Text = "字段名"; sheet.Range[1, 2].Text = "字段值"; // 写入键值对 int rowIndex = 2; foreach (var item in data) { sheet.Range[rowIndex, 1].Text = item.Key; sheet.Range[rowIndex, 2].Text = item.Value; rowIndex++; } // 自动调整列宽 sheet.AllocatedRange.AutoFitColumns(); workbook.SaveToFile(outputPath, Spire.Xls.ExcelVersion.Version2016); }
拓展说明
如果后续PDF结构有变化,比如键值对顺序不固定,可以改为关键词匹配解析:检测行文本是否包含目标字段名(如Reference Date),匹配成功后直接提取该行后半部分作为对应值,适配性更强。
内容的提问来源于stack exchange,提问作者James06
相关产品推荐
相关产品推荐

