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