跨平台导PDF,结合wkhtmltopdf很顺手

前言

好东西要分享,之前一直在使用wkhtmltopdf进行pdf文件的生成,常用的方式就是先安装wkhtmltopdf,然后在程序中用命令的方式将对应的html生成pdf文件,简单而且方便;但重复的编码使得想在wkhtmltopdf基础上进行封装,偶然间发现有小伙伴已经封装的还不错啦,常用的功能都已经实现,源码地址:https://github.com/fpanaccia/Wkhtmltopdf.NetCore。

作者将其打包成Nuget包(Wkhtmltopdf.NetCore),直接引入使用即可;

正文

既然用到了.NetCore,肯定就要考虑到跨平台兼容性,对于wkhtmltopdf之前一直是在Windows上使用,还没有在其他平台尝试;这个包封装的行不行,拉出来遛遛就知道啦,接下来就试试:

1. 建个API项目,引入包和兼容对应平台的wkhtmltopdf执行文件

注:默认依赖的wkhtmltopdf执行文件需要存放在Rotativa目录下,可以自定义名称,如果自定义,需要再注册服务时指定对应的文件名;这里的wkhtmltopdf已经根据不同平台进行编译打包了,无需安装,这些文件在源码那就有;

2.创建PDFTestController控制器,添加如下接口进行测试

首先把生成pdf的服务注入进来,后续直接使用就可以啦:

接下来就开始写接口啦,这里只是测试,代码冗余没有考虑,在实际项目中小伙伴可以根据自己需求进行封装;

  • ExportPDFByHtml 接口,用html直接生成pdf文件,但这里没有保存,以文件流的形式访问,通过浏览器查看文件,可以自行下载;html模板在实际开发过程中可以单独用文件存储;


    SavePDFByHtml接口,直接保存文件,文件名可以根据需要进行自定义;


    TestMarginAndPageSize接口,设置Margin和PageSize参数,其他参数也可以设置;


    ConvertOptions默认封装了以下属性,小伙伴也可以自定义扩展,只要继承IConvertOptions即可,这里就不演示的,因为官方有对应的案例,下伙伴下去搞搞,wkhtmltopdf的参数挺多的,都可以进行封装使用。


  • ExportByRazorView使用Razor视图的方式进行pdf文件生成,此库已经支持cshtml文件的读取


    根据指定视图生成对应的pdf效果,如下:

  • ExportByRazorViewData数据动态绑定,既然支持视图,那就应该支持Razor语法,一般常用的就是数据绑定了,上面是静态的,接下来来个动态绑定的。

    根据指定视图生成对应的pdf效果,如下:


    如上基本的使用演示就说那么多,使用还是很简单,小伙伴后续可以根据自己的需要进行相关扩展;当然还有其他功能,比如设置页眉/页脚等,作者提供有对应的案例;这里不说那么多,不然又是长文。

3. 小伙伴用的时候可能会遇到的问题

  • 在开发调试运行项目时,会报找不到wkhtmltopdf文件,那是因为运行时的确找不到对应的文件,将对应Rotativa下的文件设置为始终复制即可:


  • 在Windows下怎么玩都没问题啦,开始发布到Linux(我用的centos 7),我擦,莫名其妙的错。


    看见这个错我懵的,一顿搜索猛如虎,还是没找到答案;冷静下来,重新捋捋,原来是自己在犯傻;

    两个问题需要解决,1.上传到Linux下的wkhtmltopdf没有给执行权限;2.可能环境缺少对应的依赖库;

    设置可执行权限

    在Linux环境下,可以通过ll命令查看权限,刚开始是没有权限的,只需要执行chmod 777 wkhtmltopdf命令,执行权限就有了,如下图中红框中的x就是可执行权限,关于Linux常用命令,后续单独整理一篇;


    安装缺少的依赖库

    可执行权限开启之后,别急着去访问页面,这样可能还是错误。因为可能缺少依赖库,那咋知道缺少呢,我是直接执行wkhtmltopdf,执行成功就没啥,不成功就会报缺少相关依赖,然后直接安装就行啦;执行./wkhtmltopdf https://www.baidu.com ./test.pdf试试就知道啦,因为wkhtmltopdf本身是可以单独运行的,并不依赖我们写的程序。

  • 当执行成功之后,然后开始访问接口导出功能,如果不出意外,遇到中文就产生乱码啦,那是因为Linux环境下缺少相关的字体文件,将对应的字体文件拷贝到Linux上即可,字体我找好了,下载地址如下:

    链接: https://pan.baidu.com/s/1jikC0DUkpEzpXL5ysjEQPA 提取码: tn4j

    将下载下来的字体解压,然后拷贝到Linux下的   /usr/share/fonts目录下即可

