我有一个服务,它接受一个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文件发送给它们。
请帮忙......
答案 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以及给我的例子来做到这一点。