0

我们正在使用名为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;
 }
}

[编辑]

是之前和之后的屏幕截图。

[编辑]

使用 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");
4

3 回答 3

2

好吧,这看起来像调整大小的努力,但它也可能是您的 Acrobat 阅读器在屏幕上执行此操作,实际数据非常好。

您应该能够通过在阅读器中单击图像来选择图像(因此它以蓝色突出显示),然后将其复制并粘贴到您选择的图像编辑程序中。这样,无论缩小到什么程度,您都应该在原始解决方案中获得资源。

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

于 2009-12-22T00:45:07.757 回答
1

关于 DynamicPDF 产品,在将图像添加到 PDF 文档时,不会对图像进行任何大小调整或重新采样。Pekka实际上是正确的。阅读器以不同的清晰度(在不同的缩放级别)在视觉上表示图像。

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

您可以做的另一件事是获取原始图像,右键单击它并选择“转换为 Adob​​e PDF”(需要完整的 Acrobat Pro)。在那个新创建的 PDF 中,您还可以直观地看到相同的结果。

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

以这种方式加载图像有两个明显的优势。首先是您没有涉及需要单独处理图像内容的 System.Drawing.Bitmap 对象的开销(因此理论上,如果没有这个,应用程序会运行得更快)。第二个优点是图像内容以原始压缩方式添加到 PDF。与 JPEG 图像的情况一样,使用图像的本机压缩而不是位图的压缩将导致更小的输出 PDF文件大小。这些都不会对输出 PDF 的图像质量产生任何影响,但会影响效率和输出 PDF 文件的大小。

于 2009-12-22T18:52:14.097 回答
0

您说得对,是 Acrobat 导致了显示模糊。首选项中有一个称为分辨率的设置,而不是默认使用系统 dpi 设置 Acrobat 决定使用 110 的自定义 dpi 设置(我不知道为什么!?!?)。将其设置为系统(在我的情况下为 96dpi)后,图像非常清晰。

于 2009-12-23T18:08:59.817 回答