最后这样应该就没啥问题啦,剩下的就交给小伙伴自己摸索搞实践吧;

此文源码地址:https://github.com/zyq025/DotNetCoreStudyDemo

wkhtmltopdf官网地址:https://wkhtmltopdf.org/

总结

使用还是很简单的,常规的需求没啥问题,如果需要功能定制化,小伙伴可以参考源码,自己封装一个(封装思路不难的);如果小伙伴有比较好的导出库,免费开源的那种,一起分享出来玩玩。

一个被程序搞丑的帅小伙,关注"Code综艺圈",跟我一起学~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

女人15个秘密武器疼爱男人(女人必看)

一、成为他的空气 男人有时是更犹豫的,更孩子气的,比女人更少有勇气去承担爱的。他就像是那条在水里游来游去的鱼,一直在高唱着“我要自由”的歌曲。所以你只有慢慢***他的生活里,令他身在其中,舒适而不自觉&#xff0…

ueditor如何设置上传图片的高度宽度_怎么设置天猫主图

天猫主图很多人都设置过,不过,新手第一长主图往往不是很在行,所以也不懂怎么设置?那今天,麦顶电商就给大家科普下关于天猫长主图的知识,想要学习设置长主图的店主,这期的内容也正好适合你们。用…

鸿蒙系统2020正式版,鸿蒙2.0来了!华为开发者大会HDC 2020宣布

原标题:鸿蒙2.0来了!华为开发者大会HDC 2020宣布华为官方宣布,2020年度华为开发者大会“HDC Together”将于9月10日至9月12日在东莞松山湖举办,早鸟门票明天起开售。根据预告,本次大会将带来主题演讲、技术论坛、行业大…

洋哥!我要进大厂!

阅读本文大概需要4分钟。最近不少读者咨询洋哥如何进大厂,回答的多了就想着要不整理出一个系列文章出来。说干就干,第一期先写写应届毕业和刚工作不久的计算机专业的童鞋如何进大厂。先说说必须要做到的几件事:第一,学校内的课程&…

战神II导演 首席程序员访谈(转自www.npc6.com )

当乔治卢卡斯在星球大战系列中取得了那样巨大的成功之后,伊文克什纳接手帝国反击战导演的任务肯定不是个轻松的担子,不过结果大家还是普遍的认为这是系列里最好一部。类似的,战神的导演David Jaffe也是一个难以追随的榜样。当他宣布了把导演的…

调整png的不透明度_TGA与PNG的优劣对比

一、TGA与PNG的特点(一)PNG 解码混乱 不稳定 有时候不能识别 放在AE里呈像杂质,斑点极多。PNG相当于视频格式中AVI。而TGA 更接近原始格式,更安全稳定,两者质量单独的最优无损情况下效果差不多。图1TGA格式二值化后放到…

这难道不是.NET5的bug? 在线求锤?

hello,最近在对一个使用.NET5项目的认证授权系统进行重构,对.NET 5的授权中间件的源码有些看法。也希望同学们能帮我理解。一个朴素的需求这是一个api项目,默认所有的api都需要授权, 少量散落在Controller各处的api不需要授权访问…

网管心得:优化网络性能给局域网提速[好文章]

网管心得:优化网络性能给局域网提速 目前,几乎任何稍微大一点的企业和学校都会建立一个局域网供使用,网络已经无处不在了。作为局域网络的网管人员,对于网络速度是非常在乎的,如何有效的利用带宽,避免不必要的速度损失…

