Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net iTextSharp以PDF格式渲染质量差的图像_Asp.net_Vb.net_Itextsharp - Fatal编程技术网

Asp.net iTextSharp以PDF格式渲染质量差的图像

Asp.net iTextSharp以PDF格式渲染质量差的图像,asp.net,vb.net,itextsharp,Asp.net,Vb.net,Itextsharp,我正在使用iTextSharp打印PDF文档。一切都很顺利,直到我必须在上面印上公司的标志 Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath); logo.ScaleToFit(175f, 108f); document.Add(logo); 首先,我注意到徽标的质量很差,但在使用多个图像进行测试后,我意识到这是iTextSharp渲染效果很差的原因。 我做的测试是用我的代码打印PDF,然后用Acrobat8.0编辑文档,

我正在使用iTextSharp打印PDF文档。一切都很顺利,直到我必须在上面印上公司的标志

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
首先,我注意到徽标的质量很差,但在使用多个图像进行测试后,我意识到这是iTextSharp渲染效果很差的原因。 我做的测试是用我的代码打印PDF,然后用Acrobat8.0编辑文档,我画了一幅图像。然后打印这两份文件,看到明显的区别。 我的问题是,如果有人知道这是否是由于缩放问题造成的,我没有告诉iTextSharp它必须如何渲染图像,或者是iTextSharp的限制

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
渲染图像的代码如下所示:

            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)
                Dim imageFile As String = String.Format("{0}{1}", GetAppSetting("UploadDirectory"), myCompany.LogoUrl)
Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
打印图像如下所示:

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
使用iTextSharp直接打印图像

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

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
使用Acrobat 8编辑和打印图像

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
编辑: 这些徽标图像是从上载页面加载的,用户在该页面上载他想要的任何徽标图像,我使用以下代码缩放该图像:

            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
Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
这导致了原始图像的信息丢失,所以当打印在pdf中时,信息丢失是非常明显的,因为不知何故,iTextSharp的绘图比它更大,无论我在那里进行了缩放。 因此,我尝试按原样存储图像,防止用户不上传大于200K的图像,并调整图像大小,以便我可以保持纵横比,并在打印前使用iTextSharp图像对象调整大小。 这解决了我的问题,即对于这些较大的图像,图像打印质量较差,但导致pdf文档出现分页符或根本不适合页面,这很奇怪,因为图片看起来大小不错,但表现得好像较大。 这是新图像的屏幕截图:

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

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
检查发送要打印的iTextSharp图像时,使用ScaleAbsolute缩放后,图像没有显示任何变化,这就是页面中断的原因。但显示正确,就像图像成功缩放,但背景“纸”没有。 目前使用的代码如下:

            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)
                Dim imageFile As String = String.Format("{0}{1}", GetAppSetting("UploadDirectory"), myCompany.LogoUrl)
Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
将此图像调暗为Image=Image.GetInstance(imageFile) thisImage.Alignment=Image.LEFT\u 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)
Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
方法ResizeImage()根据纵横比调整宽度和高度的大小,并保持最大宽度和最大高度限制

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

请让我知道,如果我需要提供更多的信息。谢谢,真奇怪。我在我的pdf文件中得到超级清晰的图像。我所做的和你所做的几乎没有区别。例如,我创建的图像如下所示:

Image instance = Image.GetInstance(System.Drawing.Image.FromFile(pathToImage), Color.WHITE);
Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
此外,由于我的形象太大,无法容纳,我称之为:

instance.ScalePercent(90f);
Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
另一个区别是,我直接将图像添加到
文档
,而不是添加到
段落
,尽管我对此表示怀疑

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

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
最后,我的图像是JPEG

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

希望有帮助。

我对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()
Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
我通常使用.png图像,但我在jpeg、gif等方面也取得了同样的成功

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
您确定在iTextSharp中检索图像时,它与在Acrobat中检索的图像完全相同吗?我这样问是因为不清楚您的代码中发生了什么:

Dim imageFile As String=String.Format(.....
Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
编辑

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
此外,为了确保图像以您期望的大小显示,请以72dpi保存图像。72 dpi是iTextSharp用于一切(图像、边距等)的数据。
这样,一个100px x 100px的图像将在您的pdf文档中显示为100x100。那么,您就不必担心缩放或重新调整大小了。任何时候缩放图像(向上或向下)都有引入锯齿瑕疵(模糊)的风险。

要使渲染清晰,请尝试使图像为原始图像的3倍,然后可以应用ScalePercent或ScaleToFit将其调整为特定大小

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

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

在我这方面,它最终成为一个打印机设置

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
将图形更改为光栅(从矢量)使图像尽可能清晰,但大大降低了系统的速度

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
第二个解决方案(感谢FD)是将图形更改回矢量,但将“图像处理”设置为最佳

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

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

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

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
因此,换言之,如果您希望PDF上的图像为100 X 100,请确保您的图像为300px 300px或更大

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
我也尝试使用300dpi图像,但我没有测试过质量较低的图像

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
这是我的图像添加代码:

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
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();
}

使用比ITEXT更大的png图像并急剧更改大小

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

我遇到了同样的问题。我可以通过关闭压缩来修复它。我正在生成的pdf文件不是很大,所以所需的文件大小不会太大

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
var writer = iTextSharp.text.pdf.PdfWriter.GetInstance(document, stream);
writer.SetPdfVersion(iTextSharp.text.pdf.PdfWriter.PDF_VERSION_1_7);
writer.CompressionLevel = PdfStream.NO_COMPRESSION;

诀窍是使用较大的图像并将其缩小。如果未设置比例且图像具有其自然大小,则图像质量将很差。如果设置了比例,并且绘制的图像小于其自然大小,则质量会更好

Image logo = Image.GetInstance(pdfReportData.CompanyLogoPath);
logo.ScaleToFit(175f, 108f);
document.Add(logo);
缩小到7%大小(高质量)的示例:

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

我的第一个想法是,这是一个分辨率问题,当我从文件创建图像并设置其大小时,我做错了,因此创建的图像的分辨率低于itextSharp以公平质量渲染图像所需的分辨率,但我想知道你的想法。嗯。。。不,它们不是相同的图像,因为我在iTextSharp中使用的是一个调整大小的图像,这就是我在上面更改的原因。谢谢+1