网站开发交接协议书国外被动收入网站做的好的

news/2025/9/30 1:44:56/文章来源:
网站开发交接协议书,国外被动收入网站做的好的,做网站至少要花多少钱,网络科技公司骗术来源#xff1a;xhtmlrenderer 将html转换成pdf#xff0c;完美css#xff0c;带图片#xff0c;手动分页#xff0c;解决内容断开的问题 - 煮过的花朵 - 博客园 之前用itext7将html导出为pdf#xff0c;比较方便#xff0c;代码较少#xff0c;而且支持base64的图片。…来源xhtmlrenderer 将html转换成pdf完美css带图片手动分页解决内容断开的问题 - 煮过的花朵 - 博客园 之前用itext7将html导出为pdf比较方便代码较少而且支持base64的图片。但是itext7是收费的所以换成了xhtmlrenderer。 xhtmlrenderer自动引入依赖包itext2.0.8而且不能再引入其他版本的itext因为itext2.0.8是已经被废弃的里面的很多方法在新版本已经没有了。 itext导出pdf最重要的4个难点 1.css样式 2.中文不显示 3.图片itext7支持比较好不过要收费 4.分页时内容断开的问题itext7不会出现这种问题不过要收费 一、首先引入包 只需要这个就够了它会自动引入itext2.0.8 dependencygroupIdorg.xhtmlrenderer/groupIdartifactIdcore-renderer/artifactIdversionR8/version /dependency 二、页面css样式的采集 看过很多篇itext的文章都没有达到想象中要求。大多是说将css路径改为绝对路径或者将css写在页面中这都不现实。真正的项目中你的项目经理是不会让你这么做的。 所以我找到一个能将页面所有css采集起来的js方法。传入你的标签的id返回一个包含该id的区域的所有css样式 加上htmlhead和body标签组成一个html的字符串。将字符串传给后台去生成pdf。值得注意的是我加了这个字体body{font-family: SimSun;}这个字符是中文字体后端必须与前端一致。且看后面。 function getElementChildrenAndStyles(selector) {var html $(selector).prop(outerHTML);selector selector.split(,).map(function(subselector){return subselector , subselector *;}).join(,);elts $(selector);var rulesUsed [];//文档的所有样式表sheets document.styleSheets;for(var c 0; c sheets.length; c) {// rules 和 cssRules 的计数方法也是不一样的rules 是第几个选择器cssRules 是第几条规则,// 分别用于IE7和chromevar rules sheets[c].rules || sheets[c].cssRules;for(var r 0; r rules.length; r) {//selectorText: $节点var selectorText rules[r].selectorText;var matchedElts $(selectorText);//找到dom节点里所有节点并将其push到数组里for (var i 0; i elts.length; i) {if (matchedElts.index(elts[i]) ! -1) {rulesUsed.push(rules[r]); break;} }}}//重组stylevar style rulesUsed.map(function(cssRule){if (cssRule.style) {var cssText cssRule.selectorText{cssRule.style.cssText.toLowerCase()};} else {var cssText cssRule.selectorText{cssRule.cssText};}return cssText;}).join(\n);return htmlheadmeta charsetUTF-8/ style\n            style          \n td{background:white!important;}          \n body{font-family: SimSun;} \n/style\n\n/headbody          html/body/html;} 今天解决了分页的时候会断开内容的问题解决方案就是手动分页用js计算高度然后超过页面高度的就换页这样就不会出现自动换页的时候内容断开了。 1.我将需要显示的元素都添加class ‘pdf-page-range’     2. classpageNext             .pageNext{page-break-after: always;} 这个css表示下一个元素将会换页转pdf的时候itext会自动识别。 3.在前面的基础上插入以下代码即可需要图片转换之后执行 注意这个修改了网页内容如果想保留原网页内容自行想办法 -。- //后端低版本的itext对分页的处理非常不友好所以前端页面强制分页。//我将需要显示的元素都添加class ‘pdf-page-range’//classpageNext .pageNext{page-break-after: always;} 这个css表示下一个元素将会换页。function pdfPageRange(){var heigth 0; $(.pdf-page-range).each(function(){var $this $(this);var $table $this.find(table);var $next $this.next();var $prevPage $this.prev(.pageNext);index $(.pageNext).length;var tagName $this[0].tagName;var element_tag;if($table$table.length0){element_tag $table[0];}if(tagNametable||tagNameTABLE){element_tag $this[0];}if(element_tag){heigth tablePage($(element_tag),heigth)return true;}//不是table的处理heigth $this[0].offsetHeight;if(heigth1000){$this.before(div classpageNext /div );heigth $this[0].offsetHeight;}});}//table单独算高度function tablePage($table,heigth){var $trList $table.find(tr);var $thead $table.find(tr.thead);$trList.each(function(){heigth $(this)[0].offsetHeight;if(heigth1000){$(this).before($thead.prop(outerHTML));$thead_add $(this).prev().prev();$thead_add.addClass(pageNext);heigth $(this)[0].offsetHeight$thead_add[0].offsetHeight;}});return heigth;} }); 三、图片的支持 项目中有很多Echarts做的图表这个生成的图表都是canvas标签而itext是不支持canvas标签的。所以要把图表全部换成base64的img标签。这里引入一个js。 html2canvas.js它能将制定区域截图。请看以下。 注意 1.html2canvas方法返回的是Promise类型为什么要将所有 html2canvas方法的返回值集中起来然后使用Promise.all(canvasArray).then方法。因为html2canvas是异步的你的下面的js已经处理完了它可能还没截图完成。Promise.all(canvasArray).then方法会在所有截图已经完成之后执行。所以我把ajax请求放在里面。请看代码 2. img标签闭合的问题img标签是自闭合标签。正常情况下浏览器不会去识别你的img的闭合标签即使你的img标签有/img或img  src  /,浏览器最后显示还是img,  所以我用一个字符串代替“/” 后台再用“/”代替这个字符串你也可以前端就替换。请看代码  3.必须给img加上宽度和高度不然被后台转换之后尺寸会变得很小。 $(#itextpdf).click(function(){var canvasArray [];$(.charts).each(function(){var $this$(this);var canvasIndex html2canvas($this,{ scale: 5,background: #FFFFFF,onrendered:function(canvas){var imgBase64 canvas.toDataURL(image/jpeg, 1.0);$this.html();// 标签被jquery获取后自定义属性closingtags会变成closingtags你可以加个css将图片隐藏起来然后在html字符串里面再加一个显示的css。$this.append (img class“hidden” alt src imgBase64 closingtags ) } });canvasArray.push(canvasIndex);});       Promise.all(canvasArray).then(function () {var str getElementChildrenAndStyles(#basket);$.post(/ecloud/sa/saerrorquestions/exportpdf.do,{str:str },function(r){}); });}); $(#itextpdf).click(function(){var canvasArray [];$(.charts).each(function(){var $this$(this);var canvasIndex html2canvas($this,{ scale: 5,background: #FFFFFF,onrendered:function(canvas){var imgBase64 canvas.toDataURL(image/jpeg, 1.0);$this.html();// 标签被jquery获取后自定义属性closingtags会变成closingtags你可以加个css将图片隐藏起来然后在html字符串里面再加一个显示的css。$this.append (img class“hidden” alt src imgBase64 closingtags ) } });canvasArray.push(canvasIndex);});       Promise.all(canvasArray).then(function () {var str getElementChildrenAndStyles(#basket);$.post(/ecloud/sa/saerrorquestions/exportpdf.do,{str:str },function(r){}); });}); 四、后台代码 项目中引入中文字体html字符串中也必须引入。我的字体css是     body{font-family: SimSun;} package cn.myc.ykt3.util;import java.io.FileOutputStream; import java.io.OutputStream;import org.xhtmlrenderer.pdf.ITextFontResolver; import org.xhtmlrenderer.pdf.ITextRenderer;import com.lowagie.text.pdf.BaseFont;public class ItextHtmlTopdf {/*** * param htmlStr html字符串* return* throws Exception*/public String exportpdf(String htmlStr ) throws Exception {if (StringUtils.isBlank(htmlStr)) {return null;}htmlStr htmlStr.trim().replaceAll(,).replaceAll( ,).replaceAll(br/,\n|\r\n|\r ).replaceAll( , );htmlStr htmlStr.replace(closingtags\\, /);String classpath this.getClass().getResource(/).getPath().replaceFirst(/, );String webappRoot classpath.replaceAll(/target/classes, /src/main/webapp);//-----版本2.0.8ITextRenderer renderer new ITextRenderer();OutputStream os new FileOutputStream(C:/Users/Administrator/Desktop/createSamplePDF3.pdf);// 如果携带图片则加上以下两行代码,将图片标签转换为Itext自己的图片对象Base64ImgReplacedElementFactory为图片处理类renderer.getSharedContext().setReplacedElementFactory(new Base64ImgReplacedElementFactory());renderer.getSharedContext().getTextRenderer().setSmoothingThreshold(1);renderer.setDocumentFromString(htmlStr);ITextFontResolver fontResolver renderer.getFontResolver();// 解决中文支持问题参数为字体的路径html页面也必须引入字体fontResolver.addFont(webappRootstatic/sanalysis/simsun.ttf, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);renderer.layout();renderer.createPDF(os);os.close();return null;} } Base64ImgReplacedElementFactory图片处理类 package cn.myc.ykt3.util;import java.io.IOException ; import org.w3c.dom.Element ; import org.xhtmlrenderer.extend.FSImage ; import org.xhtmlrenderer.extend.ReplacedElement ; import org.xhtmlrenderer.extend.ReplacedElementFactory ; import org.xhtmlrenderer.extend.UserAgentCallback ; import org.xhtmlrenderer.layout.LayoutContext ; import org.xhtmlrenderer.pdf.ITextFSImage ; import org.xhtmlrenderer.pdf.ITextImageElement ; import org.xhtmlrenderer.render.BlockBox ; import org.xhtmlrenderer.simple.extend.FormSubmissionListener ; import com.lowagie.text.BadElementException ; import com.lowagie.text.Image ; import com.lowagie.text.pdf.codec.Base64 ;public class Base64ImgReplacedElementFactory implements ReplacedElementFactory {/*** 实现createReplacedElement 替换html中的Img标签* * param c 上下文* param box 盒子* param uac 回调* param cssWidth css宽* param cssHeight css高* return ReplacedElement*/public ReplacedElement createReplacedElement(LayoutContext c, BlockBox box, UserAgentCallback uac,int cssWidth, int cssHeight) {Element e box.getElement();if (e null) {return null;}String nodeName e.getNodeName();// 找到img标签if (nodeName.equals(img)) {String attribute e.getAttribute(src);FSImage fsImage;try {// 生成itext图像fsImage buildImage(attribute, uac);} catch (BadElementException e1) {fsImage null;} catch (IOException e1) {fsImage null;}if (fsImage ! null) {// 对图像进行缩放if (cssWidth ! -1 || cssHeight ! -1) {fsImage.scale(cssWidth, cssHeight);}return new ITextImageElement(fsImage);}}return null;}/*** 将base64编码解码并生成itext图像* * param srcAttr 属性* param uac 回调* return FSImage* throws IOException io异常* throws BadElementException BadElementException*/protected FSImage buildImage(String srcAttr, UserAgentCallback uac) throws IOException,BadElementException {FSImage fsImage;if (srcAttr.startsWith(data:image/)) {String b64encoded srcAttr.substring(srcAttr.indexOf(base64,) base64,.length(),srcAttr.length());// 解码byte[] decodedBytes Base64.decode(b64encoded);fsImage new ITextFSImage(Image.getInstance(decodedBytes));} else {fsImage uac.getImageResource(srcAttr).getImage();}return fsImage;}/*** 实现reset*/public void reset() {}Overridepublic void remove(Element arg0) {}Overridepublic void setFormSubmissionListener(FormSubmissionListener arg0) {} } 我的页面 导出的pdf效果自动分页并且分页不会强制裁剪图片区域。

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

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

