c#抽取pdf文档标题(1) c反应蛋白高说明什么

   2023-02-08 学习力0
核心提示:首先看看我的项目结构:从上面的结果图中,我们可以看出,主要用了两个库:itextsharp.dll 和 pdfbox-1.8.9.dll,dll文件夹存放引用的库,handles文件夹存放抽取的处理代码,lib文件夹中,相当于数据库中的DBHelp类的作用。model文件夹就不用介绍了,大家都知

首先看看我的项目结构:

c#抽取pdf文档标题(1)

从上面的结果图中,我们可以看出,主要用了两个库:itextsharp.dll 和 pdfbox-1.8.9.dll,dll文件夹存放引用的库,handles文件夹存放抽取的处理代码,lib文件夹中,相当于数据库中的DBHelp类的作用。model文件夹就不用介绍了,大家都知道。

我们从大的逻辑开始介绍,TitleHandle类中有一个方法:

c#抽取pdf文档标题(1)

从此方法可以看出,它接收两个参数:block和isTrainModel,返回 HandleResult类型。

我们先来看看Block的定义:

c#抽取pdf文档标题(1)

块由行构成,我们再看看Line的定义:

c#抽取pdf文档标题(1)

行由单词构成,再来看Word定义:

c#抽取pdf文档标题(1)

它其实是一个词的集合,WordMeta是一个单词的信息,它下面还有一层结构 WordInfo类,这个类是最基础的类,它代表了pdf文档中一个字符信息,底层基础决定上层建筑:

 1   public class WordInfo
 2     {
 3         /// <summary>
 4         /// x坐标
 5         /// </summary>
 6         public float X { set; get; }
 7         /// <summary>
 8         /// y坐标
 9         /// </summary>
10         public float Y { set; get; }
11 
12         public int XSize { set; get; }
13 
14         public int YSize { get; set; }
15 
16         public float XDirAdj { set; get; }
17 
18         public float YDirAdj { set; get; }
19 
20         /// <summary>
21         /// 字号
22         /// </summary>
23         public float FontSize { set; get; }
24 
25         public float Xscale { set; get; }
26 
27         public float Yscale { set; get; }
28         /// <summary>
29         /// 高度
30         /// </summary>
31         public float Height { set; get; }
32 
33         /// <summary>
34         /// 空格大小
35         /// </summary>
36         public float Space { set; get; }
37         /// <summary>
38         /// 宽度
39         /// </summary>
40         public float Width { set; get; }
41         /// <summary>
42         /// 子字体
43         /// </summary>
44         public string Subfont { set; get; }
45         /// <summary>
46         /// 基本字体
47         /// </summary>
48         public string Basefont { set; get; }
49         /// <summary>
50         /// 是否加粗
51         /// </summary>
52         public bool IsBold { set; get; }
53         /// <summary>
54         /// 是否倾斜
55         /// </summary>
56         public bool IsItalic { set; get; }
57         /// <summary>
58         /// 单词
59         /// </summary>
60         public string Word { set; get; }
61 
62         public override string ToString()
63         {
64             return "String[" + this.XDirAdj + ","
65                  + this.YDirAdj
66                  + " fs=" + this.FontSize
67                  + " xscale=" + this.Xscale
68                  + " isBold=" + this.IsBold
69                  + " space=" + this.Space
70                  + " isItalic=" + this.IsItalic
71                  + "xSize" + this.XSize
72                  + "ySize" + this.YSize
73                  + " width=" + this.Width + "]"
74                  + this.Word;
75         }
76         /// <summary>
77         /// 计算当前字符和lastChunk的距离
78         /// </summary>
79         /// <param name="lastChunk"></param>
80         /// <returns></returns>
81         public float DistanceFromEndOf(WordInfo lastChunk)
82         {
83             return this.X - lastChunk.X - lastChunk.Width;
84         }
85 
86 
87     }

这个类包括了字符的位置,大小,粗细等等信息。这些信息是基础当中的基础,因此非常重要,给我们判断一个块是否是标题,提供了依据,相当于国之宪法。

从我解剖出来的结构看,解析出pdf标题,关键有两点:

第一,如何正确地划分块,把具有相同格式的多行文字划分到一个块中,这样就形成了一个块的字典集合,也就是Block类中的字典类型:Dictionary<int, List<WordMeta>>。

        分块也有难点,有很多上标和下标的句子,也有很多非常相似的块,可能分错。比如标题的块和作者的块,文字格式如果非常接近的话,就很容易把作者和标题划分到同一个块中,这给后面的工作带来了麻烦,以至于提取了错误的标题。

