使用vb.net比较tiff和pdf文件

时间:2012-08-06 15:20:49

标签: .net vb.net pdf tiff

我在VB,.Net环境中寻找示例代码或第三方工具,可以比较tiff和pdf文件(可视化比较)并返回true或false。

我的要求是将tiff文件转换为pdf,我使用iTextSharp,但我现在需要证明转换后,使用vb.net程序没有任何改变(为什么?。我不知道,但我需要为他们提供这样的服务。)

让我知道,如果你们知道任何这样的工具,我正在搜索,但我得到的只是将一种格式转换为另一种格式或比较相同格式文件的工具

2 个答案:

答案 0 :(得分:2)

您可以尝试从PDF中重新提取tiff,并将此图像的原始数据与原始tiff文件的原始数据进行比较。

由于PDF格式支持嵌入TIFF文件,因此您的客户可能只是想确保您没有将图像重新压缩为其他格式,并且在此过程中会有一些质量损失。这是一个合理的担忧。

从图像文件中获取原始数据:

由于您使用的是iText,因此对于1页的tiff文件,您可以使用Image.rawData()方法获取此数据。您可以使用方法TiffImage.getTiffImage

从TIFF文件中创建此Image类的实例

从PDF文件中获取原始数据:

您可以按照here解释的流程,然后使用方法PdfReader.GetStreamBytes

获取原始数据

您可以逐字节比较流,或者您可以在创建PDF时将它们保存到文件中,以便以后使用命令行工具将它们用于比较,或者您可以计算MD5哈希并使用它代替。

我没有测试过这种方法,但我相信它会起作用,因为不涉及TIFF元数据。

答案 1 :(得分:2)

ImageMagick的compare命令可以很容易地做到这一点。

 compare file.tif file.pdf -compose src delta.pdf

或者,假设多页TIFF和多页PDF,逐页比较:

 compare file.tif[0] file.pdf[0] -compose src delta_page1.pdf
 compare file.tif[1] file.pdf[1] -compose src delta_page2.pdf
 compare file.tif[2] file.pdf[2] -compose src delta_page3.pdf
 [....]

(ImageMagick的页面/图像索引以[0]开头,而不是[1]!)。

了解delta.pdf:

  1. 如果没有视觉差异,结果delta.pdf将完全为白色。
  2. 不同的像素将为红色。
  3. 生成的文件将使用默认的72dpi结果,这可能不会发现非常小的像素差异。
  4. 您甚至可以像这样简化命令:

     compare file.tif file.pdf delta.pdf
    

    结果delta.pdf将(从上下文)将命令行中的第一个文件显示为浅灰色背景图像,并将差异叠加为红色像素。当然,从理论上讲,您也可以颠倒每个命令的顺序:

     compare file.pdf file.tif delta.pdf
    

    但是,你应该知道现实中出现的PDF“白色”背景通常是透明的,而TIFF是真正的白色。这将导致出现很多像素差异。最好坚持我先命名的顺序: - )

    注1:所有这些比较都假设(当然)相同的页面图像尺寸和宽高比。 (否则,您可能需要先缩放两个页面图像中的一个。)

    注2:您几乎始终发现次要像素差异,具体取决于您的整体处理链。这一切都取决于你想通过这种比较发现什么样的错误。有很多方法可以微调这个....

    注3:如果这种方法原则上适合您,您可以修改输出格式:您不需要真正使用“红色像素图像”中的视觉差异。您可以改为计算每个独特的白色(相等)和红色(不同)像素,然后根据红色与白色相比的百分比做出决定,这是“好”还是“坏”,最后返回'true'或'false '相应(显示2个PDF而不是1/1 PDF / TIFF的示例命令):

    示例命令:

    compare \
       http://qtrac.eu/boson1.pdf[1] http://qtrac.eu/boson2.pdf[1] -compose src \
      -define histogram:unique-colors=true \
      -format %c \
       histogram:info:-
    

    示例输出:

     56934: (61937,    0, 7710,52428) #F1F100001E1ECCCC srgba(241,0,30,0.8)
    444056: (65535,65535,65535,52428) #FFFFFFFFFFFFCCCC srgba(255,255,255,0.8)
    

    此输出非常适合自动单元测试。您可以评估这两个数字,轻松计算“红色像素”与“白色像素”比率,然后根据特定阈值决定返回 PASSED FAILED (如果你并不严格需要“零红色”像素。)