2010-11-19 4 views
0

sharpPDF라는 (약간 오래된) .net 라이브러리에 문제가 있습니다. Google은 gis 웹 응용 프로그램에서 몇 개의 이미지를 생성하므로이 라이브러리 내의 이미지를 참조해야합니다. 유일한 문제는 라이브러리가 사용하고 있거나 사용하지 않는 압축 인 것 같습니다. 이미지는 PNG32입니다.sharpPDF - 이미지 품질 도움말 - pdf 사양

결과가 iTextSharp를 통해 생성 된 pdf와 비교할 때 결과가 상당히 많이 압축됩니다 (불행히도 우리에게는 아무런 이유가 없지만 이유는 묻지 않음).

것은 나는 소스 코드에서, 다음과 같은 무언가가 있다는 나타났습니다 :

// PDF의 이미지는 런타임이

> 60517 0 obj << /Type /XObject /Subtype 
> /Image /Name /I60517 /Filter 
> /DCTDecode /Width 830 /Height 1300 
> /BitsPerComponent 8 /ColorSpace 
> /DeviceRGB /Length 77076 
> >> stream 
> -here goes some bytes- endstream endobj 
과 같은

foreach (pdfImageReference image in _images.Values) 
    { 
    _trailer.addObject(_bufferLength.ToString()); 
    _bufferLength += writeToBuffer(_myBuffer, image.getText()); 
    _bufferLength += writeToBuffer(_myBuffer, "stream" + Convert.ToChar(13) + Convert.ToChar(10)); 
    _bufferLength += writeToBuffer(_myBuffer, image.content); 
    _bufferLength += writeToBuffer(_myBuffer, Convert.ToChar(13).ToString()); 
    _bufferLength += writeToBuffer(_myBuffer, Convert.ToChar(10).ToString()); 
    _bufferLength += writeToBuffer(_myBuffer, "endstream" + Convert.ToChar(13) + Convert.ToChar(10)); 
    _bufferLength += writeToBuffer(_myBuffer, "endobj" + Convert.ToChar(13) + Convert.ToChar(10)); 
        currentStep++; 
    } 

일부 PDF 사양 지식이있는 사람이라면 누구나 압축에 대한 가능한 문제를 파악하는 데 도움이 될 수 있습니까?

답변

0

당신이보고있는 것은 JPEG 압축을 사용하여 압축되고 특정 이미지에 대해 생성 된 스트림

감사 힙 (DCTDecode = 이산 코사인 = JPEG 변환). PDF 생성기에 이미지의 코덱을 선택하고 구성 할 수있는 옵션이 없다는 것에 놀랐습니다. JPEG의 경우 최소한 이미지 품질을 설정할 수 있어야합니다.

무손실로 만들려는 컬러/회색 명암 이미지를 압축하려면 flate를 사용해야합니다. 무손실로 만들려는 1 비트 이미지를 압축하는 경우 CCITT를 사용해야합니다.

손실 압축 (더 압축 + 유물)을 원한다면 컬러/회색에는 JPEG 또는 JPEG2000을, 흑백에는 JBIG2를 사용해야합니다.

당신의 코멘트를 읽는에서

, 이것은 당신이해야 할 일이다

당신은 다음과 같이 더 코덱 정보를 포함 Image.Save의 맛을 사용하려면, JPEG와 내용 인 경우 :

private static ImageCodecInfo GetEncoderInfo(String mimeType) 
{  
    int j; 
    ImageCodecInfo[] encoders; 
    encoders = ImageCodecInfo.GetImageEncoders(); 
    for(j = 0; j < encoders.Length; ++j) 
    { 
     if(encoders[j].MimeType == mimeType) 
      return encoders[j]; 
    } 
    return null; 
} 

Stream GetImageStream(Image image, int compression) 
{ 
    EncoderParameters eps = new EncoderParameters(1); 
    eps.Param[0] = new EncoderParameter(Encoder.Quality, (long)compression); 
    ImageCodecInfo codecInfo = GetEncoderInfo("image/jpeg"); 
    if (codecInfo == null) throw new Exception("No jpeg codec - WTF?"); // use better message 
    MemoryStream stream = new MemoryStream(); 
    image.Save(stream, codecInfo, eps); 
    stream.Seek(0, SeekOrigin.Begin); 
    return stream; 
} 

flate의 경우 이미지 데이터를 행별로 수집하고 플루트 압축 (Ionic's zlib이 좋음)을 사용하여 손으로 압축해야합니다. 이것은 사소한 일입니다.

+0

FlateDecode를 사용했으며 pdf에서 다음과 같이 말합니다. 이미지에 대한 데이터가 충분하지 않습니다. 어떤 아이디어? 고마워요. – belzebu

+0

image.content를 변경하지 않고 사전 설정을 변경 한 것처럼 들립니다. 이미지 데이터를 디코딩하고 다시 압축해야합니다. –

+0

어떻게 그 스트림 객체를 생성합니까? 데이터의 출처는 어디입니까? 압축 메커니즘을 해당 스트림/이미지 사전이 만들어지는 지점으로 설정해야 할 가능성이 큽니다. – plinth