Vb.net itextsharp无法处理msoffice应用程序转换的pdf

Vb.net itextsharp无法处理msoffice应用程序转换的pdf,vb.net,itextsharp,Vb.net,Itextsharp,我很困惑,为什么iTextsharp无法读取或从pdf(从msword、excel、powerpoint转换的pdf)获取图像 下面是我所做的,我打开了msword文件,然后将msword文件转换为pdf,然后使用iTextsharp读取pdf文件,它无法识别pdf文件是否有图像或形状 我也试着从powerpoint转换成pdf,然后读取pdf文件,但它也不读取图像 代码如下: 图片下方…已编辑 这是无法提取的图像: 这是我不久前测试的图像,很好,我不知道为什么另一个图像不能被检测到,或者它有

我很困惑,为什么iTextsharp无法读取或从pdf(从msword、excel、powerpoint转换的pdf)获取图像


下面是我所做的,我打开了msword文件,然后将msword文件转换为pdf,然后使用iTextsharp读取pdf文件,它无法识别pdf文件是否有图像或形状

我也试着从powerpoint转换成pdf,然后读取pdf文件,但它也不读取图像

代码如下: 图片下方…已编辑

这是无法提取的图像:

这是我不久前测试的图像,很好,我不知道为什么另一个图像不能被检测到,或者它有错误。

现在,我将代码更改为: 但也检测不到它的一个图像上的圆形


当前代码未找到或提取这些形状的原因:

笑脸图像和花朵图像在本质上完全不同:花朵图像是存储在PDF中的位图图像,作为子类型/image/XObject(外部对象),而笑脸是存储在PDF中的向量图像,作为页面内容流的一部分(不一定是连续的)路径定义和绘图操作的顺序

您的代码只搜索作为外部对象存储的位图图像,而且它的搜索方式有些复杂:它首先使用低级方法扫描图像xobject,并且只有在找到这样的xobject时,才使用iText高级提取功能。如果它一开始只使用iText图像提取功能,那么它就不会那么复杂,同时它还可以识别内联位图图像

你可能想看一下第15章,尤其是其中的一章。虽然该代码的灵感可以改进您当前的代码,但它不会帮助您解决手头的问题

使用iText:

不幸的是,你的问题并不完全清楚你实际上想要实现什么

  • 您是否只需要检测某个页面上是否有图像(位图或矢量图形)
  • 您是否需要有关图像的一些信息,例如页面上的大小或位置
  • 或者你真的想提取图像
  • 虽然使用上述iText高级提取功能可以很容易地实现位图图形的这些目标,但对于矢量图形来说,实现这些目标相当困难

    对于通用PDF,它们实际上不可能实现,因为单个图形的绘制操作不需要在一起,更糟糕的是,对于同一页上的不同图形,对于页面上的下划线,绘制操作不需要在一起,对于其他图形效果,它们甚至可能以看似随机的顺序混合在一大堆操作中

    不过,在您的情况下,您有一个优势:Office似乎可以正确地标记PDF中的数字。这至少使得检测页面上不同(即不同标记)矢量图形的数量变得容易,并且还允许区分哪个绘图操作属于哪个图形

    因此,这里有一些关于如何实现上面提到的PDF目标的建议,这些PDF标记为您的示例PDF。因为我自己没有使用VB,所以我没有示例代码。但是,正如示例代码所示,您已经知道如何遵循对象引用以及如何解释PDF对象信息,这些指针应该足以说明方法

    1。检测某个页面上是否有图像。

    当页面内容被标记时,只需从文档目录中的/StructTreeRoot条目开始扫描结构层次结构即可(使用
    PdfReader.Catalog,
    在其中选择
    PdfName.StructTreeRoot
    的值,并深入研究)

    例如,对于示例的第1页(PDF对象4 0中)(顶部为“1233”,下面为笑脸),您将发现一个包含字典的数组:

    <<
      /Pg 4 0 R
      /K [0]
      /S /P
      /P 24 0 R
    >>
    
    此部分位于/MCID 1BDCEMC之间,包含您寻求的图形操作。如果你想得到他们所代表的图形的一些信息,你必须对他们进行分析

    这是一个关于所有这些的非常低级的视图,可能需要一个更高级的API来检索它

    iText确实有一个高级API,用于使用
    parser
    namespace类
    PdfReaderContentParser
    以及一些类似
    ImageInfoTextExtractionStrategy的apropos
    RenderListener
    实现的文本和位图图像处理的类似操作。
    但不幸的是,
    PdfReaderContentParser
    尚未正确预处理向量图形相关运算符

    因此,要使用iText实现这一点,您必须扩展底层的
    PdfContentStreamProcessor
    ,以添加缺少的预处理(这是可以做到的,因为该解析器类使用单独的侦听器来实现各个操作,并且您可以轻松地为图形操作符注册新的侦听器);或者您必须检索页面内容并自己解析

    3。正在提取图像。

    由于PDF中的矢量图像使用特定于PDF的矢量图形操作符,因此首先必须确定要导出图像的格式。除非您对原始PDF操作符感兴趣,否则您很可能需要一些库来帮助您创建所需格式的文件


    一旦确定,您首先按照前面的说明提取有问题的图形操作符,然后将它们提供给该库,以创建您选择的可导出图像。

    当前代码未找到或提取这些形状的原因:

    笑脸形象和花朵形象在本质上是完全不同的
    <<
      /Pg 4 0 R
      /K [0]
      /S /P
      /P 24 0 R
    >>
    
    <<
      /Pg 4 0 R
      /K [1]
      /Alt   ()
      /S /Figure
      /P 22 0 R
    >>
    
    /P <</MCID 1>> BDC 0.31 0.506 0.741 rg
    108.6 516.6 m
    108.6 569.29 160.18 612 223.8 612 c
    287.42 612 339 569.29 339 516.6 c
    339 463.91 287.42 421.2 223.8 421.2 c
    160.18 421.2 108.6 463.91 108.6 516.6 c
    h
    f*
    [...]
    108.6 516.6 m
    108.6 569.29 160.18 612 223.8 612 c
    287.42 612 339 569.29 339 516.6 c
    339 463.91 287.42 421.2 223.8 421.2 c
    160.18 421.2 108.6 463.91 108.6 516.6 c
    h
    S
    EMC