Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#PdfImage LibTiff iTextSharp G3/G4压缩_C#_Pdf_Compression_Itextsharp - Fatal编程技术网

C#PdfImage LibTiff iTextSharp G3/G4压缩

C#PdfImage LibTiff iTextSharp G3/G4压缩,c#,pdf,compression,itextsharp,C#,Pdf,Compression,Itextsharp,我有一个服务,可以获取pdf文档,调整所有图像的大小,并将其替换为pdf。我要说的问题是压缩 有些文档通过压缩进行扫描和保存。CCITTFAX3压缩,有些文档通过压缩进行保存。CCITTFAX4压缩。我正在使用iTextSharp,并将流字节转换为Tiff,否则图像会因为步幅或其他原因而变得怪异 下面是我目前用来检查过滤器是否正确,然后转换为tiff图像的代码 if (filter == "/CCITTFaxDecode") {

我有一个服务,可以获取pdf文档,调整所有图像的大小,并将其替换为pdf。我要说的问题是压缩

有些文档通过压缩进行扫描和保存。CCITTFAX3压缩,有些文档通过压缩进行保存。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文件发送给他们


请帮助…

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


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

我不建议直接插入数据。我的这一论断是基于多年来在诸如ABCpdf.NET(我的工作平台)等产品中使用PDF和TIFF的实践经验

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

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

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


我还要注意的是,有时图像是以内联方式保存在内容流中,而不是保存在单独的XObject中。这也是您需要处理的问题,除非您的数据源生成一个标准格式,您可以确定该格式不会包含这种结构。

感谢您的上述回复。如果您确实拥有流中的所有信息,那么Mihai的解决方案似乎是可行的。我发现iTextSharp不能正确地完成这项工作,所以我最终购买了pdf4net。这比试图找出更好的解决方案要简单得多,而且,结果比我花在这上面的时间要便宜

一旦发生。。。。感谢您提供上述信息


PDF4Net有一个内置的方法,您可以获得每页的所有图像。。。这对我的问题进行了分类,而我尝试自己使用iTextSharp和给我的示例来进行分类。

我遇到的问题是,当我运行这段代码时,PdfDictionary Params=(PdfDictionary)dict.Get(PdfName.DECODEPARMS);我的Params.Keys有列和行,没有其他内容。因此,在尝试获取PdfName.K时,它会返回null。