2010-06-11 3 views
8

J'ai un problème étrange avec les images dans la bibliothèque iTextSharp. J'ajoute l'image à la PdfPCell et pour une raison quelconque, elle est agrandie. Comment puis-je le conserver à la taille d'origine? Here's the image du PDF à 100% et l'image dans sa taille d'origine ouverte dans paint.net. alt text http://a.yfrog.com/img697/7102/3kn.png Je pense que les images seraient les mêmes lors de l'impression, mais la différence sur l'image est la même sur la version imprimée. Avoir à mettre à l'échelle manuellement l'image avec ScaleXXX pour la corriger semble un peu illogique et ne donne pas un bon résultat.Image redimensionne automatiquement dans PdfPCell avec iTextSharp

Alors, comment puis-je mettre l'image dans sa taille d'origine à l'intérieur d'une PdfPCell d'une table sans avoir à l'échelle?

Voici mon code:

private PdfPTable CreateTestPDF() 
{ 
    PdfPTable table = new PdfPTable(1); 
    table.WidthPercentage = 100; 

    Phrase phrase = new Phrase("MY TITLE", _font24Bold); 
    table.AddCell(phrase); 

    PdfPTable nestedTable = new PdfPTable(5); 
    table.WidthPercentage = 100; 

    Phrase cellText = new Phrase("cell 1", _font9BoldBlack); 
    nestedTable.AddCell(cellText); 

    cellText = new Phrase("cell 2", _font9BoldBlack); 
    nestedTable.AddCell(cellText); 

    cellText = new Phrase("cell 3", _font9BoldBlack); 
    nestedTable.AddCell(cellText); 

    iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(@"d:\MyPic.jpg"); 
    image.Alignment = iTextSharp.text.Image.ALIGN_CENTER; 
    PdfPCell cell = new PdfPCell(image); 
    cell.HorizontalAlignment = PdfPCell.ALIGN_MIDDLE; 
    nestedTable.AddCell(cell); 

    cellText = new Phrase("cell 5", _font9BoldBlack); 
    nestedTable.AddCell(cellText); 

    nestedTable.AddCell(""); 

    string articleInfo = "Test Text"; 
    cellText = new Phrase(articleInfo, _font8Black); 
    nestedTable.AddCell(cellText); 

    nestedTable.AddCell(""); 
    nestedTable.AddCell(""); 
    nestedTable.AddCell(""); 

    table.AddCell(nestedTable); 
    SetBorderSizeForAllCells(table, iTextSharp.text.Rectangle.NO_BORDER); 
    return table; 
} 

static BaseColor _textColor = new BaseColor(154, 154, 154); 
iTextSharp.text.Font _font8 = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 8, iTextSharp.text.Font.NORMAL, _textColor); 
iTextSharp.text.Font _font8Black = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 8, iTextSharp.text.Font.NORMAL, BaseColor.BLACK); 
iTextSharp.text.Font _font9 = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 9, iTextSharp.text.Font.NORMAL, _textColor); 
iTextSharp.text.Font _font9BoldBlack = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 9, iTextSharp.text.Font.BOLD, BaseColor.BLACK); 
iTextSharp.text.Font _font10 = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 10, iTextSharp.text.Font.NORMAL, _textColor); 
iTextSharp.text.Font _font10Black = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 10, iTextSharp.text.Font.NORMAL, BaseColor.BLACK); 
iTextSharp.text.Font _font10BoldBlack = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 10, iTextSharp.text.Font.BOLD, BaseColor.BLACK); 
iTextSharp.text.Font _font24Bold = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 24, iTextSharp.text.Font.BOLD, _textColor); 
+0

Quelle version de iTextSharp utilisez-vous? – Stewbob

+0

J'utilise iTextSharp 5.0.2.0 –

+0

C'est comme 4 heures en Slovénie. Avez-vous déjà dormi? :) – Stewbob

Répondre

13

J'utilise v4.1.2 iTextSharp et je reçois le comportement suivant:

En utilisant ce code, en ajoutant l'image directement à la table via la méthode AddCell, l'image est agrandie pour adapter la cellule:

nestedTable.AddCell(image); 

en utilisant ce code, en ajoutant l'image à une cellule, puis en ajoutant la cellule à la table, l'image est affichée à sa taille d'origine:

PdfPCell cell = new PdfPCell(image); 
cell.HorizontalAlignment = PdfPCell.ALIGN_CENTER; 
nestedTable.AddCell(cell); 



Avez-vous ajouté l'image directement au document pdf (en dehors de la table), juste pour comparer/revérifier les tailles d'image?

document.add(image); 



Je suppose que vous voulez que l'image centrée dans la cellule avec un peu d'espace autour de lui. En dernier recours, vous pouvez changer votre image. Faites-en un png avec un fond transparent, et assurez-vous qu'il y a une «marge» transparente autour de tous les bords de votre image.