相关文章

9.29 闲话

写对了九月的最后一天。 一年前和现在有什么区别呢?都是令人心碎的日子罢了。 晚上放学后和高二小朋友在校园里随机游走,说了很多莫名其妙的话,我在想什么呢?我也不知道。在去高三教学楼的路上,他提了一下班级照片…

舟山网络公司网站建设公司企点官网下载安装

这四个概念分别代表不同的工具和框架,它们的主要区别如下: Simple App:这通常指的是一个基础的、最小化的应用程序。它可能只包含最基础的功能,如用户界面、一些简单的交互等。这种应用程序通常用于学习和实验目的,或者…

网站开发工作方案文稿写作网站

上一篇我们使用keyby后发现数据严重倾斜 https://datamining.blog.csdn.net/article/details/105316728 大概看下问题所在,大量数据在一个subtask中运行 这里我们使用两阶段keyby 解决该问题 之前的问题如下图所示 我们期望的是 但我们的需要根据key进行聚合统计&a…

三门峡市建设局官方网站网络舆情监测与预警系统通过对海量

青少年软件编程(Python)等级考试试卷(一级) 一、单选题(共25题,共50分) 1. 可以对Python代码进行多行注释的是?( ) A. #

US$164 Scorpio-LK Emulators SLK-02 for Tango Key Programmer including Authorization

