C# PdfImage LibTiff iTextSharp G3 / G4 compression
本文关键字:G4 compression G3 iTextSharp PdfImage LibTiff | 更新日期: 2023-09-27 18:24:38
我有一个服务,它获取一个pdf文档,调整所有图像的大小,并将其替换为pdf。我遇到的问题是压缩。
有些文档是用Compression.CCITTFAX3压缩进行扫描和保存的,有些则是用Compression.CITTFAX4压缩进行保存的。我正在使用iTextSharp并将流字节转换为Tiff,否则图像会因为跨步或其他原因而变得时髦。
以下是我目前正在使用的代码,用于检查正确的过滤器,然后转换为tiff图像。
if (filter == "/CCITTFaxDecode")
{
byte[] data = PdfReader.GetStreamBytesRaw((PRStream)stream);
using (MemoryStream ms = new MemoryStream())
{
using (Tiff myTiff = Tiff.ClientOpen("in-memory", "w", ms, new TiffStream()))
{
myTiff.SetField(TiffTag.IMAGEWIDTH, UInt32.Parse(dict.Get(PdfName.WIDTH).ToString()));
myTiff.SetField(TiffTag.IMAGELENGTH, UInt32.Parse(dict.Get(PdfName.HEIGHT).ToString()));
myTiff.SetField(TiffTag.COMPRESSION, Compression.CCITTFAX3);
myTiff.SetField(TiffTag.BITSPERSAMPLE, UInt32.Parse(dict.Get(PdfName.BITSPERCOMPONENT).ToString()));
myTiff.SetField(TiffTag.SAMPLESPERPIXEL, 1);
myTiff.WriteRawStrip(0, data, data.Length);
myTiff.Flush();
using (System.Drawing.Image img = new Bitmap(ms))
{
if (img == null) continue;
ReduceResolution(stream, img, quality);
}
myTiff.Close();
}
}
}
只是为了确保你理解我的问题。。。
我想知道如何知道何时使用G3压缩和何时使用G4压缩。
请记住,我已经尝试了我能找到的每一个代码示例。
这一点非常重要,因为我们与银行系统对接,上传的文件将作为FICA文件发送给他们。
请帮忙。。。
您需要进入低级别并检查图像字典。/DecodeArms条目是一个字典,其中包含几个与CCITT压缩相关的密钥。/K键指定压缩类型:-1表示G4,0表示G3 1D,1表示G3 2D。
更新:更准确地说,负值(通常为-1)是G4,0是G3 1D,正值(通常为1)是G3 2D。要在注释中回答您的问题,/K条目是可选的,如果缺少,则默认值被视为0。
我不建议直接插入数据。我的这一论断建立在多年的PDF和TIFF在ABCpdf.NET(我工作的基础上)等产品中的实践经验之上。
虽然理论上您应该能够直接移动数据,但压缩数据格式之间的微小差异可能会导致偶尔的不匹配。
事实上,一些传真TIFF包含的数据可以在TIFF查看器中正确显示,但不能在PDF查看器中显示,这让我怀疑同样的问题也可能在另一个方向上运行。
我不会说这种问题很常见,但如果我在银行,我就不会依赖这种问题。除非你非常确定你的数据源是统一的,否则我建议解压缩和重新压缩要安全得多。
我还要注意的是,有时图像是内联在内容流中,而不是单独的XObject中。同样,这是你需要处理的问题,除非你的数据源生成一个标准格式,你可以确定它不会包含这种结构。
感谢您的回复。如果您确实掌握了流中的所有信息,那么Mihai的解决方案似乎是可行的。我发现iTextSharp做得不好,所以我最终买了pdf4net。比试图找出更好的解决方案要简单得多,此外,它最终比我在这方面花费的时间便宜。
OnceUponAT时间。。。。感谢您提供上述信息。
PDF4Net有一个内置的方法,可以获得每页的所有图像。。。这对我的问题进行了分类,而我自己尝试使用iTextSharp和给我的例子来做这件事。