EDIT

Je viens de télécharger la version 5.0.2 et j'obtenir les mêmes résultats que mentionné ci-dessus. Je l'ai essayé avec des images qui sont à la fois plus petites et plus grandes que la taille de la cellule, et le comportement est le même; la première méthode met à l'échelle l'image, la seconde ne le fait pas.

EDIT

Eh bien, semble-t-je eu tort pendant des années sur toute chose DPI en matière d'images. Je ne peux pas sembler voir que cela fait n'importe quelle différence quel est le DPI de l'image.
J'ai créé une image 600x400px à trois résolutions différentes, 72 dpi, 96 dpi et 110 dpi. Puis j'ai ajouté chacune de ces images à un nouveau document qui était exactement 600x400.

Dim pSize As Rectangle = New Rectangle(600, 1000) 
Dim document As Document = New Document(pSize, 0, 0, 0, 0) 

Pour chacun des trois fichiers d'image, lorsqu'il est ajouté au document

document.add(image) 

qu'ils correspondent au document parfaitement, sans différence pour les différents paramètres DPI.

+0

J'ai essayé PdfPCell cell = new PdfPCell (image); et doc.Add (image); (directement au document ajouter) et ils donnent le même résultat de taille. Est-il possible que cela ait quelque chose à voir avec les DPI? –

+0

Oui. Un grand nombre d'images, comme ce qui serait affiché dans Paint.NET, sont de 96 dpi (ou autre chose). iTextSharp utilise toujours 72 dpi. Je sais que si la résolution de votre image est différente de 72, vous pouvez obtenir des résultats différents. Je l'avais oublié, parce que je crée toujours mes images «à utiliser en pdf» à 72dpi. – Stewbob

+0

72? dit ici dans la réponse acceptée, il est 110: http://stackoverflow.com/questions/2752789/how-to-calculate-the-correct-image-size-in-out-pdf-using-itextsharp ou ai-je mal compris cette réponse? –

2

Donc, si vous devez mantenir la taille de l'image dans le PdfPCell vous pouvez loock à ce code:

   iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imageFilePath); 

       // Save the image width 
       float width = image.Width; 
       PdfPCell cell = new PdfPCell(); 
       cell.AddElement(image); 


       // Now find the Image element in the cell and resize it 
       foreach (IElement element in cell.CompositeElements) 
       { 
        // The inserted image is stored in a PdfPTable, so when you find 
        // the table element just set the table width with the image width, and lock it. 
        PdfPTable tblImg = element as PdfPTable; 
        if (tblImg != null) 
        { 
         tblImg.TotalWidth = width; 
         tblImg.LockedWidth = true; 
        } 
       } 
9

@ réponse de Stewbob fonctionne, mais il est seulement accessoirement lié aux méthodes de la table.

La chose avec iTextSharp est qu'il se comportera différemment selon le constructeur que vous utilisez. Cela (fâcheusement) échelle l'image pour remplir la cellule:

PdfPCell c = new PdfPCell(); 
c.Add(image); 
c.setHorizontalAlignment(Element.ALIGN_CENTER); // this will be ignored 

Mais cela laissera l'image à la taille que vous définissez (et permettre l'alignement):

PdfPCell c = new PdfPCell(image); 
c.setHorizontalAlignment(Element.ALIGN_CENTER); 

Je ne Je sais exactement pourquoi c'est, ça a quelque chose à voir avec la cellule en 'mode texte' si vous ajoutez l'image dans le constructeur par rapport au 'mode composite' si vous l'ajoutez plus tard (auquel cas chaque objet est censé soigner c'est son propre alignement).

Un peu plus d'informations (en Java, mais applique encore) http://tutorials.jenkov.com/java-itext/table.html#cell-modes

+0

Ce pourrait être la caractéristique la plus étrange pas un bug que j'ai jamais vu. Merci beaucoup – Tommy

+0

Enlevant cette réponse parce qu'elle m'a permis de trouver une solution pour le même problème. Mais j'ai fait face à un comportement complètement différent - la méthode AddElement laisse l'image à la taille que vous avez définie mais le constructeur redimensionne l'image. J'utilise iTextSharp 5.5.3.0. –

1

La fonction a une propriété pour adapter l'image. Seulement ajouter un vrai

cell.AddElement(image,true); 
+4

Quelle version de itextsharp ou quel type de variable 'cellule' utilisez-vous? Dans mon (type PdfPCell) je ne peux trouver que la méthode: AddElement (élément IElement) – Bronek

+0

Je n'ai pas cette surcharge non plus - en utilisant iTextSharp 5.5.9. – rumblefx0

Questions connexes