You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动