【问题标题】:How to add an image background as watermark to the pdf file?如何将图像背景作为水印添加到 pdf 文件中?
【发布时间】:2021-10-05 05:47:36
【问题描述】:

我创建了 ExportToPDF 按钮来将 Gridview 导出为 PDF 文件,那么如何在 PDF 文件中添加图像背景作为水印?

protected void ExportToPDF(object sender, EventArgs e)
{
    using (StringWriter sw = new StringWriter())
    using (HtmlTextWriter hw = new HtmlTextWriter(sw))
    {
        gvOrders.RenderControl(hw);
        StringReader sr = new StringReader(sw.ToString());
        Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
        PdfWriter writer = PdfWriter.GetInstance(pdfDoc, Response.OutputStream);
        pdfDoc.Open();
        XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr);
        pdfDoc.Close();
        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.pdf");
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Write(pdfDoc);
        Response.End();
    }
}

【问题讨论】:

  • 我在这里没有看到问题。阅读How to Ask
  • 您的Response.Write(pdfDoc) 行将在您的pdf 末尾添加垃圾字节。这将导致一些 pdf 处理器拒绝它。

标签: c# asp.net pdf


【解决方案1】:

一个解决方案是;

private static Image watermark_600
        {
            get
            {
                if (_watermark_600 == null)
                    _watermark_600 = Image.FromFile(HttpContext.Current.Server.MapPath(@"~/content/Images/watermark600.png"));
                return _watermark_600;
            }
        }

那么,

public static byte[] AddWaterMark(byte[] fileContent)
        {
            if (fileContent == null)
                return null;
            //create a image object containing the photograph to watermark            
            using (var img = new ImageFactory())
            using (var imgWatermark = new ImageLayer())
            {
                img.Load(fileContent);
                if (img.Image.Width < 750 && img.Image.Height < 750)
                    imgWatermark.Image = (Image)watermark_200.Clone();
                else if (img.Image.Width < 1500 && img.Image.Height < 1500)
                    imgWatermark.Image = (Image)watermark_400.Clone();
                else if (img.Image.Width < 2500 && img.Image.Height < 2500)
                    imgWatermark.Image = (Image)watermark_600.Clone();
                else
                    imgWatermark.Image = (Image)watermark_800.Clone();

                int x = Math.Abs((img.Image.Width - imgWatermark.Image.Width)) / 2;
                int y = Math.Abs((img.Image.Height - imgWatermark.Image.Height)) / 2;

                imgWatermark.Position = new Point(x, y);
                imgWatermark.Opacity = 90;
                img.Overlay(imgWatermark);
                using (MemoryStream msbyte = new MemoryStream())
                {
                    img.Save(msbyte);
                    return msbyte.ToArray();
                }
            }
        }

【讨论】:

  • 该操作显然使用 itext 5.x,并且从未将完整的 pdf 用作文件或字节数组。这与您的解决方案兼容吗?
  • 是的,我正在使用 iTextSharp,但上面的答案没有帮助
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 2014-06-29
  • 2018-12-02
相关资源
最近更新 更多