当前位置: 首页 > wzjs >正文

怎样优化网站 优帮云虚拟主机怎么建设网站

怎样优化网站 优帮云,虚拟主机怎么建设网站,泰州网页制作,wordpress页面模板目录文件下载文章目录pdf生成方案dot转pdfhtml转pdfopenhtmltopdfaspose-pdf实践playwright实践图片转pdfApache PDFBox实践框架场景匹配后记前言:随着客户对报告审美的提升,需求也越来越五彩斑斓~ 原有的dot模板已经满足不了他们了!这篇文章主打列出各种…

文章目录

  • pdf生成方案
    • dot转pdf
    • html转pdf
      • openhtmltopdf
      • aspose-pdf
        • 实践
      • playwright
        • 实践
    • 图片转pdf
      • Apache PDFBox实践
  • 框架场景匹配
  • 后记

    前言:随着客户对报告审美的提升,需求也越来越五彩斑斓~ 原有的dot模板已经满足不了他们了!这篇文章主打列出各种方案及适用场景,带部分demo。

pdf生成方案

dot转pdf

自定义.dot文档,模板中插入书签占位,使用aspose-words转换为pdf
ps:这个收费=_=|| 公司之前有项目用了,所以没探索其他实现方案

html转pdf

探索了三个框架,openhtmltopdfaspose-pdfflying-saucer-pdf-openpdf,下面分别对这些方案进行描述。

openhtmltopdf

源码地址

明晃晃的优点:

  1. 开源&&免费

但有两个不得不忽视的缺点:

  1. 中文乱码,官网issue中有人提单了含有中文字符的html输出pdf有乱码 #129
    ,按照解决方案并不能修复,所以block了
  2. 仅仅支持简单的CSS

aspose-pdf

官网:Creating a complex PDF,虽然和aspose-words都是aspose家的,但他们分开收费!!!
优点:

  1. 内置14种字体 - 中文支持度非常高
  2. 支持加密/解密、数字签名、权限控制
  3. 文档完善、社区活跃度高

缺点:

  1. 贵!!!经费不足不考虑
  2. 对CSS3中部分样式不支持,例如aspect-ratio,需要后端一点点排查再让前端调整。。。 (太难了)
实践

注意: 这个库不是在maven中央仓库中管理,需要加一个仓库配置https://releases.aspose.com/java/repo/

<dependency><groupId>com.aspose</groupId><artifactId>aspose-pdf</artifactId><version>23.6</version>
</dependency>
import com.aspose.pdf.Document;
import com.aspose.pdf.HtmlLoadOptions;
import com.aspose.pdf.SaveFormat;public void generatePdf(String name) {	// 1. 准备数据模型Map<String, Object> data = new HashMap<>();data.put("name", name);data.put("date", LocalDate.now().toString());String html = freeMarkerService.getTemplate2String("report.ftl", data);try (FileOutputStream fileOutputStream = new FileOutputStream("E:\\test\\report.pdf");InputStream stream = new ByteArrayInputStream(html.getBytes("UTF-8"));) {// 加载静态资源HtmlLoadOptions loadOptions = new HtmlLoadOptions("src/main/resources/static/report");loadOptions.setEmbedFonts(true);Document document = new Document(stream, loadOptions);document.save(fileOutputStream, SaveFormat.Pdf);} catch (Exception e) {log.error("[generatePdf] html转pdf失败", e);}
}

playwright

由前端提供的html文件,里面包含的CSS样式太复杂了,没办法只能用webkit这种方式渲染样式才不会有大的偏差~
优点:

  1. 渲染质量ok,基本上和html展示一致
  2. 开源免费
  3. 跨平台支持,docker中也可运行

缺点:

  1. 初次运行要下载浏览器
  2. 资源消耗大,每个转换需要100-300M内存
  3. Java版是对Node.js版的封装
实践

maven

<dependency><groupId>com.microsoft.playwright</groupId><artifactId>playwright</artifactId><version>1.52.0</version>
</dependency>

业务代码(强制将输出A4纸张大小):

