- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在为工作编写一个 PDF 解析器,我们正在使用 Core Graphics 通过回调读取所有数据,然后使用 Lib Haru 将其写出,因为我们的客户需要写出“真实”注释和 CG做不到。
好吧,我已经到了获取图像的地步(并将它们保存到文件中以确保在开始绘制它们之前我正在做正确的事情)并且我遇到了一个问题。我正在从 Resource 字典中获取所有 Image XObject,然后尝试使用此代码将它们保存出来
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。好吧,当 Filter 为“DCTDecode”时它工作正常,但是当 Filter 为“FlateDecode”时,保存的图像已损坏且无法打开。
我读入了this post 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];
我运行代码时没有抛出任何异常,但生成的图像仍然不可读。
最佳答案
您对 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 和原始图像(有关详细信息,请参阅规范)。
Quartz 透明地处理 zlib 压缩,因此您永远不会自己获得 zlib 压缩的数据。
关于iphone - CGPDF - 使用 FlateDecode 过滤器保存图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10401799/
我使用以下代码来解码 pdf 中的文本流。在某些情况下,流需要由 2 个过滤器解码。 <> 我首先通过 ASCII85Decode 解码流,然后使用 Flatedecode。在某些情况下,flated
我正在为工作编写一个 PDF 解析器,我们正在使用 Core Graphics 通过回调读取所有数据,然后使用 Lib Haru 将其写出,因为我们的客户需要写出“真实”注释和 CG做不到。 好吧,我
使用 peepdf我正在分析两个简单的 pdf 文件。这两个文件都包含一行文本(“ZYXWVUTSRQQRSTUVWXYZ”)并且是在 Mac OS X 上创建的。 第一个文件是用 TextEdit
我在IText中对PDF的平面解码流进行了编码,不幸的是我有一个干净的文本,但无法准确说出它的含义......在PDF 32000中没有关于这个主题的文档...还有关于这个问题的其他文档吗? 示例 q
我想从 PDF 中提取图像。我现在正在使用 iTextSharp。有些图像可以正确提取,但大多数图像颜色不正确并且失真。我用不同的 PixelFormats 做了一些实验,但我没有得到解决我的问题的方
当通过 iTextSharp 将 PDF 中的图像解码为 FlateDecode 时,图像失真,我似乎无法弄清楚原因。 识别的 bpp 是 Format1bppIndexed。如果我将 PixelFo
我发布了一个与此相关的问题 a while back但没有得到回应。从那时起,我发现 PDF 是使用 FlateDecode 编码的,我想知道是否有办法在 C# (Windows Phone 8) 中
我正在尝试从 pdf 中提取图像。图像是过滤器“FlateDecode”。我得到了图像,但它只是一条黑色路径。我是这方面的新手,请帮助我。代码是: int width = xObject.Elemen
如何使用 PDFSharp 从 PDF 文档中提取经过 FlateDecoded(例如 PNG)的图像? 我在 PDFSharp 示例中发现了该评论: // TODO: You can put the
我正在尝试使用以下代码解压 PDF 格式的数据 import re import zlib pdf = open("some_doc.pdf", "rb").read() stream = re.co
我无法像这样从流中解密数据: 56 0 obj > stream x]êΩnƒ Ñ{ûbÀKq¬æ\âê¢....(whole binary is omitted)
我是一名优秀的程序员,十分优秀!