使用iTextSharp为PDF图片加白色边框时出现1像素边缘的解决方法
解决iTextSharp添加图片白色边框时的1像素边缘问题
哈哈这个问题我之前用iTextSharp做PDF生成的时候也踩过坑!就是给图片加白色边框后,总会露出一丢丢原图的边缘,看着特别别扭对吧?别担心,给你两个亲测有效的解决办法:
方案一:先绘制白色背景矩形(最稳妥)
这个方法是最靠谱的,咱们不用依赖图片自带的Border属性,而是手动在图片下面先画一个白色的大矩形——就像给图片铺个白色的底,尺寸比图片大出你要的边框宽度,这样就算图片边缘有那1px的小瑕疵,也会被下面的白色完全盖住,视觉上和白色边框一模一样。
修改后的代码如下:
iTextSharp.text.Rectangle rec = new iTextSharp.text.Rectangle(PageSize.A4); iTextSharp.text.Document document = new iTextSharp.text.Document(rec); using (var writer = PdfWriter.GetInstance(document, new FileStream("file.pdf", FileMode.Create))) { document.Open(); iTextSharp.text.Image pic = iTextSharp.text.Image.GetInstance("picture.jpg"); pic.ScaleToFit(document.PageSize.Width, document.PageSize.Height); // 计算图片的原始位置和边框宽度 float borderWidth = 20f; float imgX = 0; float imgY = (document.PageSize.Height - pic.ScaledHeight) / 2; // 获取底层内容流,在图片下方绘制白色矩形 PdfContentByte contentUnder = writer.DirectContentUnder; contentUnder.SetColorFill(BaseColor.WHITE); // 矩形尺寸:图片宽+左右边框,图片高+上下边框,位置向左向下偏移边框宽度 contentUnder.Rectangle( imgX - borderWidth, imgY - borderWidth, pic.ScaledWidth + 2 * borderWidth, pic.ScaledHeight + 2 * borderWidth ); contentUnder.Fill(); // 保持图片原来的位置 pic.SetAbsolutePosition(imgX, imgY); document.Add(pic); document.Close(); }
方案二:调整图片的缩放与偏移
如果不想额外绘制矩形,也可以耍个小技巧:把图片稍微放大一丢丢,然后稍微偏移位置,让图片的边缘刚好超出原来的边框区域,把那讨厌的1px边缘给盖住。不过这个方法可能因为图片本身的比例或者分辨率有差异,效果不一定每次都完美,还是第一种更稳妥。
参考代码:
iTextSharp.text.Rectangle rec = new iTextSharp.text.Rectangle(PageSize.A4); iTextSharp.text.Document document = new iTextSharp.text.Document(rec); using (var writer = PdfWriter.GetInstance(document, new FileStream("file.pdf", FileMode.Create))) { document.Open(); iTextSharp.text.Image pic = iTextSharp.text.Image.GetInstance("picture.jpg"); // 把图片放大2px,刚好覆盖那1px的边缘 float scaleFactor = (document.PageSize.Width + 2) / pic.Width; pic.ScaleAbsolute(pic.Width * scaleFactor, pic.Height * scaleFactor); // 向左偏移1px,让图片左右各超出页面1px,盖住边缘 float imgX = -1; float imgY = (document.PageSize.Height - pic.ScaledHeight) / 2; // 保留原来的边框设置 pic.Border = Image.LEFT_BORDER | Image.TOP_BORDER | Image.RIGHT_BORDER | Image.BOTTOM_BORDER; pic.BorderWidthLeft = 20f; pic.BorderWidthTop = 20f; pic.BorderWidthRight = 20f; pic.BorderWidthBottom = 20f; pic.BorderColor = new iTextSharp.text.BaseColor(System.Drawing.Color.White); pic.SetAbsolutePosition(imgX, imgY); document.Add(pic); document.Close(); }
另外还有个小补充:如果图片本身的边缘有透明或者半透明像素,也可能导致这种情况,你可以先在PS或者其他图片工具里把图片边缘裁剪掉1px,再导入使用,也能解决问题哦。
内容的提问来源于stack exchange,提问作者Valeriy