第二,如何从众多的块中筛选出标题。

        此处也采取了很多筛选策略。

       1、根据块长度,淘汰字符长度太短的。

       2、根据块位置,淘汰位置太偏的。

       3、评分机制,根据块的特征信息,计算出一个0-1之间的数值来,然后选取第一名和第二名的块。

       4、在第一名和第二名之间选择。根据它们的位置,字符长度,分值,块的高度,块所包含的单词数等来判断。

 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 使用C#编写一个.NET分析器(一) 使用csv模块的什么方法可以一次性将一行数据写入文件
    使用C#编写一个.NET分析器(一) 使用csv模块的
    译者注这是在Datadog公司任职的Kevin Gosse大佬使用C#编写.NET分析器的系列文章之一,在国内只有很少很少的人了解和研究.NET分析器,它常被用于APM(应用性能诊断)、IDE、诊断工具中,比如Datadog的APM,Visual Studio的分析器以及Rider和Reshaper等等。之前
    03-08
  • 跨语言调用C#代码的新方式-DllExport 跨语言调用本质
    跨语言调用C#代码的新方式-DllExport 跨语言调
    简介上一篇文章使用C#编写一个.NET分析器文章发布以后,很多小伙伴都对最新的NativeAOT函数导出比较感兴趣,今天故写一篇短文来介绍一下如何使用它。在以前,如果有其他语言需要调用C#编写的库,那基本上只有通过各种RPC的方式(HTTP、GRPC)或者引入一层C++
    03-08
  • 我比较了 Go 和 C# 的速度
    我比较了 Go 和 C# 的速度
    我在 Go 和 C# 之间进行了速度比较。我通常使用 C#,但我有机会使用 Go,并且由于传闻 Go 速度很快,所以我实际测量了它。测量内容我在 Go 和 C# 中执行了一个简单的循环和判断过程,以查看整数 2 到 N 是否为质数。来源是Github参考。测量模式 逻辑内核 8 Wi
    03-08
  • [C#]使用 AltCover 获得代码覆盖率 - E2E Test 和 Unit Test
    [C#]使用 AltCover 获得代码覆盖率 - E2E Test
    背景在 CI/CD 流程当中,测试是 CI 中很重要的部分。跟开发人员关系最大的就是单元测试,单元测试编写完成之后,我们可以使用 IDE 或者 dot cover 等工具获得单元测试对于业务代码的覆盖率。不过我们需要一个独立的 CLI 工具,这样我们才能够在 Jenkins 的 CI
  • C#中LINQ的Select与SelectMany函数如何使用 c反应蛋白高说明什么
    C#中LINQ的Select与SelectMany函数如何使用 c反
    本篇内容主要讲解“C#中LINQ的Select与SelectMany函数如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#中LINQ的Select与SelectMany函数如何使用”吧!LINQ的Select与SelectMany函数使用Select扩展函
    02-09 linqselect
  • PerfView专题 (第三篇):如何寻找 C# 中的 VirtualAlloc 内存泄漏
    PerfView专题 (第三篇):如何寻找 C# 中的 Virt
    一:背景上一篇我们聊到了如何用 PerfView 去侦察 NTHeap 的内存泄漏,这种内存泄漏往往是用 C 的 malloc 或者 C++ 的 new 分配而不释放所造成的,这一篇我们来聊一下由 VirtualAlloc 方法造成的泄漏如何去甄别?了解 VirtualAlloc 的朋友肯定说, C# 这种高
    02-09
  • Blazor和Vue对比学习(知识点杂锦3.04):Blazor中C#和JS互操作(超长文)
    Blazor和Vue对比学习(知识点杂锦3.04):Blazo
    C#和JS互操作的基本语法是比较简单的,但小知识点特别多,同时,受应用加载顺序、组件生命周期以及参数类型的影响,会有比较多坑,需要耐心的学习。在C#中调用JS的场景会比较多,特别是在WASM模式下,由于WebAssembly的限制,很多时候,还是需要借助JS去控制D
    02-09
  • 的键">C#怎么使用struct类型作为泛型Dictionary
    本文小编为大家详细介绍“C#怎么使用struct类型作为泛型DictionaryTKey,TValue的键”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么使用struct类型作为泛型DictionaryTKey,TValue的键”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学
  • C#如何实现折半查找算法 彩票查询
    C#如何实现折半查找算法 彩票查询
    本篇内容主要讲解“C#如何实现折半查找算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#如何实现折半查找算法”吧!折半查找,也叫二分查找,当在一个数组或集合中查找某个元素时,先定位出中间位置元素
    02-09
  • C#如何实现选择排序 c罗
    C#如何实现选择排序 c罗
    本篇内容主要讲解“C#如何实现选择排序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#如何实现选择排序”吧!选择排序是一种低效的排序算法,大致过程是:遍历数组的每一个元素,先假设0号位置上的元素是最
    02-09
点击排行