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

时间:2024-03-27 11:06:32

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

二、创建PDFTools工具类

/// <summary>
/// PDF工具
/// </summary>
public class PDFTools
 {
        /// <summary>
        /// html转pdf
        /// </summary>
        /// <param name="html"></param>
        /// <returns></returns>
        public static string HtmlToPdf(string html)
        {
            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();
            return filePath + fileName;//返回pdf路径
        }

        /// <summary>
        /// PDF转化为图片
        /// </summary>
        /// <param name="filePath">文件路径</param>
        /// <param name="resolution">分辨率</param>
        /// <returns></returns>
        public static List<string> 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<string> imgPathList = new List<string>();
            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;
        }
}

三、调用

在HomeController中添加一下方法。

1.定义组装html生成pdf方法

public string CreatePdf()
        {
            StringBuilder detail = new StringBuilder();
            detail.Append(@"<p><span style='FONT-FAMILY:宋体;BACKGROUND:white;COLOR:#333333'></span></p><p><span style='FONT-FAMILY:宋体;BACKGROUND:white;COLOR:#333333'>pdf商品</span></p>");
            detail.Append(@"<table style='WIDTH:280px' height='159' cellspacing='0' cellpadding='0' width='807' align='center' uetable='null' data-sort='sortDisabled'><tbody>");
            detail.Append("<tr class='firstRow'>");
            detail.Append("<td valign='top' width='47'><p><span style='FONT-SIZE:13px;FONT-FAMILY:宋体;BACKGROUND:white;COLOR:#333333'>序号</span></p></td>");
            detail.Append("<td valign ='top' width='83'><p style='TEXT-ALIGN:center'><span style='FONT-SIZE:13px;FONT-FAMILY:宋体;BACKGROUND:white;COLOR:#333333'>商品名称</span></p></td>");
            detail.Append("<td valign='top' width='132'><p style='TEXT-ALIGN:center'><span style='FONT-SIZE:13px;FONT-FAMILY:宋体;BACKGROUND:white;COLOR:#333333'>品牌</span></p ></td>");
            detail.Append("<td valign='top' width='75'><p style='TEXT-ALIGN:center'><span style='FONT-SIZE:13px;FONT-FAMILY:宋体;BACKGROUND:white;COLOR:#333333'>单位</span></span></p></td>");
            detail.Append("<td valign='top' width='50'><p style='TEXT-ALIGN:center'><span style='FONT-SIZE:13px;FONT-FAMILY:宋体;BACKGROUND:white;COLOR:#333333'>规格</span></p></td>");
            detail.Append("<td valign='top' width='66'><p style='TEXT-ALIGN:center'><span style='FONT-SIZE:13px;FONT-FAMILY:宋体;BACKGROUND:white;COLOR:#333333'>价格</span></p></td>");
            detail.Append("</tr>");
            for (int i = 1; i < 100; i++)
            {
                detail.Append("<tr>");
                detail.Append($"<td valign='top' width='47'>{i}</td>");
                detail.Append($"<td valign='top' width='83'>商品{i}</td>");
                detail.Append($"<td valign='top' width='83'>品牌{i}</td>");
                detail.Append($"<td valign='top' width='83'>单位{i}</td>");
                detail.Append($"<td valign='top' width='83'>规格{i}</td>");
                detail.Append($"<td valign='top' width='83'>价格{i}</td>");
                detail.Append("</tr>");
                i++;
            }
            detail.Append("</tbody></table>");
            //生成PDF
            string html = $"<!DOCTYPE html><html><head><meta charset='UTF-8'><title>pdf</title></head><body>{detail.ToString()}</body></html>

2.在Index中调用。

 public ActionResult Index()
        {
            ViewBag.pdfpath = CreatePdf();
            return View();
        }

3.查看结果

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

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

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

5.转换成图片

调用方法:PDFTools.PDFToIMG("文件.pdf", 200);

生成图片文件

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

浏览查看

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

四、代码下载地址

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