首页 > 编程语言 >C# 将 HTML 转换为图片或 PDF

C# 将 HTML 转换为图片或 PDF

时间:2024-02-04 14:25:31浏览次数:29  
标签:C# doc System height width HTML webBrowser new PDF

原文链接:https://blog.csdn.net/slowlifes/article/details/72940116/

首先是把 HTML 转换为图片。

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        WebBrowser webBrowser = null;

        public void ConvertToImg()
        {
            webBrowser = new WebBrowser();

            //是否显式滚动条
            webBrowser.ScrollBarsEnabled = false;

            //加载HTML页面的地址
            webBrowser.Navigate("http://www.baidu.com");
            
            //页面加载完成执行事件
            webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);
        }

        private void webBrowser_DocumentCompleted(object sender, EventArgs e)//这个就是当网页载入完毕后要进行的操作
        {
            //获取解析后HTML的大小
            System.Drawing.Rectangle rectangle = webBrowser.Document.Body.ScrollRectangle;
            int width = rectangle.Width;
            int height = rectangle.Height;

            //设置解析后HTML的可视区域
            webBrowser.Width = width;
            webBrowser.Height = height;

            Bitmap bitmap = new System.Drawing.Bitmap(width, height);
            webBrowser.DrawToBitmap(bitmap, new System.Drawing.Rectangle(0, 0, width, height));

            //设置图片文件保存路径和图片格式,格式可以自定义
            string filePath = AppDomain.CurrentDomain.BaseDirectory + "../../SaveFIle/" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".png";
            bitmap.Save(filePath, System.Drawing.Imaging.ImageFormat.Png);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ConvertToImg();
        }
    }
上面这种方法是解析指定URL地址的HTML,然后转换为图片。当然,也可以直接写一些HTML标签。如下:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        WebBrowser webBrowser = null;
        public void ConvertToImg()
        {
            string html = "<div><table border = \"1\" cellspacing = \"0\" cellpadding = \"3\" style = \"text-align:center;\"><tr><th style = \"width:60px;\">字段1</th><th style = \"width:60px;\">字段2</th><th style = \"width:60px;\">字段3</th></tr><tr style = \"color:green;\"><td>小明</td><td>22</td><td>185</td></tr><tr style = \"color:red;\"><td>小青</td><td>21</td><td>170</td></tr></table></div>";

            webBrowser = new WebBrowser();

            //是否显式滚动条
            webBrowser.ScrollBarsEnabled = false;

            //加载 html
            webBrowser.DocumentText = html;
            
            //页面加载完成执行事件
            webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);
        }

        private void webBrowser_DocumentCompleted(object sender, EventArgs e)//这个就是当网页载入完毕后要进行的操作
        {
            //获取解析后HTML的大小
            System.Drawing.Rectangle rectangle = webBrowser.Document.Body.ScrollRectangle;
            int width = rectangle.Width;
            int height = rectangle.Height;

            //设置解析后HTML的可视区域
            webBrowser.Width = width;
            webBrowser.Height = height;

            Bitmap bitmap = new System.Drawing.Bitmap(width, height);
            webBrowser.DrawToBitmap(bitmap, new System.Drawing.Rectangle(0, 0, width, height));

            //设置图片文件保存路径和图片格式,格式可以自定义
            string filePath = AppDomain.CurrentDomain.BaseDirectory + "../../SaveFIle/" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".png";
            bitmap.Save(filePath, System.Drawing.Imaging.ImageFormat.Png);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ConvertToImg();
        }
    }
