C#搭建简单的http服务器,在线html转pdf应用

LocalServer

使用web链接打开本地应用 (含在线抓取网页生成pdf)

[官网地址]

[github地址:https://github.com/deriva/LocalServer]

c# html生成pdf,C#编写 HTML生成PDF的方式有几种
这里介绍一种:C#使用wkhtmltopdf,把HTML生成PDF(包含分页)
架构设计:

本地搭建一个控制台应用程序(指定端口:15080)—>

web系统 利用ajax访问本地程序:http://127.0.0.1:15080


本地搭建一个控制台应用程序过程:主要用到HttpListener 监听 核心代码如下
//服务对象

public static MyHttpServer httpServer;
static void Main(string[] args)
 {

     Console.Title = ("本地服务器");
     Console.ForegroundColor = ConsoleColor.DarkGreen;
     ToolUtils.Print("-------------------------------------------------------------------------", 0);
     ToolUtils.Print("-----------------------------    Hello World ----------------------------", 0);
     ToolUtils.Print("-------------------------------------------------------------------------", 0);
    //启动http服务
     httpServer = new MyHttpServer(routes);//初始化,传入路由
     httpServer.respNotice += dataHandle;//回调方法,接收到http请求时触发
     httpServer.Start(15080);//端口  
     Console.ReadKey();
}

web页面调用本地服务方法其实很简单:
检测web服务是否 开始:
//检测本地服务是否开启

  $.ajax({
    url: 'http://127.0.0.1:15080/Pdf/index',
    type: 'get',
    complete: function (r) {
        if (r.status == 200) {
           //开启 todo
        } else {
            layer.alert("本地服务未开启,请先开启再来导出");
        }
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        layer.alert("本地服务未开启,请先开启再来导出");
    }
  });

接下来的我们可以在自己的页面调用本地服务了 ,可以通过传要抓取的页面http地址,和下载的pdf文件名 2个参数
html代码如下:

<input type="button" class="layui-btn btnexport" value="本地导出" onclick="PP.ExportPdf(1)" />
<script type="text/javascript">
   var PP = {
       Export2: () => {//通过workhtml来转pdf
          var url = "http://www.baidu.com";//要抓取的页面 这里可以自己切换更改
           var data = { };
           data.NewPdfFileName = url;
           data.SourceUrl ="自己指定的pdf文件名.pdf";
           $.get("http://127.0.0.1:15080/Pdf/index", data, function (r) {
               layer.closeAll();
               if (top.location != self.location) {
                   parent.layer.alert(r.message, function () {
                       $.get("http://127.0.0.1:15080/Pdf/operdir", data);
                       parent.layer.closeAll();
                   })
               } else {
                   layer.alert(r.message, function () { layer.closeAll(); })
               }
      
           });
       }
   }

</script>


注意:有动态生成二维码的页面 需要用到QRCodeEncoder 由服务端生成图片流

简单介绍其他方式生成pdf
jspdf

 <script src="/js/jqueryplus/htmlcanvas/html2canvas.min.js"></script>
 <script src="/js/jqueryplus/htmlcanvas/jspdf.debug.js"></script>
    $("#" + divID).css("background-color", "white");
               var canvas_new = document.createElement("canvas");

               var scale = 3;

               var w = parseInt(window.getComputedStyle(document.querySelector("#" + divID)).width);

               var h = parseInt(window.getComputedStyle(document.querySelector("#" + divID)).height);
               canvas_new.width = w * scale;

               canvas_new.height = h * scale;

               canvas_new.getContext("2d").scale(scale, scale);
               var options = {
                   canvas: canvas_new
               };

               html2canvas(document.querySelector("#" + divID), options).then(function (canvas) {

                   var contentWidth = canvas.width;

                   var contentHeight = canvas.height;



                   //一页pdf显示html页面生成的canvas高度;

                   var pageHeight = contentWidth / 592.28 * 841.89;

                   //未生成pdf的html页面高度

                   var leftHeight = contentHeight;

                   //页面偏移

                   var position = 0;

                   //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高

                   var imgWidth = 595.28;

                   var imgHeight = 592.28 / contentWidth * contentHeight + 45;



                   var pageData = canvas.toDataURL('image/jpeg', 1.0);

                   var pdf = new jsPDF('', 'pt', 'a4');

                   //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)

                   //当内容未超过pdf一页显示的范围,无需分页

                   if (leftHeight < pageHeight) {

                       pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight);

                   } else {

                       while (leftHeight > 0) {

                           pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)

                           leftHeight -= pageHeight;

                           position -= 841.89;

                           //避免添加空白页

                           if (leftHeight > 0) {

                               pdf.addPage();

                           }

                       }

                   }

                   pdf.save('我的.pdf');
               });
   ```
这种方式生成pdf 当页面小的时候 没有问题  当页面特别大有5,6页的时候就会有问题

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值