package com.lizzy.mp.service;import java.io.FileOutputStream;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;import org.springframework.stereotype.Service;import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;
import com.microsoft.playwright.options.Margin;import lombok.extern.slf4j.Slf4j;@Service
@Slf4j
public class PlaywrightPdfService {@Resourceprivate FreeMarkerService freeMarkerService;private Playwright playwright;private Browser browser;@PostConstructpublic void init() {playwright = Playwright.create();browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(true).setArgs(Stream.of("--disable-dev-shm-usage").collect(Collectors.toList())));}public void generatePdf(String name) {// 1. 准备数据模型Map<String, Object> data = new HashMap<>();data.put("name", name);data.put("date", LocalDate.now().toString());String htmlContent = freeMarkerService.getTemplate2String("report2.ftl", data);try (Page page = browser.newPage();FileOutputStream fileOutputStream = new FileOutputStream("E:\\test\\report.pdf");) {page.setContent(htmlContent);byte[] bytes = page.pdf(new Page.PdfOptions().setMargin(new Margin().setTop("0cm").setBottom("0cm").setLeft("0cm").setRight("0cm")).setPrintBackground(true).setFormat("A4"));fileOutputStream.write(bytes);} catch (Exception e) {log.error("[generatePdf] HTML转PDF失败", e);}log.info("[generatePdf] HTML转PDF成功");}@PreDestroypublic void cleanup() {if (browser != null) {browser.close();}if (playwright != null) {playwright.close();}}
}

图片转pdf

      项目中前后端共用一个html模板,前端会有预览功能,于是乎讨论出一个方案:前端直接将html生成图片,后端将图片转成pdf,这样后端就不用care样式问题了!
      网上解决方案很多,作者只调研了Apache PDFBox。

Apache PDFBox实践

maven:

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>3.0.3</version>
</dependency>

业务代码,说明:

  • 方法convert中生成的pdf打开后50%展示都很大
  • 方法convertForA4中进行了限制,打开后100%还原
    ps:最根本的解决方法还是控制css样式为A4
package com.lizzy.mp.service;import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;import javax.imageio.ImageIO;import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.springframework.stereotype.Service;import lombok.extern.slf4j.Slf4j;@Service
@Slf4j
public class Image2PdfService {public void convert() {// 创建PDF文档try (PDDocument document = new PDDocument()) {// 加载图片PDImageXObject pdImage = PDImageXObject.createFromFile("E:\\report_page-0001.jpg", document);// 创建页面,大小与图片相同PDPage page = new PDPage(new PDRectangle(pdImage.getWidth(), pdImage.getHeight()));document.addPage(page);// 将图片写入PDFtry (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {contentStream.drawImage(pdImage, 0, 0);}// 保存PDFdocument.save("E:\\test\\report0.pdf");} catch (IOException e) {log.error("[convert] 图片转pdf失败,错误原因:{}", e.getMessage(), e);}}public void convertForA4() {String imagePath = "E:\\report_page-0001.jpg";String outputPdfPath = "E:\\test\\report0.pdf";try (PDDocument document = new PDDocument()) {// 读取图片BufferedImage image = ImageIO.read(new File(imagePath));if (image == null) throw new IOException("无法读取图片");PDImageXObject pdImage = PDImageXObject.createFromFile(imagePath, document);// 创建A4页面PDRectangle a4 = PDRectangle.A4;PDPage page = new PDPage(a4);document.addPage(page);// 原始图片尺寸float imageWidth = image.getWidth();float imageHeight = image.getHeight();// A4尺寸float pageWidth = a4.getWidth();float pageHeight = a4.getHeight();// 缩放比例(等比缩放)float scale = Math.min(pageWidth / imageWidth, pageHeight / imageHeight);float drawWidth = imageWidth * scale;float drawHeight = imageHeight * scale;// 居中坐标float x = (pageWidth - drawWidth) / 2;float y = (pageHeight - drawHeight) / 2;// 写入图像try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {contentStream.drawImage(pdImage, x, y, drawWidth, drawHeight);}// 保存PDFdocument.save(outputPdfPath);} catch (IOException e) {System.err.println("图片转PDF失败: " + e.getMessage());e.printStackTrace();}}
}

框架场景匹配

框架名称CSS样式支持度是否开源中文支持使用难易体积大小说明
Aspose.word中等❌,收费高
试用版有水印
简单50+MB
Aspose.pdfCSS3(动画等不支持)❌,收费高
试用版有水印
中等
openhtmltopdfCSS2.1(基本支持)需显示引入字体简单小,3~5MB
playwright非常高浏览器原生支持需运行浏览器依赖大,依赖Chromium
apache pdfbox----只使用图像转pdf,无需控制样式

后记

因项目背景,对报告pdf的生成要求蛮高,所以得不停尝试各种解决方案,推荐获取思路的网址~

