2009-12-21 8 views
0

Nous utilisons un produit appelé DynamicPDF pour générer des PDF à la volée à partir de données dynamiques d'une base de données. Leur documentation indique que leur logiciel laisse les octets d'image intacts et n'apporte aucun changement. Malgré cela, nous avons observé que les images que nous ajoutons semblent avoir une perte de qualité sur la sortie PDF résultante (du moins c'est ce à quoi elles ressemblent). Donc, ma question est de savoir ce que je dois faire avec l'API DynamicPDF pour m'assurer que la qualité d'image produite est égale ou proche de ce que j'ai mis dedans.Perte de qualité d'image DynamicPDF

Nous utilisons la version 5.1.2 Build 13650, ci-dessous est le code que nous utilisons pour ajouter l'image.

private void plcImageMain_LaidOut(object sender, PlaceHolderLaidOutEventArgs e) 
{ 
if (e.LayoutWriter.RecordSets.Current.HasData) 
{ 
     string productId = e.LayoutWriter.RecordSets.Current["ProductId"].ToString(); 
     string imgUrl = base.SetImageUrlParams(e.LayoutWriter.RecordSets.Current["ImageUrl"] as string, e.ContentArea.Width, e.ContentArea.Height); 

     System.Drawing.Bitmap bm = base.GetBitmap(imgUrl); 

     ceTe.DynamicPDF.PageElements.Image img = new ceTe.DynamicPDF.PageElements.Image(bm, 0, 0); 
     img.Height = e.ContentArea.Height; 
     img.Width = e.ContentArea.Width; 
     e.ContentArea.Add(img); 
} 
} 

/// <summary> 
/// Gets a bitmap from the requested image url 
/// </summary> 
/// <param name="imgCtrl"></param> 
/// <param name="imgUrl"></param> 
protected System.Drawing.Bitmap GetBitmap(string imgUrl) 
{ 
// TODO: Add some validation to ensure the url is an image. 
System.Net.WebRequest httpRequest = System.Net.HttpWebRequest.Create(imgUrl); 

using (System.Net.HttpWebResponse httpResponse = httpRequest.GetResponse() as System.Net.HttpWebResponse) 
using (Stream imgStream = httpResponse.GetResponseStream()) 
{ 
    System.Drawing.Bitmap bm = System.Drawing.Bitmap.FromStream(imgStream) as System.Drawing.Bitmap; 
    return bm; 
} 
} 

[Modifier]

Here est avant et après capture d'écran.

[Modifier]

code à l'aide GetImage (pourquoi si lent?)

protected ceTe.DynamicPDF.Imaging.ImageData GetImageData(string imgUrl) 
{ 
    ImageData imgData = null; 
    using (System.Net.WebClient wc = new System.Net.WebClient()) 
    { 
    imgData = ImageData.GetImage(wc.DownloadData(imgUrl)); 
    } 
    return imgData; 
} 

GetImageData ("http://s7d2.scene7.com/is/image/SwissArmy/cm_vm_53900E--111mm_sol_front_a?fmt=jpeg&wid=400&hei=640"); 
+0

Pouvez-vous nous montrer un exemple "avant/après"? –

+0

De même, pouvez-vous extraire une image du PDF (en utilisant l'image de sélection/copie) et la comparer avec l'image source? De cette façon, vous obtenez une preuve à 100% si quelque chose est modifié. –

+0

J'ai ajouté un lien vers une capture d'écran avant et après dans le message ci-dessus. BTW comment extraire-vous des images à partir d'un PDF? Je suppose qu'il y a un moyen de le faire dans Acrobat Reader? – James

Répondre

0

Vous aviez tous les deux raison que c'était Acrobat qui causait l'affichage flou. Il y a un paramètre dans les préférences appelé résolution, au lieu d'utiliser le paramètre ppp Système par défaut. Acrobat a décidé d'utiliser un paramètre ppp personnalisé de 110 (je ne sais pas pourquoi!?!?). Après le réglage du système (dans mon cas 96dpi) les images étaient limpides.

2

D'accord, cela ressemble à l'effort pauvres à la redimensionner, mais il pourrait tout aussi bien être votre lecteur Acrobat faire à l'écran, avec les données réelles étant parfaitement bien.

Vous devriez être en mesure de sélectionner une image en cliquant dessus dans le lecteur (il est donc surligné en bleu), puis copiez et collez-le dans un programme d'édition d'image de votre choix. De cette façon, devrait obtenir la ressource dans la solution originale, peu importe à quoi il est réduit.

Il existe également des outils pour extraire des images et d'autres ressources à partir de fichiers PDF, mais je ne connais pas celui que je peux recommander.

+0

+1 pour votre effort. Le texte dans le PDF met en évidence mais les images ne le font pas. Y a-t-il un paramètre que je dois activer? – James

+0

Je ne suis pas sûr, je peux le mettre en évidence tout de suite. Consultez le menu "Outils" dans la dernière version d'Acrobat Reader, vous devriez y trouver une sélection d'outils de sélection. L'un d'eux devrait fonctionner. –

1

En ce qui concerne le produit DynamicPDF, aucun redimensionnement ou rééchantillonnage n'est effectué sur l'image lorsqu'elle est ajoutée au document PDF. Pekka est vraiment juste avec ça. C'est le lecteur qui représente visuellement l'image avec une clarté différente (à différents niveaux de zoom).

Si vous êtes en mesure de retirer l'image du PDF (comme Pekka recommande ci-dessus), vous verrez que les données de l'image sont complètement originales et non modifiées.

Une autre chose que vous pouvez faire pour démontrer cela serait de prendre votre image originale, faites un clic droit dessus et sélectionnez "Convertir en Adobe PDF" (nécessite Acrobat Pro complet). Dans ce PDF nouvellement créé, vous verrez également les mêmes résultats visuellement. Une dernière chose à noter est juste une petite inefficacité dans le code que vous avez affiché ci-dessus. À l'heure actuelle, vous extrayez le contenu de l'image en tant que flux, en créant une image bitmap à partir de cet objet Stream, puis en utilisant cette image bitmap pour créer l'objet Image DynamicPDF. La méthode recommandée pour accomplir cela serait de prendre l'objet Stream de l'image que vous extrayez de l'URL, passez-le dans la méthode ImageData Static de DynamicPDF "GetImage". Cette méthode GetImage va retourner l'objet ImageData. Utilisez ensuite ImageData pour créer votre objet Image DynamicPDF sur.

Il y a deux avantages évidents à charger l'image de cette façon. La première est que vous n'avez pas les frais généraux impliqués avec l'objet System.Drawing.Bitmap nécessitant de traiter séparément le contenu de l'image (en théorie, l'application fonctionnerait plus vite sans cela). Et le deuxième avantage est que le contenu de l'image est ajouté au PDF quelle que soit la compression native à l'origine.Comme dans le cas des images JPEG, l'utilisation de la compression native de l'image par opposition à la compression du bitmap se traduira par une taille de fichier PDF plus petite. Rien de tout cela n'aura d'influence sur la qualité d'image du PDF de sortie, mais cela pourrait affecter l'efficacité et la taille du fichier PDF de sortie.

+0

+1 Merci pour votre aide sur celui-ci. J'ai suivi votre suggestion d'utiliser ImageData.GetImage(). Mais je trouve qu'il est maintenant incroyablement plus lent que mon ancienne implémentation. Pourquoi donc? Mon nouveau code est ci-dessus. – James