Scorpio-LK Emulators SLK-02 for TangoPrice including authrization and the emulator together.Quick Referrence Table Package Includes:1pc x Scorpio-LK Emulators SLK-02 for TangoPictures of Scorpio-LK Emu…

做网站图片素材在线编辑做投票页面什么网站好

QUESTION:Sublime Text 3无法安装Package Control插件的解决? ANSWER: 为了更准确的定位问题,建议插件在安装前开启控制台(快捷键Ctrl~),同时在开启debug模式,这样可以在安装过程中了解哪一步出了问题,然后有针对性…

US$54 New Design DB25 Adapter for CG PRO 9S12 Programmer

New Design DB25 Adapter for CG PRO 9S12 ProgrammerFunctions: Operating Motorola Series(Freescale)This is New Design DB25 Adapter, please make sure the connector of your CG Pro 9S12 is New.We will arran…

购物网站后台设计无法转换中文wordpress

通过 Kubeflow XGBoost Training Operator 支持在 Kubernetes 上进行分布式 XGBoost 训练和批量预测。 操作步骤 为在 Kubernetes 集群上运行 XGBoost 作业,执行以下步骤: 在 Kubernetes 集群上安装 XGBoost Operator。 XGBoost Operator 旨在管理 XGB…

网站备案时间周期一般多久网站开发实用技术2.8.5

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 NLP 部分 概述NLP 简介文本处理词嵌入上下文理解 文本数据加载to_device 函数构造数据加载样本数量 len获取样本 getitem 分词构造函数调用函数轮次嵌入 RobertaRoberta 创新点NSP (Next Sentence Prediction…

最牛的视频网站建设网页设计的流程是什么

RapidClick是一款简单实用的自动点击软件。它可以模拟鼠标点击操作,以便快速、连续地点击屏幕上的特定位置。该软件通常用于自动执行重复性的点击任务或加快某些操作的速度。 以下是RapidClick可能提供的一些主要功能和特点: 自动点击功能:R…

门户网站开发用什么框架好商务网站开发开题报告

简介: 随着 5G/ 芯片 / 区块链等等新技术的不断成熟、云计算的普及和云原生时代带来的诸多便捷,开发者和架构师们眼前的挑战也不再只是 0-1 的建设问题,技术如何更多地带来业务价值成为了一个值得讨论的话题。阿里巴巴集团研究员,…

MMU的作用

内存管理单元(MMU)是计算机系统中用于管理内存访问的硬件组件,它具有以下多方面的好处: 内存保护隔离不同进程:在多任务操作系统中,MMU 可以为每个进程分配独立的虚拟地址空间,使得不同进程之间的内存空间相互隔…

知名网站开发哪里有运营一款app的费用

TCP是一个有状态通讯协议,所谓的有状态是指通信过程中通信的双方各自维护连接的状态。一、TCP keepalive先简单回顾一下TCP连接建立和断开的整个过程。(这里主要考虑主流程,关于丢包、拥塞、窗口、失败重试等情况后面详细讨论。)首先是客户端发送syn(Syn…

US$16 Yanhua BMW F/G Chassis Odometer Wiring Harness

Yanhua BMW F/G Chassis Odometer Wiring HarnessGood helper of resetting odometer.Function: Use BMW F/G chassis odometer wiring harness connects the odometer and power the wiring harness. Press the wake…

List-To-Table

List-To-Table导航 (返回顶部)1. List 2. List.txt-List.xlsx2.1 添加软件ID[Sid] 2.2 构造2维表格结构(包含第一列和第一行的字段的空表) 2.3 获取具体信息(填充表格信息)3. XLOOKUP3.1 语法及返回 3.2 参数 3.3 测试…

linux 添加唤醒词

在RK3588 Ubuntu主板上实现FunASR离线语音唤醒系统 RK3588是一款性能强大的SoC,搭配FunASR可以很好地实现离线语音唤醒功能。以下是完整的实施方案: 1. 硬件准备 音频输入设备选择 由于您的主板针脚图未显示专用音频…

US$980 Xhorse VVDI2 BMW OBD + CAS4 +FEM/BDC Functions Full BMW License

Xhorse VVDI2 BMW OBD + CAS4 +FEM/BDC Functions Full BMW LicenseLicense Includes:VB-01 BMW OBDVB-02 BMW CAS4VB-03 BMW FEM/BDCIf you buy VVDI2 Basic or VVDI2 VAG and need to get VVDI2 BMW functions for B…

学网站开发可以创业吗聊天网站模板

MySQLMySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一YUM 安装mysql1、下载 YUM 仓库文件打开网址: https://dev.mysql.com/downloads/…

做电销有什么资料网站深圳宝安区是什么风险

首先,我们通过一张图片来了解一下Oracle数据库的内存结构,如下:每个数据库实例有两个关联的内存结构—系统全局区(SGA),程序全局区(PGA)。系统全局(SGA):一组共享的内存结构(称为SGA 组件),其中包含一个OracleDB 实例的…

建立自己的网站费用广告运营具体是做什么

案例:给"ls -l"命令,设置别名通过”ll“快速访问 1、在项目根目录底下查看有无.bash_profile文件,注意这个是个隐藏文件,需要使用ls -a命令查看: 没有.bash_profile新建一个文件, 在最后添加一行…