我们正在使用名为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");
答案 0 :(得分:2)
好吧,这看起来很难调整大小,但它也可能是你的Acrobat读者在屏幕上做的,实际数据非常好。
您应该可以通过在Reader中单击它来选择图像(因此它突出显示为蓝色),然后将其复制并粘贴到您选择的图像编辑程序中。这样,你应该获得原始解决方案中的资源,无论它缩小到什么程度。
还有一些工具可以从PDF中提取图像和其他资源,但我不知道我可以随意推荐。
答案 1 :(得分:1)
对于DynamicPDF产品,在将图像添加到PDF文档时,不会对图像进行任何调整大小或重新采样。 Pekka实际上是正确的。读者可视地表示具有不同清晰度的图像(在不同的缩放级别)。
如果您能够从PDF中提取图像(如上面Pekka所建议的那样),您将看到图像数据完全是原始的而不是修改的。
您可以做的另一件事就是拍摄原始图像,右键单击它并选择“转换为Adobe PDF”(需要完整的Acrobat Pro)。在新创建的PDF中,您还可以直观地看到相同的结果。
最后值得注意的是,您在上面显示的代码中效率很低。现在,您将图像内容作为Stream拉出,从该Stream对象创建一个位图,然后使用该位图创建DynamicPDF Image对象。建议的方法是从URL中获取图像的Stream对象,将其传递给DynamicPDF的ImageData静态方法“GetImage”。此GetImage方法将返回ImageData对象。然后使用该ImageData创建DynamicPDF Image对象。
以这种方式加载图像有两个明显的优点。首先,您没有涉及需要单独处理图像内容的System.Drawing.Bitmap对象的开销(因此理论上,如果没有这个,应用程序将运行得更快)。第二个优点是图像内容以原始压缩的方式添加到PDF中。与JPEG图像一样,使用图像的原生压缩而不是位图的压缩将导致输出PDF更小文件大小。这些都不会对输出PDF的图像质量产生任何影响,但它可能会影响效率并输出PDF文件大小。
答案 2 :(得分:0)
你是正确的,它是Acrobat导致模糊显示。在偏好设置中有一个称为分辨率的设置,而不是默认使用系统dpi设置Acrobat决定使用110的自定义dpi设置(我不知道为什么!?!?)。将其设置为系统(在我的情况下为96dpi)后,图像非常清晰。