【问题标题】:iTextSharp renders image with poor quality in PDFiTextSharp 在 PDF 中呈现质量较差的图像
【发布时间】:2011-02-01 05:30:51
【问题描述】:

我正在使用 iTextSharp 打印 PDF 文档。一切正常,直到我必须在其中打印公司徽标。

首先我注意到徽标的质量很差,但在测试了几张图片后,我意识到这是 iTextSharp 渲染它的质量很差。 我所做的测试是使用我的代码打印 PDF,然后使用 Acrobat 8​​.0 编辑文档并绘制图像。然后打印了两份文件,看到了明显的不同。 我的问题是,如果有人知道这是否是由于缩放问题造成的,我没有告诉 iTextSharp 它必须如何渲染图像或者是 iTextSharp 限制。

渲染图像的代码如下:

            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)

打印出来的图片如下: alt text http://img710.imageshack.us/img710/4199/sshot2y.png

直接用 iTextSharp 打印的图像

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

使用 Acrobat 8​​ 编辑和打印的图像

编辑: 这些徽标图像是从用户上传任何他想要的徽标图像的上传页面加载的,我正在使用以下代码缩放该图像:

            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

这会导致原始图像中的信息丢失,因此当在 pdf 中打印时,信息丢失非常明显,因为不知何故,iTextSharp 绘制的尺寸比原来大,无论我在那里进行缩放。 因此,我尝试按原样存储图像,防止用户不上传大于 200K 的图像并调整图像大小,以便我可以保持纵横比,并在打印之前将调整大小与 iTextSharp Image 对象一起使用。 这解决了我的问题,即这些较大图像的图像打印质量较差,但导致 pdf 文档出现分页符或不适合页面,这很奇怪,因为图片看起来尺寸不错,但表现得好像更大. 这是新图像的屏幕截图: alt text http://img38.imageshack.us/img38/5756/sshot3tc.png

编辑 2:

检查发送打印的 iTextSharp 图像时,使用 ScaleAbsolute 缩放后显示没有任何变化,这就是分页的原因。但显示正确,就像图像已成功缩放,但背景“纸张”却没有。 目前使用的代码如下:

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

将 thisImage 调暗为 Image = 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)

ResizeImage() 方法根据纵横比调整宽度和高度,并保持最大宽度和最大高度限制。

如果我需要提供更多信息,请告诉我。谢谢

【问题讨论】:

  • 我的第一个想法是这是一个分辨率问题,当我从文件创建图像并设置它的大小时,我做错了,所以它的分辨率低于 itextSharp需要以公平的质量渲染它,但我想知道你的想法。

标签: asp.net vb.net itextsharp


【解决方案1】:

这很奇怪。我在我的 pdf 文件中获得了超级清晰的图像。我所做的和你所拥有的几乎没有区别。例如我创建这样的图像:

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

此外,由于我的图像太大,我打电话给:

instance.ScalePercent(90f);

另一个区别是我将图像直接添加到Document 而不是Paragraph,尽管我怀疑就是这样。

编辑

最后,我的图片是 jpeg。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    我在 iTextSharp 渲染非常清晰的图像方面也有很好的经验。我尝试将图像直接添加到文档中并先将其添加到段落中。两者都给出了非常明确的结果。

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

    我通常使用 .png 图像,但我在 jpeg、gif 等方面也取得了同样的成功。

    您确定当您在 iTextSharp 中检索图像时,它与您在 Acrobat 中检索的图像完全相同相同吗?我问是因为不清楚您的代码中发生了什么确切的事情:

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

    编辑

    此外,为确保图像以您期望的尺寸显示,请将图像保存为 72dpi。 72 dpi 是 iTextSharp 用于所有内容(图像、边距等)的分辨率。 这样,100px x 100px 的图像将在您的 pdf 文档上显示为 100x100。那时您不必担心缩放或重新调整大小。每当您缩放图像(放大或缩小)时,都存在引入锯齿伪影(模糊)的风险。

    【讨论】:

    • 嗯...不,它们不是相同的图像,因为我与 iTextSharp 一起使用的图像是调整大小的图像,这就是我在上面进行更改的原因。谢谢+1
    【解决方案3】:

    为使渲染清晰,请尽量使图像为原始图像的 3 倍,然后您可以应用 ScalePercent 或 ScaleToFit 调整大小到一定大小。

    示例:

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

    【讨论】:

      【解决方案4】:

      在我这边,它最终成为了打印机设置!

      将图形更改为光栅(从矢量)使图像尽可能清晰,但大大降低了系统速度。

      第二个解决方案(感谢 FD)是将图形改回矢量,但将“图像处理”设置为最佳。

      我们使用的是 RICOH Aficio MP C2050 PCL 6。

      【讨论】:

        【解决方案5】:

        除了打印机问题(见上文),Your Friend 的 3 X 提示是最终解决方案。

        因此,换句话说,如果您希望 PDF 上的图像为 100 X 100,请确保您的图像为 300 像素 X 300 像素或更大。

        我也尝试使用 300dpi 的图像,但我没有测试过较低质量的图像。

        这是我的图片添加代码:

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

        【讨论】:

          【解决方案6】:

          使用更大的 png 图像,而不是使用 iTextSharp 更改大小。

          logoImage.ScalePercent(24f);
          

          【讨论】:

            【解决方案7】:

            我遇到了同样的问题。我可以通过关闭压缩来修复它。我生成的 pdf 文件不是很大,因此文件大小命中并不太贵。

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

            【讨论】:

              【解决方案8】:

              诀窍是使用更大的图像并按比例缩小它们。如果未设置比例且图像具有自然大小,则质量较差。如果缩小比例,把图片画得比自然尺寸小,画质会更好。

              缩小到 7% 大小的示例(高质量):

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-09-20
                • 2016-08-09
                • 2016-12-29
                • 2016-04-07
                • 2021-12-31
                • 2016-05-25
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多