2010-11-19 27 views
0

Je rencontre des problèmes avec la bibliothèque .net (légèrement dépassée) appelée sharpPDF. Nous générons quelques images de notre application web gis et avons besoin de référencer les images dans cette bibliothèque. Le seul problème semble être la compression que la bibliothèque utilise (ou n'utilise pas). Les images sont PNG32.sharpPDF - aide pour la qualité d'image - spécification pdf

Le résultat est assez fortement compressé lorsque je compare les résultats avec pdf créé via iTextSharp (ce qui est malheureusement un pas pour nous, ne me demandez pas pourquoi).

J'ai remarqué que, dans le code source, il y a quelque chose comme ce qui suit:

// Images de PDF

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++; 
    } 

qui regarde dans le temps d'exécution comme celui-ci

> 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 

quelqu'un peut-il, qui a une certaine connaissance de la spécification pdf, m'aider à comprendre les problèmes possibles avec la compression ici?

Tas merci ...

Répondre

0

Qu'est-ce que vous voyez est un flux qui est généré pour une image particulière qui est compressé avec la compression JPEG (DCTDecode = Transformée Cosinus Discrète = JPEG). Je suis surpris que le générateur de PDF n'ait pas d'options pour sélectionner le codec de l'image et le configurer (pour JPEG, vous devriez au moins pouvoir régler la qualité de l'image).

Si vous compressez une image en couleur/en niveaux de gris que vous voulez sans perte, vous devez utiliser la commande flate. Si vous compressez une image de 1 bit que vous voulez sans perte, vous devriez utiliser CCITT.

Si vous voulez une compression avec perte (plus de compression + artefacts), vous devez utiliser JPEG ou JPEG2000 sur couleur/gris et JBIG2 sur noir et blanc.

De la lecture de votre commentaire, voici ce que vous devez faire:

si vous êtes content de JPEG, vous voulez utiliser la saveur de Image.Save qui contient des informations plus codec, comme ceci:

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

Pour tout Flate, vous devrez collecter les données d'image ligne par ligne et utiliser une compression de flate (Ionic's zlib est bon) et compresser manuellement. C'est non-trivial.

+0

J'ai utilisé FlateDecode et le pdf dit: données insuffisantes pour une image. des idées? merci beaucoup – belzebu

+0

Cela sonne comme si vous venez de changer les paramètres du dictionnaire sans altérer image.content. vous devez décoder et recompresser les données d'image aussi. –

+0

Comment générez-vous cet objet stream? D'où viennent les données? Il est très probable que vous deviez définir le mécanisme de compression comme point de création de ce flux/dictionnaire d'images. – plinth