我们正在使用一个名为DynamicPDF的产品从数据库动态数据中动态生成PDF。他们的文档说,他们的软件不改变图像字节,不做任何更改。尽管如此,我们已经观察到,我们添加的图像在最终的PDF输出上似乎出现了质量损失(至少它们的外观是这样的)。因此,我的问题是,我需要对DynamicPDF API做些什么,以确保图像质量输出与我的输入相同或接近?
我们使用的是版本5.1.2Build 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");发布于 2009-12-23 18:08:59
你们都是对的,是Acrobat造成了模糊的显示。首选项中有一个名为分辨率的设置,而不是默认使用System设置,Acrobat决定使用自定义dpi设置为110 (我不知道为什么!?!)在将其设置为system (在我的例子中为96 the )之后,图像非常清晰。
发布于 2009-12-22 00:45:07
好的,这看起来像调整大小的努力很差,但是它也可以是你的Acrobat阅读器在屏幕上做它,在实际数据是非常好的。
您应该能够通过单击Reader (因此它是蓝色的)选择图像,然后将其复制并粘贴到您选择的图像编辑程序中。这样,您就应该在原始解决方案中获取资源,而不管它被缩小到什么程度。
也有从PDF中提取图像和其他资源的工具,但我不知道我可以直接推荐哪一种。
发布于 2009-12-22 18:52:14
对于DynamicPDF产品,没有对图像进行任何调整或重采样,因为它是添加到PDF文档中的。其实佩卡在这件事上做得很对。是读取器在视觉上以不同的清晰度(在不同的缩放级别)表示图像。
如果您能够从PDF中提取图像(正如上面Pekka所建议的那样),您将看到图像数据是完全原始的,而不是修改的。
您还可以做的另一件事来演示这一点是采取您的原始图像,右键单击它,并选择“转换为Adobe”(需要完整的Acrobat Pro)。在新创建的PDF中,您还可以直观地看到相同的结果。
最后值得注意的一点是,您在上面显示的代码中有一小部分效率低下。现在,您正在将图像内容作为流,从该Stream对象中创建一个位图,然后使用该位图创建DynamicPDF图像对象。实现这一目标的推荐方法是从URL中提取图像的Stream对象,将其传递到DynamicPDF的ImageData静态方法"GetImage“中。此GetImage方法将返回ImageData对象。然后使用该ImageData创建您的DynamicPDF图像对象。
以这种方式加载图像有两个明显的优点。首先,您没有需要单独处理图像内容的System.Drawing.Bitmap对象所涉及的开销(因此理论上,如果没有这一点,应用程序会运行得更快)。第二个优点是图像内容被添加到PDF中,不管它最初是在什么原生压缩中。与JPEG图像一样,使用图像的本机压缩(而不是位图的压缩)将导致输出PDF文件的大小变小。所有这些都不会对输出PDF的图像质量产生任何影响,但会影响输出PDF文件的效率和大小。
https://stackoverflow.com/questions/1943249
复制相似问题