2010-03-26 82 views
7

Estoy usando iTextSharp para imprimir un documento PDF. Todo va bien hasta que tenga que imprimir el logotipo de la empresa.iTextSharp muestra imágenes con mala calidad en PDF

Primero me di cuenta de que el logotipo tenía mala calidad, pero después de probar con varias imágenes, me di cuenta de que era el iTextSharp que lo representaba mal. La prueba que hice para decir esto fue imprimir el PDF usando mi código y luego editar el documento con Acrobat 8.0 y dibujé una imagen. Luego imprimió los dos documentos y vio la notable diferencia. Mi pregunta es que si alguien sabe si esto puede deberse a un problema de escala en el que no le digo a iTextSharp cómo debe representar la imagen o si es una limitación de iTextSharp.

El código para hacer que la imagen es la siguiente:

  Dim para As Paragraph = New Paragraph 
      para.Alignment = Image.RIGHT_ALIGN 
      para.Add(text) 

      Dim imageFile As String = String.Format("{0}{1}", GetAppSetting("UploadDirectory"), myCompany.LogoUrl) 

      Dim thisImage As Image = Image.GetInstance(imageFile) 
      thisImage.Alignment = Image.LEFT_ALIGN 

      para.Add(thisImage) 

Las imágenes impresas son los siguientes: alt text http://img710.imageshack.us/img710/4199/sshot2y.png

imagen impresa directamente con iTextSharp

alt text http://img231.imageshack.us/img231/3610/sshot1z.png

imagen editada e impreso con Acrobat 8 ​​

EDIT: Estas imágenes del logotipo se cargan desde una página de carga, donde los uploades usuario cualquiera que sea la imagen del logotipo que quiera, y yo estaba escalando esa imagen utilizando el siguiente código:

  Dim graph As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(newImage) 

      graph.CompositingMode = Drawing.Drawing2D.CompositingMode.SourceOver 
      graph.CompositingQuality = Drawing.Drawing2D.CompositingQuality.HighQuality 
      graph.InterpolationMode = Drawing.Drawing2D.InterpolationMode.Bicubic 
      graph.SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality 
      graph.PixelOffsetMode = Drawing.Drawing2D.PixelOffsetMode.HighQuality 

      graph.DrawImage(newImage, 0, 0, newWidth, newHeight) 

      graph.Dispose() 
      graph = Nothing 

Esto estaba causando a perder información de la imagen original, así que cuando se imprimió en el pdf, esa pérdida de información fue muy notable porque, de alguna manera, iTextSharp estaba dibujando más grande de lo que era, sin importar la escala que puse allí. Intenté almacenar la imagen como estaba originalmente, evitando que el usuario cargue imágenes de más de 200K y cambie el tamaño de la imagen para poder mantener la relación de aspecto y usar ese cambio de tamaño con el objeto Imagen iTextSharp antes de imprimirlo. Esto resolvió mi problema de que la imagen se imprimiera con mala calidad para estas imágenes más grandes pero causó que el documento pdf tuviera un salto de página o simplemente no entrara en la página, cosa rara porque la imagen se ve bien pero se comporta como más grande. Esta es una captura de pantalla de la nueva imagen: alt text http://img38.imageshack.us/img38/5756/sshot3tc.png

EDIT 2:

Al inspeccionar la imagen iTextSharp que se envía a imprimir, no muestra cambios después de la escala usando ScaleAbsolute, por eso la página se rompe Pero se muestra correctamente, como si la imagen se escalara correctamente, pero el "papel" de fondo no. El código utilizado hasta ahora es el siguiente:

   Dim imageFile As String = String.Format("{0}{1}", GetAppSetting("UploadDirectory"), myCompany.LogoUrl) 

Dim thisImage como imagen = Image.GetInstance (imageFile) thisImage.Alignment = Image.LEFT_ALIGN

  Dim newWidth As Integer = myCompany.LogoWidth 
      Dim newHeight As Integer = myCompany.LogoHeight 
      ResizeImageToMaxValues(newWidth, newHeight) 
      thisImage.ScaleAbsolute(newWidth, newHeight) 

      para.Add(thisImage) 

      pdf.PdfDocument.Add(para) 

El ResizeImage método() hacer el cambio de tamaño del ancho y la altura respetando la relación de aspecto y manteniendo un ancho máximo y un límite máximo de altura.

Háganme saber si necesito proporcionar más información. Gracias

+0

Mi primer pensamiento sería que este es un problema de resolución, que cuando se crea la imagen del archivo y establecer su tamaño, lo Lo estoy haciendo mal, por lo que se crea con menos resolución que itextSharp necesita para reproducirlo con buena calidad, pero me gustaría saber qué piensas. – Sebastian

Respuesta

5

También tengo una buena experiencia con iTextSharp que muestra imágenes muy nítidas y claras. Intenté agregar la imagen directamente al documento y agregarla primero a un párrafo. Ambos dan resultados muy claros.

Dim document As Document = New Document(pSize, 20, 20, 20, 20) 
PdfWriter.GetInstance(document, New FileStream(myPath & "Test.pdf", FileMode.Create)) 
document.Open() 

Dim png As Image = Image.GetInstance(myPath & "myImageFile.png") 
document.Add(png) 

Dim pgr As New Paragraph 
pgr.Add(png) 
document.Add(pgr) 
document.Close() 

