我正在为工作编写一个PDF解析器,我们使用Core Graphics读取所有的回调数据,然后用Lib Haru编写它,因为我们的客户端需要写出“真实的”注释,而CG不能这样做。
嗯,我已经到了获取图像的地步(并将它们保存到一个文件中,以确保在开始绘制它们之前我正在这样做),我遇到了一个问题。我将所有的图像XObjects从资源字典中提取出来,然后尝试用下面的代码保存它们
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSData *imageFileData = (NSData *)CGPDFStreamCopyData(objectStream, CGPDFDataFormatRaw);
NSString *fileName = [NSString stringWithFormat:@"%@/%s.png", documentsDir, name];
[imageFileData writeToFile:fileName atomically:YES];其中,objectStream使用CGPDFDictionaryGetStream提取XObject。当过滤器是"DCTDecode“时,它可以正常工作,但是每当过滤器是"FlateDecode”时,保存的图像就会损坏,不会打开。
我在这个职位中读到,CGPDFStreamCopyData可以用FlateDecode来解码文本(在评论中一直到文章的底部),但是CGPDFDataFormats中只有3种数据格式,它们都不能工作。
我相信我对用FlatDecode编码的文本也有问题。有人对如何解码这个问题有什么建议吗?当然,CGPDF有一些东西可以处理这个问题,因为它出现在我试图打开的几乎每一个pdf中(尽管我还没有找到它)。
编辑:我在几个地方读到可以使用zlib解压缩它,所以我尝试了这段代码,我能够找到如何这样做的代码:
NSData* uncompressedImageData;
if ([imageFileData length] == 0)
uncompressedImageData = imageFileData;
else
{
z_stream strm;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.total_out = 0;
strm.next_in=(Bytef*)[imageFileData bytes];
strm.avail_in = [imageFileData length];
// Compresssion Levels: // Z_NO_COMPRESSION // Z_BEST_SPEED // Z_BEST_COMPRESSION // Z_DEFAULT_COMPRESSION
if (deflateInit(&strm, Z_DEFAULT_COMPRESSION) != Z_OK)
uncompressedImageData = nil;
NSMutableData *compressed = [NSMutableData dataWithLength:16384]; // 16K chuncks for expansion
do
{
if (strm.total_out >= [compressed length])
[compressed increaseLengthBy: 16384];
strm.next_out = [compressed mutableBytes] + strm.total_out; strm.avail_out = [compressed length] - strm.total_out;
deflate(&strm, Z_FINISH);
}
while (strm.avail_out == 0);
deflateEnd(&strm);
[compressed setLength: strm.total_out];
uncompressedImageData = [NSData dataWithData: compressed];
}
if(uncompressedImageData != nil)
[uncompressedImageData writeToFile:fileName atomically:YES];当我运行它时,代码没有抛出任何异常,但是生成的图像仍然不可读。
发布于 2012-05-02 14:36:19
您对CGPDFStreamCopyData的使用似乎表明您有一个误解:您没有设置您想要的格式,而是函数将其设置为它在流中遇到的格式。一个典型的用途是:
CGPDFDataFormat format;
CGPDFStreamCopyData(objectStream, &format);
if (format == CGPDFDataFormatRaw) {
//handle raw data...
} else if (format == CGPDFDataFormatJPEGEncoded) {
//handle jpeg data...
} else if (format == CGPDFDataFormatJPEG2000) {
//handle jpeg 2000 data
}PDF标准根本不支持PNG图像,因此您永远不会从图像数据流中获得有效的PNG文件。这些选项是JPEG、JPEG2K和原始图像(有关这些的详细信息,请参阅规范)。
石英透明地处理zlib压缩,所以您永远不会自己获得zlib压缩数据。
https://stackoverflow.com/questions/10401799
复制相似问题