win2008r2用户账户控制什么意思_养老保险统筹账户是什么意思?有什么用?

我国《社会保险法》规定:基本养老保险实行统筹账户和个人账户相结合的方式。对于在职职工来说,养老保险费分为单位缴费和个人缴费两部分;单位一般按照缴费基数的20%划入到统筹账户中,个人按照缴费基数的8%计入到个人账户里&#x…

android手机拍摄权限,react-native 手机拍照权限

第一步 :在 android/app/src/main/AndroidManifest.xml添加然后运行项目在手机应用权限哪里查看这是添加前的这是添加后的第二步调用import React, {Component} from react;import {View,Text,Image,StyleSheet,Button,Modal,TouchableHighlight,TouchableOpacity,D…

NHibernate for .NET 1.2

NHibernate for .NET 1.2 支持很多Hibernate 3.0的特性,性能方面据说有很大提高.下面这篇文章可以好好看看NHibernate Best Practices with ASP.NET, 1.2nd Ed.

Halcon和Opencv的区别?

1.MVTec HALCONMVTec HALCON 是世界上最全能的机器视觉软件.世界各地的用户从HALCON为快速开发图像分析和机器视觉程序的灵活架构获益匪浅.HALCON 提供了超过1100多种具备突出性能控制器的库,如模糊分析,形态,模式匹配,3D校正等.HALCON支持多个操作系统,编程语言和截获设备从而…

idea 一直在build_让web开发部署提速 8 倍的一款 IDEA 插件,你有在用?

原文:http://suo.im/4on4JE 来源于云栖社区>中间件小哥作为一个 Java 程序员,我们大多数会在 Intellij IDEA 中基于 SpringBoot 来开发 WEB 应用,所以本文中的测评将会基于以下几个架构来构建:开发环境:IDEA项目组织方式&…

Android 调用12306接口,GitHub - AndroidyxChen/loading-12306: 仿PC端12306的刷新loading的自定义view...

loading-12306仿PC端12306的刷新loading的自定义view效果图:核心代码及实现逻辑如下:mPaint.setColor(mColor);mPaint.setTextSize(50);//1、动画开启前,theCircle的初始值为-1,所以初始化时只走canvas.drawCircle()方法&#xff…

FreeBSD 下的 MySQL 备份方案

作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究。核心提示:如何在 FreeBSD 下实现 MySQL 的全量及增量备份&am…

IdentityServer4(八)使用EntityFramework Core对数据进行持久化

上几篇,我们创建了客户端,scope,启动时,IdentityServer把这些配置数据加载至内存,但是,如果我们想要更改配置,就必须停掉IdentityServer,然后重新启动。且IdentityServe在r运行过程中…

centos 重启网卡_CentOS7网络配置和修改网卡名称及常用服务管理命令

1.设置IP地址和网关及DNSCentOS7里面的网卡名称不在是eth0,1,2而改成enoxxxxxx的格式,en代表的是enthernet以太网,o代表onboard内置,这种新的方式不但长,而且难记,不过优点也比较突出,有编号唯一性&#xf…

android平板 useragent,移动端适配 user-Agent

用navigator结合正则表达式来判断 打开网址的来源function getOrin() {if((navigator..match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobuserAgentile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {/*window.l…

推荐曹济的FPA培训课程

下面是课程的相关内容,供参考,如果有可能,也帮着推荐给别的同事,谢谢! 软件功能点估算原理及实践课程说明:http://www.suiji.com.cn/FPA1.htm 功能点应用领域:http://www.suiji.com.cn/FPuse.ht…

C# 中的动态类型

翻译自 Camilo Reyes 2018年10月15日的文章 《Working with the Dynamic Type in C#》 [1] .NET 4 中引入了动态类型。动态对象使您可以处理诸如 JSON 文档之类的结构,这些结构的组成可能要到运行时才能知道。在本文中,Camilo Reyes 解释了如何使用动态…