normalmente uso .png imágenes, pero he tenido el mismo éxito con jpeg, gif, etc.

¿Estás seguro de que al recuperar la imagen en iTextSharp es el mismo exacta imagen que recuperas cuando estás en Acrobat? Lo pregunto porque no está claro lo exaclty que está sucediendo en el código:

Dim imageFile As String=String.Format(..... 

EDITAR

Además, para asegurarse de que la imagen está mostrando en el tamaño que está esperando, debe guardar sus imágenes a 72 ppp . 72 dpi es lo que iTextSharp usa para todo (imágenes, márgenes, etc.). De esta forma, una imagen de 100px x 100px se mostrará como 100x100 en su documento pdf. No tendrá que preocuparse por escalar o cambiar el tamaño entonces. Cada vez que escala una imagen (arriba o abajo) corre el riesgo de introducir artefactos de alias (borrosidad).

+0

Bueno ... no, no eran las mismas imágenes porque la que estaba usando con iTextSharp fue redimensionada, por eso cambié eso anteriormente. Gracias +1 – Sebastian

1

Eso es extraño.Obten imágenes súper nítidas en mis archivos pdf. Hay pocas diferencias entre lo que hago y lo que tienes. Por ejemplo creo la imagen como esta:

Image instance = Image.GetInstance(System.Drawing.Image.FromFile(pathToImage), Color.WHITE); 

Por otra parte, ya que mi imagen es demasiado grande para caber llamo:

instance.ScalePercent(90f); 

Otra diferencia es que agrego la imagen directamente a la Document y no a Paragraph, aunque dudo que eso sea todo.

Editar:

Y, por último, mis imágenes son archivos JPEG.

Espero que ayude.

+0

@Sebastian, he actualizado mi respuesta. –

+0

muchas gracias! Lo estoy buscando ahora, te diré cómo fue – Sebastian

2

Para que el renderizado sea claro, intente hacer que la imagen sea 3 veces la imagen original, luego puede aplicar ScalePercent o ScaleToFit para cambiar el tamaño a un tamaño determinado.

muestra:

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath); 
logo.ScaleToFit(175f, 108f); 
document.Add(logo); 
0

Por mi parte terminó siendo un ajuste de la impresora!

Al cambiar los gráficos a Ráster (desde Vector) las imágenes se volvieron tan nítidas como deberían, pero ralentizaron tremendamente el sistema.

La segunda solución (gracias a la FD) fue cambiar los gráficos a Vector, pero para establecer el "Procesamiento de imagen" a Mejor.

estamos utilizando un RICOH Aficio MP C2050 PCL 6.

6

Aparte de la cuestión de la impresora (ver arriba), la punta 3 X por su amigo era la solución final.

Por lo tanto, para reformular, si desea que la imagen sea de 100 X 100 en el PDF, asegúrese de que su imagen sea de 300 px X 300 px o superior.

Intento también utilizar imágenes de 300dpi y no he probado con imágenes de menor calidad.

Ésta es mi imagen de código de la adición:

try 
{ 
    string uri = Environment.CurrentDirectory + "/" + "pdfwithimage_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf"; 
    string strImgJpg = Environment.CurrentDirectory + "/HeaderImage.jpg"; 

    Image imgJpg = Image.GetInstance(System.Drawing.Image.FromFile(strImgJpg), new BaseColor(System.Drawing.Color.White)); 

    using (Document pdf = new Document(PageSize.A4, 20, 20, 20, 20)) 
    { 
     if (pdf == null) 
     { 
      throw new NullReferenceException("PDF has not been instanciated"); 
     } 

     if (File.Exists(uri)) 
     { 
      File.Delete(uri); 
     } 

     using (PdfWriter pdfwriter = PdfWriter.GetInstance(pdf, new FileStream(uri, FileMode.Create))) 
     { 
      pdf.Open(); 

      imgJpg.SetDpi(300, 300); 

      imgJpg.ScaleToFit(100f, 100f); 

      pdf.Add(imgJpg); 

      pdf.Close(); 
     } 
    } 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.ToString()); 
    Console.ReadLine(); 
} 
+0

SetDpi (300,300) funcionó perfectamente para mí. –

0

Use imágenes png grande y que con iTextSharp cambiar el tamaño.

logoImage.ScalePercent(24f); 
0

Me encontré con el mismo problema. Pude solucionarlo desactivando la compresión. Mis archivos PDF que estoy generando no son muy grandes, por lo que el tamaño del archivo no fue demasiado alto.

var writer = iTextSharp.text.pdf.PdfWriter.GetInstance(document, stream); 
writer.SetPdfVersion(iTextSharp.text.pdf.PdfWriter.PDF_VERSION_1_7); 
writer.CompressionLevel = PdfStream.NO_COMPRESSION; 
1

El truco consiste en utilizar imágenes más grandes y reducirlas. Si la escala no está configurada y la imagen tiene su tamaño natural, será de baja calidad. Si la escala se establece y la imagen se dibuja más pequeña que su tamaño natural, la calidad será mejor.

Ejemplo de escalar hasta el tamaño 7 por ciento (de alta calidad):

var logo = Image.GetInstance(RImages.logo_600_icon, BaseColor.WHITE); 
logo.ScalePercent(7); 
var cell = new PdfPCell(logo); 
cell.Border = 0; 
table.AddCell(cell); 
Cuestiones relacionadas