然后把图片转换为PDF,这里需要用到 iTextSharp.dll 这个组件。
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        WebBrowser webBrowser = null;
        public void ConvertToImg()
        {
            string html = "<div><table border = \"1\" cellspacing = \"0\" cellpadding = \"3\" style = \"text-align:center;\"><tr><th style = \"width:60px;\">字段1</th><th style = \"width:60px;\">字段2</th><th style = \"width:60px;\">字段3</th></tr><tr style = \"color:green;\"><td>小明</td><td>22</td><td>185</td></tr><tr style = \"color:red;\"><td>小青</td><td>21</td><td>170</td></tr></table></div>";

            webBrowser = new WebBrowser();

            //是否显式滚动条
            webBrowser.ScrollBarsEnabled = false;

            //加载 html
            webBrowser.DocumentText = html;
            
            //页面加载完成执行事件
            webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);
        }

        private void webBrowser_DocumentCompleted(object sender, EventArgs e)//这个就是当网页载入完毕后要进行的操作
        {
            //获取解析后HTML的大小
            System.Drawing.Rectangle rectangle = webBrowser.Document.Body.ScrollRectangle;
            int width = rectangle.Width;
            int height = rectangle.Height;

            //设置解析后HTML的可视区域
            webBrowser.Width = width;
            webBrowser.Height = height;

            Bitmap bitmap = new System.Drawing.Bitmap(width, height);
            webBrowser.DrawToBitmap(bitmap, new System.Drawing.Rectangle(0, 0, width, height));

            //设置图片文件保存路径和图片格式,格式可以自定义
            string filePath = AppDomain.CurrentDomain.BaseDirectory + "../../SaveFIle/" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".png";
            bitmap.Save(filePath, System.Drawing.Imaging.ImageFormat.Png);

            //创建PDF
            FileStream fileStream = new FileStream(AppDomain.CurrentDomain.BaseDirectory + "../../SaveFIle/" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".pdf", FileMode.Create);

            byte[] result = CreatePDF(bitmap, width, height);

            fileStream.Write(result, 0, result.Length);

            fileStream.Close();
            fileStream.Dispose();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ConvertToImg();
        }

        public byte[] CreatePDF(Bitmap bitmap, int width, int height)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                Document doc = new Document(new iTextSharp.text.Rectangle(0, 0, width, height), 3, 3, 3, 3);    // 左右上下

                PdfWriter writer = PdfWriter.GetInstance(doc, ms);

                writer.CloseStream = false;

                doc.Open();

                iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(bitmap, System.Drawing.Imaging.ImageFormat.Png);

                img.ScalePercent(100);      // 放缩比例

                doc.Add(img);       // 添加图片对像
                doc.Close();

                return ms.ToArray();
            }
        }
    }
不过这种生成图片之后再转成PDF,会造成像素的丢失,所以看起来要比图片模糊一点。
还有一种办法就是直接生成PDF,这里需要安装 ABCpdf。不过,这个是收费的。。。
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void ConvertToPDF()
        {
            string html = "<div><table border = \"1\" cellspacing = \"0\" cellpadding = \"3\" style = \"text-align:center;\"><tr><th style = \"width:60px;\">字段1</th><th style = \"width:60px;\">字段2</th><th style = \"width:60px;\">字段3</th></tr><tr style = \"color:green;\"><td>小明</td><td>22</td><td>185</td></tr><tr style = \"color:red;\"><td>小青</td><td>21</td><td>170</td></tr></table></div>";

            //创建一个Doc对象
            Doc doc = new Doc();

            //Rect默认是文档整个页面大小,这里的Inset表示将Rect左右留出15的空白,上下留出20的空白
            doc.Rect.Inset(15, 20);

            //直接设置html
            int docID = doc.AddHtml(html);

            //设置URL
            //int docID = doc.AddImageUrl("http://www.baidu.com");

            //设置字体
            doc.AddFont("Arial");

            while (true)
            {
                //判断是否还有内容
                if (!doc.Chainable(docID))
                {
                    break;
                }

                //如果还有内容就添加一页
                doc.Page = doc.AddPage();

                //根据ID添加内容并返回页面上该内容对应的新ID
                docID = doc.AddImageToChain(docID);
            }

            string filePath = AppDomain.CurrentDomain.BaseDirectory + "../../SaveFIle/" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".pdf";

            doc.Save(filePath);

            doc.Clear();
            doc.Dispose();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            ConvertToPDF();
        }
        
    }

