Java转换html为图片,图片嵌入pdf/word

一、html转图片

引入依赖

gradle 复制代码
implementation 'org.xhtmlrenderer:flying-saucer-core:9.1.22'

html页面转图片对于html标签格式有要求,自己调整,每个标签都要有结束标签,标签也要,标签也要, doctype需要大写

java 复制代码
try {
			String basePath = "D:\\";
			File source = new File(basePath, "report.html");
			File g2drDest = new File(basePath, "G2DR.png");
			BufferedImage g2drImage = Graphics2DRenderer.renderToImageAutoSize(source.toURI().toURL().toExternalForm(),
				1024, BufferedImage.TYPE_INT_ARGB);
			ImageIO.write(g2drImage, "png", g2drDest);
		}catch (Exception e){
			e.printStackTrace();
		}

二、图片嵌入pdf

gradle 复制代码
implementation 'com.itextpdf:itextpdf:5.5.5'
implementation 'com.itextpdf:itext-asian:5.2.0'
java 复制代码
try{
			BufferedImage originalImage = ImageIO.read(new File("D:\\G2DR.png"));
			float imgWidth = originalImage.getWidth();
			float imgHeight = originalImage.getHeight();
			float pageWidth = PageSize.A4.getWidth();
			float pageHeight = PageSize.A4.getHeight();
			float imgPerPage = pageHeight; // 每页只显示图片的一段
			Document document = new Document(PageSize.A4, 0, 0, 0, 0);
			PdfWriter.getInstance(document, new FileOutputStream("D:\\output.pdf"));
			document.open();
			int totalImages = (int) Math.ceil(imgHeight / imgPerPage);
			//图片长宽和A4大小不匹配可能会导致图片剪切嵌入观感不好看,可自己微调页面和图片大小
			for (int i = 0; i < totalImages; i++) {
				// 计算剪切起点和宽度
				int start = (int) (imgPerPage * i);
				int end = (int) Math.min(start + imgPerPage, imgHeight);
				BufferedImage subImage = originalImage.getSubimage(0, start, (int)imgWidth, end-start);
				// 将剪切后的图片转换为iText可用的Image对象
				Image image = Image.getInstance(subImage, null);
				image.scaleToFit(pageWidth, pageHeight); // 调整图片大小以适应页面
				// 插入图片到PDF文档
				document.add(new Paragraph());
				document.add(image);
				// 添加页码,如果是最后一段不需要换页
				if (i != totalImages - 1) {
					document.newPage();
				}
			}

			document.close();
		}catch (Exception e){
			e.printStackTrace();
		}

三、图片嵌入word

最简单的嵌入

复制代码
implementation 'org.apache.poi:poi:4.1.2'
implementation 'org.apache.poi:poi-ooxml:4.1.2'
java 复制代码
try{
			BufferedImage originalImage = ImageIO.read(new File("D:\\G2DR.png"));
			XWPFDocument document=new XWPFDocument();
			XWPFParagraph paragraph=document.createParagraph();
			XWPFRun run=paragraph.createRun();
			//自己设置页面参数
			run.addPicture(new FileInputStream("D:\\G2DR.png"),
				XWPFDocument.PICTURE_TYPE_PNG,
				"1.png",
				Units.toEMU(originalImage.getWidth()*(PageSize.A4.getHeight()/ originalImage.getHeight())),
				Units.toEMU(PageSize.A4.getHeight()));
			OutputStream outputStream=new FileOutputStream("D:\\output.docx");
			document.write(outputStream);
			outputStream.close();
		}catch (Exception e){
			e.printStackTrace();
		}
相关推荐
daidaidaiyu1 天前
一文学习 工作流开发 BPMN、 Flowable
java
SuniaWang1 天前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题六:《Vue3 前端开发实战:打造企业级 RAG 问答界面》
java·前端·人工智能·spring boot·后端·spring·架构
sheji34161 天前
【开题答辩全过程】以 基于springboot的扶贫系统为例,包含答辩的问题和答案
java·spring boot·后端
m0_726965981 天前
面面面,面面(1)
java·开发语言
xuhaoyu_cpp_java1 天前
过滤器与监听器学习
java·经验分享·笔记·学习
程序员小假1 天前
我们来说一下 b+ 树与 b 树的区别
java·后端
Meepo_haha1 天前
Spring Boot 条件注解:@ConditionalOnProperty 完全解析
java·spring boot·后端
sheji34161 天前
【开题答辩全过程】以 基于springboot的房屋租赁系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
木井巳1 天前
【递归算法】子集
java·算法·leetcode·决策树·深度优先