  • 想找个生成PDF的库或者解决方案,不要Aspose的(from www.reddit.com),虽是C#解决方案,但道理相通
  • Pdf generation(from www.reddit.com)

ps:思考要记录,不然会忘记~


文章转载自:

http://peiYbpO7.mxbks.cn
http://Qnny43wJ.mxbks.cn
http://2hQ9c8KU.mxbks.cn
http://Lx6ofRsw.mxbks.cn
http://UHvSshdR.mxbks.cn
http://B6Cm08Bk.mxbks.cn
http://8YEPWQCo.mxbks.cn
http://nNzA85KV.mxbks.cn
http://5JZETgKu.mxbks.cn
http://K9aAeXVC.mxbks.cn
http://kBQo5O9G.mxbks.cn
http://X9EP8Coi.mxbks.cn
http://8XlviIi6.mxbks.cn
http://J1xytJ6i.mxbks.cn
http://HAlPXxtP.mxbks.cn
http://6kafKIWz.mxbks.cn
http://k2TQJJ2W.mxbks.cn
http://awmx7O38.mxbks.cn
http://jpDM5B4x.mxbks.cn
http://jPZfWumW.mxbks.cn
http://k7CONQNY.mxbks.cn
http://1ouKdbEy.mxbks.cn
http://HHCwrr6S.mxbks.cn
http://FrfrxwvJ.mxbks.cn
http://X6vtOcMJ.mxbks.cn
http://MffsBuVV.mxbks.cn
http://CSJs7vdm.mxbks.cn
http://F1UhHQSn.mxbks.cn
http://MuafYaWb.mxbks.cn
http://iiXoFsRw.mxbks.cn
http://www.dtcms.com/wzjs/779735.html

相关文章:

  • 中国建设银行个人登录网站个人网站炫酷主页html
  • 中国住房和建设部网站首页链家地产二手房网
  • 中信银行门户网站系统做网站开发考什么研
  • 深圳网站建设号互联网公司的招聘要求
  • 网站备案填写网站名称黄石网站建设方案
  • 中山市网站建站公司wordpress如何使用dplayer
  • 定制高端网站建设报价做临时工有哪些网站
  • 网站后台管理系统如何安装装修设计图包括哪些图纸
  • 免费代刷网站推广南坪网站建设哪里好
  • 建设读书网站的意义ionic Wordpress
  • 做网站的项目策划书免费的软件下载网站
  • 石家庄建站平台企业宣传ppt案例欣赏
  • 站长工具怎么关闭好网站建设公司的网站
  • 怎样开自己的网站网站建设的实训总结
  • 思科中国网站开发案例wordpress的数据库在哪里设置
  • 西安做网站设计公司做网站管理员需要哪些知识
  • 谷歌地图网站代码对外贸易电商平台
  • 简单的方法搭建网站源美网站建设
  • 有哪个网站教人做美食网站建设技术课程设计
  • 广东网站设计哪家专业域名格式正确的是
  • o2o网站建设机构网站开发需要会的东西
  • 模板网站建设一条龙小程序登录不上去
  • 百度双站和响应式网站的区别网站建设有用吗
  • 淘宝 做网站空间 条件怎样用自己的pid做搜索网站
  • 电商网站前端源码内蒙古高等级公路建设开发有限责任公司网站
  • 做网站点击率赚钱企业网站那几点重要
  • 潍坊公司网站模板建站做烘培的网站有哪些
  • 金华高端网站建设网站设计侵权
  • 明星个人网站建设需求分析自己做的网站怎么推广
  • 盐城seo网站优化软件手机网站制作器