2010-03-26 19 views
7

Ich verwende iTextSharp, um ein PDF-Dokument zu drucken. Alles läuft gut, bis ich das Firmenlogo ausdrucken muss.iTextSharp rendert Bild mit schlechter Qualität in PDF

Zuerst bemerkte ich, dass das Logo eine schlechte Qualität hatte, aber nachdem ich mit mehreren Bildern getestet hatte, merkte ich, dass das iTextSharp es schlecht darstellte. Der Test, den ich gemacht habe, war, das PDF mit meinem Code zu drucken und dann das Dokument mit Acrobat 8.0 zu bearbeiten und ein Bild zu zeichnen. Dann druckten die beiden Dokumente und sahen den erkennbaren Unterschied. Meine Frage ist, wenn jemand weiß, ob dies auf ein Skalierungsproblem zurückzuführen sein kann, wo ich iTextSharp nicht sagen kann, wie es das Bild rendern muss oder eine iTextSharp-Beschränkung ist.

Der Code um das Bild zu aufzubereiten ist folgende: alt text http://img710.imageshack.us/img710/4199/sshot2y.png

Bild gedruckt direkt mit iTextSharp

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

Bild bearbeitet:

  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) 

Die gedruckten Bilder folgend und mit Acrobat 8 ​​

gedruckt

EDIT: Diese Logo-Bilder werden von einer Upload-Seite geladen, wo der Benutzer uploades was auch immer das Logo-Bild er will, und ich war das Bild mit dem folgenden Code Skalierung:

  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 

Dies verursache Informationen zu verlieren Aus dem Originalbild, also wenn es in der PDF gedruckt wurde, war das Verlieren von Informationen sehr auffällig, weil iTextSharp irgendwie größer zeichnete, als es war, egal welche Skalierung ich dort hineinlegte. Also habe ich versucht, das Bild so zu speichern, wie es ursprünglich war. Der Benutzer konnte keine Bilder größer als 200K hochladen und die Größe des Bildes ändern, um das Seitenverhältnis beizubehalten und diese Größe mit dem iTextSharp Image Objekt zu verwenden, bevor es gedruckt wurde. Dies löste mein Problem, dass das Bild mit schlechter Qualität für diese größeren Bilder gedruckt wurde, aber das PDF-Dokument einen Seitenumbruch hatte oder einfach nicht in die Seite passte, seltsam, weil das Bild in der Größe gut aussieht, aber es verhält sich wie es war größer. Diese ist ein Screen-Capture des neuen Bildes: alt text http://img38.imageshack.us/img38/5756/sshot3tc.png

EDIT 2:

Wenn die iTextSharp Bild Inspektion, die gedruckt werden gesendet wird, zeigt es keine Änderungen nach der Skalierung mit ScaleAbsolute, deshalb Die Seite bricht ab. Aber wird korrekt angezeigt, wie das Bild erfolgreich skaliert wurde, aber der Hintergrund "Papier" war nicht. Der Code bisher verwendete ist die folgende:

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

Dim thisImage als Bild = 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) 

Verfahren ResizeImage() tun das Größenanpassung der Breite und Höhe unter Berücksichtigung des Seitenverhältnisses und Einhaltung einer maximalen Breite und einer maximalen Höhe.

Bitte lassen Sie mich wissen, wenn ich weitere Informationen bereitstellen muss. Danke

+0

Mein erster Gedanke wäre, dass dies ein Problem mit der Auflösung ist, dass, wenn schaffe ich das Bild aus der Datei und deren Größe festgelegt, ich mache ich es falsch, also ist es mit weniger Auflösung erstellt als die itextSharp es mit fairer Qualität rendern muss, aber ich würde gerne wissen, was Sie denken. – Sebastian

Antwort

5

Ich habe auch gute Erfahrungen mit iTextSharp Rendering sehr scharfe und klare Bilder. Ich habe versucht, das Bild direkt zu dem Dokument hinzuzufügen und es zuerst zu einem Absatz hinzuzufügen. Beide geben sehr klare Ergebnisse.

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() 

Ich benutze .png Bilder normalerweise, aber ich habe den gleichen Erfolg mit jpeg, gif, usw.

