代码之家  ›  专栏  ›  技术社区  ›  James

动态CPDF图像质量损失

  •  0
  • James  · 技术社区  · 15 年前

    我们正在使用一种叫 DynamicPDF 从数据库的动态数据中动态生成PDF。他们的文档说,他们的软件保持了图像字节的完整性,并且没有做任何更改。尽管如此,我们观察到我们添加的图像在生成的PDF输出上似乎有质量损失(至少是这样)。所以我的问题是,我需要如何处理dynamicpdf API,以确保图像质量输出等于或接近我输入的内容?

    我们正在使用版本5.1.2 build 13650,下面是用于添加图像的代码。

    private void plcImageMain_LaidOut(object sender, PlaceHolderLaidOutEventArgs e)
    {
     if (e.LayoutWriter.RecordSets.Current.HasData)
     {
             string productId = e.LayoutWriter.RecordSets.Current["ProductId"].ToString();
             string imgUrl = base.SetImageUrlParams(e.LayoutWriter.RecordSets.Current["ImageUrl"] as string, e.ContentArea.Width, e.ContentArea.Height);
    
             System.Drawing.Bitmap bm = base.GetBitmap(imgUrl);
    
             ceTe.DynamicPDF.PageElements.Image img = new ceTe.DynamicPDF.PageElements.Image(bm, 0, 0);
             img.Height = e.ContentArea.Height;
             img.Width = e.ContentArea.Width;
             e.ContentArea.Add(img);
     }
    }
    
    /// <summary>
    /// Gets a bitmap from the requested image url
    /// </summary>
    /// <param name="imgCtrl"></param>
    /// <param name="imgUrl"></param>
    protected System.Drawing.Bitmap GetBitmap(string imgUrl)
    {
     // TODO: Add some validation to ensure the url is an image.
     System.Net.WebRequest httpRequest = System.Net.HttpWebRequest.Create(imgUrl);
    
     using (System.Net.HttpWebResponse httpResponse = httpRequest.GetResponse() as System.Net.HttpWebResponse)
     using (Stream imgStream = httpResponse.GetResponseStream())
     {
        System.Drawing.Bitmap bm = System.Drawing.Bitmap.FromStream(imgStream) as System.Drawing.Bitmap;
        return bm;
     }
    }
    

    [编辑]

    Here 是前后截图。

    [编辑]

    使用getimage编码(为什么这么慢?)

    protected ceTe.DynamicPDF.Imaging.ImageData GetImageData(string imgUrl)
    {
       ImageData imgData = null;
       using (System.Net.WebClient wc = new System.Net.WebClient())
       {
         imgData = ImageData.GetImage(wc.DownloadData(imgUrl));
       }
      return imgData;
    }
    
    GetImageData ("http://s7d2.scene7.com/is/image/SwissArmy/cm_vm_53900E--111mm_sol_front_a?fmt=jpeg&wid=400&hei=640");
    
    3 回复  |  直到 13 年前
        1
  •  2
  •   Pekka    15 年前

    好吧,这看起来在调整大小方面做得不好,但它也可能是你的Acrobat阅读器在屏幕上做的,实际的数据非常好。

    您应该能够通过在读卡器中单击图像(使其突出显示为蓝色)来选择图像,然后将其复制并粘贴到您选择的图像编辑程序中。那样的话,你 应该 获取原始解决方案中的资源,无论其规模缩小到什么程度。

    还有一些工具可以从PDF中提取图像和其他资源,但我不知道可以马上推荐一个。

        2
  •  1
  •   Robbie    13 年前

    对于dynamicpdf产品,在将图像添加到PDF文档中时,没有对图像进行任何大小调整或重新采样。佩卡说得对。它是以不同的清晰度(在不同的缩放级别)直观地表示图像的阅读器。

    如果您能够从PDF中提取图像(正如Pekka上面建议的那样),您将看到图像数据是完全原始的,并且没有被修改。

    您还可以做另外一件事来演示这一点,即拍摄原始图像,右键单击它并选择“转换为Adobe PDF”(需要完整的Acrobat Pro)。在新创建的PDF中,您还可以直观地看到相同的结果。

    最后一件值得注意的事情是,上面显示的代码效率很低。现在,您将图像内容作为流提取,从该流对象中创建位图,然后使用该位图创建dynamicpdf图像对象。完成此操作的建议方法是获取从URL提取的图像的流对象,将其传递到dynamicpdf的imagedata静态方法“getimage”。此GetImage方法将返回ImageData对象。然后使用该ImageData从中创建dynamicpdf图像对象。

    以这种方式加载图像有两个明显的优点。首先,您不必为需要单独处理图像内容的system.drawing.bitmap对象增加开销(因此理论上,如果没有这个,应用程序的运行速度会更快)。第二个优点是图像内容被添加到PDF中,不管它最初是在什么本地压缩中。与jpeg图像一样,使用图像的本机压缩(而不是位图的压缩)将导致输出的pdf文件较小。这些都不会对输出PDF的图像质量产生任何影响,但会影响效率和输出PDF文件大小。

        3
  •  0
  •   James    15 年前

    你们都是对的,是杂技演员造成了模糊的显示。首选项中有一个设置称为分辨率,而不是默认情况下使用系统dpi设置Acrobat决定使用110的自定义dpi设置(我不知道为什么!)?!?)。在将其设置为系统(在我的例子中是96dpi)之后,图像是透明的。