2010-06-11 13 views
8

Ho un problema strano con le immagini nella libreria iTextSharp. Aggiungo l'immagine al PdfPCell e per qualche motivo viene aumentata. Come posso mantenere la dimensione originale? Here's the image del PDF al 100% e l'immagine nelle dimensioni originali è stata aperta in paint.net. alt text http://a.yfrog.com/img697/7102/3kn.png Mi sembra che le immagini siano uguali quando stampate, ma la differenza sulla foto è la stessa nella versione stampata. Dovendo ridimensionare manualmente l'immagine con ScaleXXX per farla a destra sembra un po 'illogico e non dà un buon risultato.Ridimensionamento automatico dell'immagine in PdfPCell con iTextSharp

Quindi, come posso inserire l'immagine nella sua dimensione originale all'interno di un PdfPCell di una tabella senza dover ridimensionarla?

Ecco il mio codice:

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

Quale versione di iTextSharp stai usando? – Stewbob

+0

sto usando iTextSharp 5.0.2.0 –

+0

Sono le 4 del mattino in Slovenia. Dormi mai? :) – Stewbob

risposta

13

sto usando iTextSharp V4.1.2 e ottengo il seguente comportamento:

Utilizzando questo codice, aggiungendo l'immagine direttamente al tavolo tramite il metodo AddCell, l'immagine viene scalato per adattarsi alla cella:

nestedTable.AddCell(image); 

Usando questo codice, aggiungendo l'immagine di una cella, quindi aggiungendo la cella a tavola, l'immagine viene visualizzata nelle dimensioni originali:

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



Hanno aggiunto l'immagine direttamente al documento pdf (al di fuori della tabella) solo per confrontare/ricontrollare le dimensioni delle immagini?

document.add(image); 



Presumo che si desidera che l'immagine centrata nella cella con un po 'di spazio intorno ad esso. Come ultima risorsa, puoi cambiare la tua immagine. Rendilo un png con uno sfondo trasparente e assicurati che ci sia un "margine" trasparente intorno a tutti i bordi dell'immagine.

EDIT

Ho appena scaricato la v5.0.2 e ottenere gli stessi risultati di cui sopra. L'ho provato con immagini che sono entrambe più piccole e più grandi delle dimensioni della cella, e il comportamento è lo stesso; il primo metodo ridimensiona l'immagine, il secondo metodo no.

EDIT

Beh, a quanto pare sono stato sbagliato per anni su tutta la faccenda DPI quando si tratta di immagini. Non riesco a vedere che fa alcuna differenza per quanto riguarda il DPI dell'immagine.
Ho creato un'immagine 600x400px con tre risoluzioni diverse, 72 dpi, 96 dpi e 110 dpi. Poi ho aggiunto ciascuna di queste immagini a un nuovo documento che era esattamente 600x400.

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

Per ognuna delle tre file di immagini, quando aggiunti al documento con

document.add(image) 

si adattano perfettamente il documento, senza differenze per le diverse impostazioni DPI.

+0

ho provato PdfPCell cell = new PdfPCell (image); e doc.Add (immagine); (diretto per aggiungere documento) e danno lo stesso risultato di dimensioni. È possibile che abbia qualcosa a che fare con i DPI? –

+0

Sì. Molte immagini, come quelle che verrebbero visualizzate in Paint.NET, sono 96 dpi (o qualcos'altro). iTextSharp utilizza sempre 72 dpi. So che se il dpi dell'immagine è diverso da 72, potresti ottenere risultati diversi. Mi ero dimenticato di questo, perché creo sempre le mie immagini "da usare in pdf" a 72 dpi. – Stewbob

+0

72? dice qui nella risposta accettata è 110: http://stackoverflow.com/questions/2752789/how-to-calculate-the-correct-image-size-in-out-pdf-using-itextsharp o ho frainteso quella risposta? –

2

Quindi, se si deve mantenere la dimensione dell'immagine nella PdfPCell si può loock a questo codice:

   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

@ risposta di Stewbob funziona, ma è solo incidentalmente legato ai metodi della tabella.

La cosa con iTextSharp è che si comporta in modo diverso a seconda del costruttore che si utilizza. In questo modo (fastidiosamente) ingrandire l'immagine per riempire la cella:

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

Ma questo lascerà l'immagine con le dimensioni si imposta (e consentire l'allineamento):

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

I don' Sappiamo esattamente perché questo è, ha qualcosa a che fare con la cella in "modalità testo" se si aggiunge l'immagine nel costruttore rispetto a "modalità composita" se la si aggiunge in un secondo momento (nel qual caso ogni oggetto deve occuparsi di è proprio l'allineamento).

qualche info in più (in Java, ma si applica ancora) http://tutorials.jenkov.com/java-itext/table.html#cell-modes

+0

Questa potrebbe essere la caratteristica più strana, non un bug che abbia mai visto. Grazie mille – Tommy

+0

Upvoting questa risposta perché mi ha permesso di trovare una soluzione per lo stesso problema. Ma ho affrontato un comportamento completamente diverso: il metodo AddElement lascia l'immagine alla dimensione impostata ma il costruttore ridimensiona l'immagine. Sto usando iTextSharp 5.5.3.0. –

1

La funzione ha una proprietà per adattarsi all'immagine. Solo aggiungere un vero

cell.AddElement(image,true); 
+4

Quale versione di itextsharp o quale tipo di variabile 'cell' usi? Nel mio (tipo PdfPCell) posso trovare solo il metodo: AddElement (elemento IElement) – Bronek

+0

Non ho questo sovraccarico neanche - usando iTextSharp 5.5.9. – rumblefx0

Problemi correlati