标签:C#,doc,System,height,width,HTML,webBrowser,new,PDF
From: https://www.cnblogs.com/Dongmy/p/18006096

相关文章

  • hsv颜色提取小工具jcpicker介绍
    jcpicker.exe是一款绿色免安装颜色拾取器软件,约为2M大小,可以用于提取RGB颜色、HSV、HSL颜色值。双击jcpicker.exe打开软件后,如下图所示:                                            ......
  • 基础02-css篇
    二、CSS部分1 css sprite是什么,有什么优缺点 概念:将多个小图片拼接到⼀个图片中。通过background-position 和元素尺寸调节需要显示的背景图案。 优点:  减少HTTP请求数,极大地提高页面加载速度 增加图片信息重复度,提高压缩比,减少图片大小 更换⻛格⽅便,只......
  • Oracle向数据库插入日期格式数据
    插入系统日期insertintostudent(sno,sname,birthdate)values(007,'omit',sysdate);插入Oracle数据库指定格式的日期insertintostudent(sno,sname,birthdate)values(008,'Ding','18/11月/2022');使用todate()插入其他格式的日期(最常用)insertintostudent(sno,sname,......
  • c# 在 word指定位置插入文字和图片(替换 书签)
    原文链接:https://blog.csdn.net/chen1231985111/article/details/125811918使用Microsoft.Office.Interop.Word进行插入,word文件中插入“书签”。在com组件中引用Microsoft.Word.xxx.xx注意下面的坑:1.如果要兼容office2007,自己电脑上需要装个07才行(有可能不需要,我......
  • 开箱即用的数据mock工具,验收专用
    此插件主要为了前端小伙伴在编写页面时能更加真实的模拟仿真数据而提供的js插件库,内置了dayjs插件,支持人名、身份证号码、手机号、住址、随机数、主键id、随机日期等多种数据的模拟1.下载$npminstallimitatejs2.引入import{imitatejs}from'imitatejs'//在项目入口文件......
  • leetcode 第176题:第二高的薪水
    leetcode数据库第176题:第二高的薪水第一种:去掉最大的薪水,选取第二大的薪水selectmax(salary)asSecondHighestSalaryfromEmployeewheresalary<(selectmax(salary)fromEmployee);第二种:嵌套查询+去除null+去重要想获取第二高,需要排序,使用orderby(默认是升序a......
  • Springboot项目发布war到tomcat
    springboot项目有些日子没有开发了,新做一个minspringboot项目,复习下项目开发及发布流程。1.新建项目: 2.新建一个业务controllercontroller名称及方法,名称随意,项目结构如下: testcontroller代码文件的内容如下:packagecom.*****.Controller;importorg.springframewor......
  • 详解磁盘IO、网络IO、零拷贝IO、BIO、NIO、AIO、IO多路复用(select、poll、epoll)
    1.什么是I/O在计算机操作系统中,所谓的I/O就是输入(Input)和输出(Output),也可以理解为读(Read)和写(Write),针对不同的对象,I/O模式可以划分为磁盘IO模型和网络IO模型。IO操作会涉及到用户空间和内核空间的转换,先来理解以下规则:   内存空间分为用户空间和内核空间,也称为用户缓冲区和内......
  • 创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现
      本文介绍基于C++语言GDAL库,批量创建大量栅格遥感影像文件,并将数据批量写入其中的方法。  首先,我们来明确一下本文所需实现的需求。已知我们对大量遥感影像进行了批量读取与数据处理操作——具体过程可以参考文章C++GDAL提取多时相遥感影像中像素随时间变化的数值数组;而随......
  • 2024最新Office 2021 专业增强版密钥
    Office2021专业增强版是微软面向个人和小型企业的办公软件套装,包含Word、Excel、PowerPoint、Outlook、Access、Publisher、OneNote、Teams等应用程序。该版本新增了协作功能、云服务支持、人工智能增强等功能,可满足用户日常办公、商务协作、数据分析等需求。Office2021fo......