百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

html+echarts图表的页面转pdf

toyiye 2024-06-21 12:18 10 浏览 0 评论

准备工作:

1、maven工程引入selenium-firefox-driver。当然也可以引入selenium-java,jar包更全一点。

另外引入jsoup和flying-saucer-pdf-itext5。做为格式化html和html转pdf

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-firefox-driver</artifactId>
    <version>3.141.59</version>
</dependency>

		<dependency>
			<groupId>org.xhtmlrenderer</groupId>
			<artifactId>flying-saucer-pdf-itext5</artifactId>
			<version>9.1.20</version>
		</dependency>
		<dependency>
			<groupId>org.jsoup</groupId>
			<artifactId>jsoup</artifactId>
			<version>1.12.1</version>
		</dependency>

2、电脑安装firefox浏览器和下载firefox驱动geckodriver.exe。以windows系统为例,在代码中设置两个可执行程序的环境变量。为了解决中文乱码,把字体包放到资源文件中。我们使用宋体。

System.setProperty("webdriver.firefox.bin", "D:\\Program Files\\Mozilla Firefox\\firefox.exe");
        System.setProperty("webdriver.gecko.driver", "D:\\Program Files\\Mozilla Firefox\\geckodriver.exe");

3、html页面中的echarts图表中,一定设置关闭动画,一定设置关闭动画,一定设置关闭动画---animation : false。同时。在把生成的图表生成base64的图片,同时关闭图片工具栏的显示。

由于html转pdf的时候。需要指定中文字体。不然会出现中文乱码。我们以宋体为例。在css样式中指定全文的中文字体为宋体。

var imgObj = new Image();
		imgObj.src = myChart.getDataURL({type:'png',excludeComponents:['toolbox']});
		document.getElementById("container").innerHTML = '<img src="'+ imgObj.src + '"/>';

css设置字体
<style type="text/css">
* {
	font-family: SimSun;
	margin: 0;
	padding: 0;
}
</style>

4、Talk is cheap. Show me the code

public class PDFGenerator {

    public static void topdf(String content, String path) throws DocumentException, IOException {
        ITextRenderer renderer = new ITextRenderer();
        ITextFontResolver fontResolver = renderer.getFontResolver();
        fontResolver.addFont("font/simsun.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        renderer.setScaleToFit(true);
        renderer.setDocumentFromString(content);
        renderer.layout();
        renderer.createPDF(new FileOutputStream(new File(path)));
    }
}
    @RequestMapping("/echart")
    public String echart(HttpServletRequest request) {
        return "view/echart";
    }

    @RequestMapping(value = "/view")
    @ResponseBody
    public Map<String, Object> view(HttpServletRequest request, HttpServletResponse response) {

        Map<String, Object> result = new HashMap<>(4);

        System.setProperty("webdriver.firefox.bin", "D:\\Program Files\\Mozilla Firefox\\firefox.exe");
        System.setProperty("webdriver.gecko.driver", "D:\\Program Files\\Mozilla Firefox\\geckodriver.exe");
        String path = request.getContextPath();
        String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/index/echart";

        FirefoxOptions option = new FirefoxOptions();
        option.setHeadless(true); // 无界面浏览器

        WebDriver webDriver = new FirefoxDriver(option);
        webDriver.manage().deleteAllCookies(); // 删除cookies
        webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        webDriver.get(url); // 打开echarts页面
        String res = webDriver.getPageSource();
        Document html = Jsoup.parse(res);
        html.outputSettings().syntax(Syntax.xml); // 用jsoup格式化html代码,以防止标签没有关闭导致的转换报错。
        String filePath = "d:/" + UUID.randomUUID() + ".pdf";
        try {
            PDFGenerator.topdf(html.toString(), filePath);
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            webDriver.close();
        }
        result.put("path", filePath);

        return result;
    }

5、最后效果图



6、项目还可以改造。把生成的pdf直接上传到文件服务器,以减少每次都生成pdf的漫长等待。如果不想使用本地的webdriver,可以考虑使用docker安装RemoteWebDriver,配置一个webdriver.url: http://*.*.*.*:4444/wd/hub.

如下所示

