C#PdfImage LibTiff iTextSharp G3 / G4压缩

时间:2013-07-24 13:58:54

标签: c# pdf compression itextsharp

我有一个服务,它接受一个pdf文档,调整所有图像的大小,并在pdf中替换它。我遇到的问题是压缩。

使用Compression.CCITTFAX3压缩扫描和保存某些文档,有些文档使用Compression.CCITTFAX4压缩保存。我正在使用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文件发送给它们。

请帮忙......

3 个答案:

答案 0 :(得分:1)

您需要进入低级别并检查图像字典。 / DecodeParms条目是一个字典,其中包含与CCITT压缩相关的几个键。 / K键指定压缩类型:-1为G4,0为G3 1D,1为G3 2D。

更新:更确切地说,负值(通常为-1)为G4,0为G3 1D,正值(通常为1)为G3 2D。要在注释中回答您的问题,/ K条目是可选的,如果缺少,则默认值被视为0。

答案 1 :(得分:0)

我不建议直接插入数据。我基于ABCpdf .NET(我工作的)等产品中的PDF和TIFF的多年实践经验。

虽然理论上你应该能够直接移动数据,但压缩数据格式之间的微小差异可能会导致偶然的不匹配。

有些传真TIFF包含的数据会在TIFF查看器中正确显示但不会在PDF格式中显示,这让我怀疑同样的问题也可能在另一个方向上运行。

我不会说这种问题很常见,但如果我在银行工作,我就不会依赖这种问题。除非您非常确定您的数据源是统一的,否则我会建议解压缩和重新压缩更安全。

我还要注意,有时图像是在内容流中内联而不是在单独的XObject中。除非您的数据源生成标准格式,您确定不会包含此类结构,否则这将是您需要应对的事情。

答案 2 :(得分:0)

感谢您上面的回复。如果您拥有流中的所有信息,Mihai的解决方案似乎是可行的。我发现iTextSharp没有正确执行此操作,因此我最终购买了pdf4net。比试图弄清楚什么是更好的解决方案要简单得多,此外,它比我花在这上面的时间便宜了。

OnceUponATime ....感谢您提供上述信息。

PDF4Net有一个内置的方法,你可以获得每页的所有图像...这对我的问题进行了排序,而我自己尝试使用iTextSharp以及给我的例子来做到这一点。