.NET/C#下html转PDF,PDF加水印,PDF转图片

一、添加OpenHtmlToPdf,iTextSharp,O2S.Components.PDFRender4NET引用

(1)OpenHtmlToPdf:是一个.NET库(开源的),用于将HTML文档呈现为PDF格式。

github地址:https://github.com/vilppu/OpenHtmlToPdf

(2)iTextSharp:是一个.NET下处理pdf文件的库,提供给pdf文件加水印的功能。

官网:https://itextpdf.com/en

(3)O2S.Components.PDFRender4NET:是一个.NET库,用于将PDF文档呈现为图片。

想要在C#中把html转成PDF,PDF转成图片,首先得要有个C#版的驱动。

通过网络下载或nuget安装,得到OpenHtmlToPdf、iTextSharp、O2S.Components.PDFRender4NET相关的dll,添加到项目中引用。

第一步:在项目中右键,选择管理NuGet程序包

.NET/C#下html转PDF,PDF加水印,PDF转图片_第1张图片

第二步:搜索OpenHtmlToPdf、iTextSharp,选中安装

.NET/C#下html转PDF,PDF加水印,PDF转图片_第2张图片

.NET/C#下html转PDF,PDF加水印,PDF转图片_第3张图片

第三步:下载O2S.Components.PDFRender4NET.dll,在Nuget中没找到,只能自己找资源下载了

下载地址:https://download.csdn.net/download/u011301348/12442663

下载完成后添加dll引用到项目中

通过这三步,在项目中有OpenHtmlToPdf、iTextSharp、O2S.Components.PDFRender4NET的引用,表示添加成功

.NET/C#下html转PDF,PDF加水印,PDF转图片_第4张图片

二、创建PDFTools工具类

///


/// PDF工具
///

public class PDFTools
{
        ///
        /// html转pdf
        ///

        ///
        /// 水印图片
        ///
        public static string HtmlToPdf(string html, string watermarkimg)
        {
            var document = Pdf.From(html)
                .OfSize(PaperSize.A4)  //大小,这里选A4纸大小
                .WithGlobalSetting("margin.top", "0.4cm");  //设置全局样式

            //此属性的值在32位进程中为4,在64位进程中为8。
            if (IntPtr.Size == 4)
            {
                document = document.WithObjectSetting("load.zoomFactor", "1.5");
            }
            var result = document.Content();
            string filePath = "pdf/" + DateTime.Now.ToString("yyyyMMddHH") + "/";//路径
            if (!Directory.Exists(filePath))
            {
                Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + filePath);//保存在当前项目跟路径下
            }
            string fileName = DateTime.Now.ToString("yyyyMMddHHmmssffffff") + ".pdf";
            //通过stream把html写入到pdf文件中
            FileStream fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + filePath + fileName, FileMode.Create, FileAccess.Write);
            fs.Write(result, 0, result.Length);
            fs.Close();
            //加水印
            string filewatermarkPath = filePath + DateTime.Now.ToString("yyyyMMddHHmmssffffff") + ".pdf";
            var res = PDFWatermark(AppDomain.CurrentDomain.BaseDirectory + filePath + fileName, AppDomain.CurrentDomain.BaseDirectory + filewatermarkPath, watermarkimg);
            if (res)
            {
                if (File.Exists(AppDomain.CurrentDomain.BaseDirectory + filePath + fileName))
                    File.Delete(AppDomain.CurrentDomain.BaseDirectory + filePath + fileName);
                return filewatermarkPath;
            }
            else
                return filePath + fileName;
        }

        ///


        /// PDF转化为图片
        ///

        /// 文件路径
        /// 分辨率
        ///
        public static List PDFToIMG(string filePath, float resolution)
        {
            string imgPath = "pdf/IMG/" + DateTime.Now.ToString("yyyyMMddHH") + "/";
            //如果文件夹不存在,则创建
            if (!Directory.Exists(imgPath))
            {
                Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + imgPath);
            }
            PDFFile file = PDFFile.Open(filePath);
            int pageCount = file.PageCount;
            List imgPathList = new List();
            for (int i = 0; i < pageCount; i++)
            {
                string imgName = DateTime.Now.ToString("yyyyMMddHHmmssffffff") + ".jpg";
                Bitmap img = file.GetBWPageImage(i, resolution);
                img.Save(AppDomain.CurrentDomain.BaseDirectory + imgPath + imgName, System.Drawing.Imaging.ImageFormat.Jpeg);
                imgPathList.Add(imgPath + imgName);
            }
            return imgPathList;
        }

        ///


        /// pdf加水印
        ///

        /// 模板路径
        /// 导出水印背景后的PDF
        /// 水印图片
        ///
        public static bool PDFWatermark(string inputfilepath, string outputfilepath, string ModelPicName)
        {
            PdfReader pdfReader = null;
            PdfStamper pdfStamper = null;
            try
            {
                pdfReader = new PdfReader(inputfilepath);
                pdfStamper = new PdfStamper(pdfReader, new FileStream(outputfilepath, FileMode.Create));
                PdfGState gs = new PdfGState();
                gs.FillOpacity = 0.4f;//透明度

                iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(ModelPicName);

                int numberOfPages = pdfReader.NumberOfPages;

                //每一页加2个水印,也可以设置某一页加水印
                for (int i = 1; i <= numberOfPages; i++)
                {
                    PdfContentByte waterMarkContent = pdfStamper.GetOverContent(i);//内容上层加水印
                    //PdfContentByte waterMarkContent = pdfStamper.GetUnderContent(i);//内容下层加水印
                    waterMarkContent.SetGState(gs);
                    image.SetAbsolutePosition(20, 100);//水印定位坐标
                    waterMarkContent.AddImage(image);
                    image.SetAbsolutePosition(20, 300);
                    waterMarkContent.AddImage(image);
                }
                //一定要2个循环才会在每一个加上水印,咱也不知道为啥,反正是试了好久试出来的
                for (int i = 1; i <= numberOfPages; i++)
                {
                    PdfContentByte waterMarkContent = pdfStamper.GetOverContent(i);//内容上层加水印
                    //PdfContentByte waterMarkContent = pdfStamper.GetUnderContent(i);//内容下层加水印
                    waterMarkContent.SetGState(gs);
                    image.SetAbsolutePosition(20, 100);
                    waterMarkContent.AddImage(image);
                    image.SetAbsolutePosition(20, 300);
                    waterMarkContent.AddImage(image);
                }
                return true;
            }
            catch (Exception ex)
            {
                ex.Message.Trim();
                return false;
            }
            finally
            {
                if (pdfStamper != null)
                    pdfStamper.Close();

                if (pdfReader != null)
                    pdfReader.Close();
            }
        }
}

