-1

我有一个服务,它需要一个 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 文件发送给他们。

请帮忙...

4

3 回答 3

1

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

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

于 2013-07-24T16:28:44.627 回答
0

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

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

一些传真 TIFF 包含的数据将在 TIFF 查看器中正确显示但在 PDF 中不正确显示的事实使我怀疑同样类型的问题也可能在另一个方向上运行。

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

我还要注意,有时图像会内嵌在内容流中,而不是单独的 XObject 中。同样,除非您的数据源生成标准格式,否则您将需要处理这种情况,您可以确定不会包含这种结构。

于 2013-08-01T11:30:09.587 回答
0

谢谢楼上的回复。如果您确实拥有来自流的所有信息,那么 Mihai 的解决方案似乎是可行的。我发现 iTextSharp 不能正确执行此操作,所以我最终购买了 pdf4net。比试图找出更好的解决方案要简单得多,此外,它最终比我花在这上面的时间便宜。

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

PDF4Net 有一个内置方法,您可以获取每页的所有图像......这对我的问题进行了排序,而我自己尝试使用 iTextSharp 和提供给我的示例来完成此操作。

于 2013-08-05T04:38:22.623 回答