2012-05-01 23 views
0

フィルター「本当の」注釈を出力し、CGはそれを実行できません。CGPDF - FlateDecodeで保存する画像は、私が仕事のためのPDFパーサを書いている、と私たちはコールバックですべてのデータを読み込むためにコアグラフィックスを使用して、私たちのクライアントが書き込む必要があるので、Libの春にそれを書いている

はまあ、私は私が(私はそれらを描画するために開始する直前に、私はそれをやっていることを確認すると、ファイルにそれらを保存)画像を取得していますポイントに得ていると私はこの問題に遭遇しました。私は、リソースディクショナリのうち、画像XObjectsの全てを取得し、このコードObjectStreamのはのXObjectを抽出するためにCGPDFDictionaryGetStreamを使用している

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]; 

でそれらを保存しようとしています。ウェルフィルターは「DCTDecode」であるとき、それが正常に動作しますが、フィルターは「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]; 

コード」はdidnの私はそれを実行したときに任意の例外をスローしますが、結果の画像はまだ判読できませんでした。

答えて

1

CGPDFStreamCopyDataをご使用の場合は、間違っていると思われるようです。必要なフォーマットを設定していない場合、ストリームで検出されたフォーマットに設定されます。典型的な用途は、次のようになります。あなたは、画像データ・ストリームのうち、有効なPNGファイルを得ることは決してないだろうので、

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 
} 

PNG画像は、PDFの規格では全くサポートされていません。オプションはJPEG、JPEG2K、生の画像です(詳細は仕様を参照してください)。

クォーツは透過的にzlib圧縮を扱うので、あなたはzlibの圧縮データを自分で得ることは決してないだろう。

関連する問題