 WebDriver driver = null;
        try {
            DesiredCapabilities capabilities = DesiredCapabilities.chrome();
            capabilities.setCapability("headless", true);
            driver = new RemoteWebDriver(new URL(webdriver.url), capabilities);
            driver.manage().deleteAllCookies();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }

相关推荐

实战python中Random模块使用(python中的random模块)

一、random模块简介Python标准库中的random函数,可以生成随机浮点数、整数、字符串,甚至帮助你随机选择列表序列中的一个元素,打乱一组数据等。要在Python中使用random模块,只需要...

Python随机模块22个函数详解(python随机函数的应用)

随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。平时数据分析各种分布的数据构造也会用到。random模块,用于生成伪随机数,之所以称之为伪随机数,是...

说冲A就冲A,这个宝藏男孩冯俊杰我pick了

爱奇艺新上架了一部网剧叫《最后一个女神》。有个惊人的发现,剧里男三居然是《青春有你》的训练生冯俊杰。剧组穷,戏服没几件,冯俊杰几乎靠一件背背佳撑起了整部剧。冯俊杰快速了解一下。四川人,来自觉醒东方,人...

唐山打人嫌犯陈继志去医院就医的背后,隐藏着三个精心设计的步骤

种种迹象表明,陈继志这帮人对处理打人之后的善后工作是轻车驾熟的,他们想实施的计划应该是这样的:首先第一步与伤者进同一家医院做伤情鉴定,鉴定级别最好要比对方严重,于是两位女伤者被鉴定为轻伤,他们就要求医...

熬夜会造成神经衰弱,别再熬夜了(熬夜会加重神经衰弱吗)

长时间熬夜会出现神经衰弱,皮肤受损,超重肥胖,记忆力下降等现象……熬夜了能补回来吗?每天少睡一两个小时算熬夜吗?必须上夜班怎么办?如何减少熬夜伤害?戳图转给爱熬夜的TA!via央视新闻来源:河北省文...

落叶知秋的图片爬取(落叶知秋的图片有哪些?)

importrequestsfrombs4importBeautifulSoupimporttimeimportjsonpathimportjsonfromurllib.parsei...

小心有毒!长沙海关查获藏匿在“巧克力威化涂层”中的大麻

来源:海关发布近日,长沙黄花机场海关对一票申报为“巧克力威化涂层”的进境快件进行机检查验时,在包裹内查获封装于各独立威化饼干包装袋中的大麻230克。另从其他申报为“巧克力、儿童早餐谷物”的快件中查获藏...

钧正平:编造传播这种谣言,荒谬(钧正公司)

来源:钧正平工作室官方微博【钧评编造传播这种谣言,荒谬!】目前,乌克兰安全形势还在迅速变化之中,各方面安全风险上升。相关事件网上热度极高,倍受瞩目。然而,有一些人却借机大肆制造散播一些低级谣言,比如...

幸运角色过去了,谈一谈DNF起源的元素

总的来说伤害比上个版本强太多了,打卢克每日和团本明显能感觉的到。目前打团B套+圣耀稍微打造下应该都能随便二拖了。组队基本上都是秒秒秒(以前得强力辅助,现在随便带个毒奶都行)。单刷除了王座和顶能源阿斯兰...

DNF元素超大凉打桩测试(把括号的伤害加起来好像比较正常)

最近修练场的二觉老是很奇怪,发现以前都是习惯性先减抗然后丢二觉,结果伤害。。。直接丢二觉就正常了下面是其他技能伤害,没达到BUG线,估计问题不大。装备打造方面:全身红字加起来353(41*5+74*2...

ANSYS接触和出图技巧(ansys rough接触)

1.ANSYS后处理时如何按灰度输出云图?1)你可以到utilitymenu-plotctrls-style-colors-windowcolors试试2)直接utilitymenu-plotctr...

ANSYS有限元使用经验总结-后处理(4)

28.求塑性极限荷载时,结构的变形应该较大,建议把大变形打开。...

CFopen21.1、CFopen21.2都来了(cfile open)

[呲牙][赞][加油]

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

取消回复欢迎 发表评论:

请填写验证码