c# - 如何读表?
问题描述
我在 PDF 文件中有一个时间表。
(1) (2) (3)
09:00 10:30 11:30
Monday 12C 11B 10A
Tuesday 10K 10K 9A
Wednesday 7A
Thursday 7B 7B
Friday 6A 11B
我正在使用 iTextSharp 阅读所有文本。
private static string ReadFile(string path)
{
using (var reader = new PdfReader(path))
{
var text = new StringBuilder();
for (var i = 1; i <= reader.NumberOfPages; i++)
text.Append(PdfTextExtractor.GetTextFromPage(reader, i));
return text.ToString();
}
}
此文本响应行如下所示:
(1) (2) (3)
09:00 10:30 11:30
12C 11B 10A
Monday
10K 10K 9A
Tuesday
7A
Wednesday
B 7B
Thursday
6A 11B
Friday
所以我无法理解哪个课在哪个时间?例如,星期三有 7A 班,但哪个时间(09:00 或 10:30 或 11:30)?如果它写一个空格字符( ),我可以理解。
(1) (2) (3)
09:00 10:30 11:30
12C 11B 10A
Monday
10K 10K 9A
Tuesday
  7A  
Wednesday
B 7B  
Thursday
6A   11B
Friday
这可能使用 iTextSharp 吗?
解决方案
这在一般情况下是不可能的。
如果您的 PDF 文档没有标记,则文档本身不包含结构信息。或者简单地说,文档不知道哪些部分是表格,或者表格行,甚至是段落。
从未标记的 PDF 文档中提取结构信息很困难。如果不是说在一般情况下是不可能的。
使用 pdf2Data,您可以实现这一点。需要注意的是,您必须预先定义模板。所以你需要告诉软件它可以在哪里找到一张桌子。
你可以SimpleTextExtractionStrategy
在iText
. 它本质上处理所有渲染信息,并决定何时将文本连接到现有缓冲区。
在代码中的某个点,它决定如果缓冲区已经以空格结尾,则不应再添加空格。
我建议您创建自己的实现SimpleTextExtractionStrategy
来覆盖此行为并始终插入空格。
推荐阅读
- game-engine - gdscript 全局变量值在 get_tree().reload_current_scene() 之后没有改变
- apache-spark - 默认情况下,Spark sql 模式中的可空性是建议性的。严格执行它的最佳方法是什么?
- swift - 如何初始加载 UITableView 然后观察 Firebase 节点以更改在 Swift 中刷新 tableview?
- azure-devops - 防止用户在 Azure Devops (VSTS) 中创建没有父级的工作项
- tensorflow - 从 tensorflow 中的 .tfrecords 文件获取路径
- css - 如何自动调整引导导航栏中的下拉框不超过页面宽度?
- python - 正则表达式匹配一定数量的字符 + 正则表达式与罗马数字
- javascript - 比较两个数组并过滤条件
- rust - 如何在 gtk-rs 中监听剪贴板“所有者更改”事件?
- react-native - 我正在使用 https://github.com/alinz/react-native-share-extension 我的应用程序在 bot ios 和 android 上崩溃(不断停止)