三、调用

在HomeController中添加一下方法。

1.定义组装html生成pdf文件,并给pdf加水印方法

public string CreatePdf()
{
            StringBuilder detail = new StringBuilder();
            detail.Append(@"

pdf商品

");
            detail.Append(@"");
            detail.Append("");
            detail.Append("");
            detail.Append("");
            detail.Append("");
            detail.Append("");
            detail.Append("");
            detail.Append("");
            detail.Append("");
            for (int i = 1; i < 100; i++)
            {
                detail.Append("");
                detail.Append($"");
                detail.Append($"");
                detail.Append($"");
                detail.Append($"");
                detail.Append($"");
                detail.Append($"");
                detail.Append("");
                i++;
            }
            detail.Append("

序号

商品名称

品牌

单位

规格

价格

{i}商品{i}品牌{i}单位{i}规格{i}价格{i}
");
            //生成PDF
            string html = $"pdf{detail.ToString()}";
            string pdfPath = PDFTools.HtmlToPdf(html, $"{AppDomain.CurrentDomain.BaseDirectory}/Images/wm.jpeg");
            return pdfPath;
}

2.在Index中调用。

public ActionResult Index()
{
            string pdfpath = CreatePdf();//生成pdf,加水印
            ViewBag.pdfpath = pdfpath;
            ViewBag.imgpath = PDFTools.PDFToIMG(AppDomain.CurrentDomain.BaseDirectory + pdfpath, 200);//pdf转图片
            return View();
}

3.查看结果

.NET/C#下html转PDF,PDF加水印,PDF转图片_第5张图片

4.浏览器中打开pdf文件效果

.NET/C#下html转PDF,PDF加水印,PDF转图片_第6张图片

5.转换成图片效果

.NET/C#下html转PDF,PDF加水印,PDF转图片_第7张图片

四、代码下载地址

https://download.csdn.net/download/u011301348/12446794

你可能感兴趣的:(html转pdf,pdf转图片)