Sind Sie sicher hatte, dass, wenn Sie das Bild in iTextSharp abrufen es die genaue gleiche Bild, das Sie abrufen, wenn Sie in Acrobat sind? Ich frage, weil es unklar ist, was exaclty im Code passiert:

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

EDIT

auch um sicherzustellen, dass das Bild in der Größe angezeigt werden Sie erwarten, Ihre Bilder in 72dpi speichern . 72 dpi ist was iTextSharp für alles verwendet (Bilder, Ränder, etc ..). Auf diese Weise wird ein 100px x 100px Bild als 100x100 auf Ihrem PDF-Dokument angezeigt. Sie müssen sich dann keine Gedanken über Skalierung oder Größenanpassung machen. Jedes Mal, dass Sie ein Bild skalieren (nach oben oder unten), die Sie ausführen, um die Gefahr der Einschleppung von Aliasing-Artefakte (Verschwommenheit).

+0

Nun ... nein, sie waren nicht die gleichen Bilder, weil die, die ich mit iTextSharp verwendet wurde eine Größe war, deshalb habe ich das oben geändert. Danke +1 – Sebastian

1

Das ist seltsam.Ich bekomme super scharfe Bilder in meinen PDF-Dateien. Es gibt wenige Unterschiede zwischen dem, was ich mache und dem, was du hast. Zum Beispiel habe ich das Bild wie folgt zu erstellen:

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

Da weiterhin mein Bild zu groß nenne ich zu passen:

instance.ScalePercent(90f); 

Ein weiterer Unterschied ist, dass ich das Bild direkt auf die Document hinzufügen und nicht zu einem Paragraph, obwohl ich bezweifle, dass das ist es.

bearbeiten:

Und schließlich, meine Bilder sind JPEG-Dateien.

Ich hoffe, es hilft.

+0

@Sebastian, ich habe meine Antwort aktualisiert. –

+0

vielen Dank! Ich sehe es jetzt, ich werde dir sagen, wie es ging – Sebastian

2

Um das Rendering deutlich zu machen, versuchen Sie das Bild 3-mal das Originalbild zu machen, dann können Sie ScalePercent oder ScaleToFit gelten für bestimmte Größe zu ändern.

Probe:

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

Auf meiner Seite beendet es Einstellung ist ein Drucker up!

Ändern der Grafiken auf Raster (von Vector) gemacht, um die Bilder so scharf, wie sie sein sollten, aber verlangsamt das System enorm nach unten.

Die zweite Lösung (dank der FD) war die Grafik wieder auf Vektor zu ändern, aber die „Bildverarbeitung“ Best einzustellen.

Wir haben die RICOH Aficio MP C2050 PCL war verwenden 6.

6

Neben dem Drucker Ausgabe (siehe oben), die 3 X Spitze durch Ihren Freund die endgültige Lösung.

Also, neu zu formulieren, wenn Sie das Bild wollen 100 X 100 auf dem PDF sein, dann stellen Sie sicher, dass Ihr Bild 300px X 300px oder größer.

Ich versuche, auch 300 dpi Bilder zu verwenden, und ich habe nicht mit Bildern niedrigerer Qualität getestet.

Das ist mein Bild Hinzufügen von Code:

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) funktionierte perfekt für mich. –

0

Verwenden größer PNG-Bilder und als mit iTextSharp die Größe ändern.

logoImage.ScalePercent(24f); 
0

Ich lief auf das gleiche Problem. Ich konnte es beheben, indem ich die Komprimierung deaktivierte. Meine PDF-Dateien, die ich erstelle, sind nicht sehr groß, also war die Dateigröße nicht zu teuer.

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

Der Trick besteht darin, größere Bilder zu verwenden und sie zu verkleinern. Wenn die Skala nicht eingestellt ist und das Bild seine natürliche Größe hat, ist die Qualität schlecht. Wenn die Skalierung festgelegt ist und das Bild kleiner als die natürliche Größe gezeichnet wird, ist die Qualität besser.

Beispiel der Skalierung auf 7 Prozent Größe (hohe Qualität):

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