我正在写pdf comparison utility。在some investigation之后,似乎最好的方法是转换为tiff并从那里进行比较。
我设法使用Ghostscript执行此操作,但我在嵌入式创建日期元数据方面有所不同。
如何使用.Net来修改它?
答案 0 :(得分:1)
经过更多调查,似乎微软确实提供了一个支持多图像的TIFF库。它在System.Windows.Media.Imaging中。获取此命名空间参考PresentationCore。
要访问TIFF元数据,请使用此网站作为参考:http://www.awaresystems.be/imaging/tiff/tifftags/baseline.html
此代码访问您感兴趣的GhostScript名称后的日期字段:
FileInfo fi = new FileInfo(@"C:\Users\Chris\Downloads\PdfVerificationTests.can_use_image_approval_mode.approved.tiff");
FileStream stream = fi.Open(FileMode.Open, FileAccess.ReadWrite,FileShare.None);
TiffBitmapDecoder decoder = new TiffBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
BitmapMetadata bmd = (BitmapMetadata) decoder.Frames[0].Metadata;
string thedateval = (string) bmd.GetQuery("/ifd/{ushort=306}");
BitmapMetadata bmd2 = bmd.Clone();
bmd2.SetQuery("/ifd/{ushort=306}", "2013:05:30 20:07:52");
此代码不写出修改过的TIFF,但这是您需要执行的所有信息。希望这会有所帮助,因为我觉得我打败了一匹死马。
此代码将从多页TIFF中删除所有属性,并保持图像内容不变:
FileInfo fi = new FileInfo(@"C:\Users\Chris\Downloads\PdfVerificationTests.can_use_image_approval_mode.approved.tiff");
FileStream stream = fi.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
TiffBitmapDecoder decoder = new TiffBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.None);
FileStream stream2 = new FileStream("empty.tif", FileMode.Create);
TiffBitmapEncoder encoder = new TiffBitmapEncoder();
for (int i = 0; i < decoder.Frames.Count(); i++)
{
BitmapSource source = decoder.Frames[i];
int stride = source.PixelWidth * (source.Format.BitsPerPixel / 8);
byte[] data = new byte[stride * source.PixelHeight];
source.CopyPixels(data, stride, 0);
CachedBitmap theSource = (CachedBitmap)BitmapSource.Create(source.PixelWidth, source.PixelHeight, source.DpiX, source.DpiY, source.Format, source.Palette, data, stride);
encoder.Frames.Add(BitmapFrame.Create(theSource));
}
try
{
encoder.Save(stream2);
stream2.Close();
stream.Close();
}
catch
{
}
答案 1 :(得分:1)
您可以使用LibTiff.NET。它是开源的。使用此库,您可以使用SetField method修改Tiff文件中的许多tags中的任何一个,包括TiffTag.DATETIME标记。
答案 2 :(得分:0)
如果日期戳是固定大小的,针对此类问题的一个有趣的解决方法是编写一个FileStream
,它只是检测并清空这些日期戳。事实上,我之前已经完成了这项工作,以便进行PDF比较,这是我在学校工作的一个项目。校验和比较恰到好处,没有任何转换为tiff,但在我们的特定情况下,我们确信所有比较的PDF都是由同一系统生成的,所以简化了一些事情。
基本方法是使用重写的FileStream
和ReadByte
函数创建Read
的子类,其中包含日期戳的长度和预期格式。每当执行读取时,都会发生以下情况:
我在当天为该项目编写的源代码是here。
答案 3 :(得分:0)
似乎可以抑制这种ghostscript行为。
-dTIFFDateTime = false
https://www.ghostscript.com/doc/9.22/Devices.htm
...但是对于这种情况,我会推荐一些diffpdf工具(http://soft.rubypdf.com/software/diffpdf)
D