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文件发送给他们。

请帮忙。。。

C# PdfImage LibTiff iTextSharp G3 / G4 compression

您需要进入低级别并检查图像字典。/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和给我的例子来做这件事。