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();
		}
相关推荐
凭君语未可24 分钟前
深度解析Java的多态特性
java·开发语言
华仔啊1 小时前
JVM参数到底配在哪?7大场景全解,新手不再迷茫!
java·jvm
一只学java的小汉堡1 小时前
HTML 01入门:从概念到开发环境搭建与页面头部配置
前端·css·html
penguin_bark2 小时前
C++ 异步编程(future、promise、packaged_task、async)
java·开发语言·c++
又是忙碌的一天2 小时前
Java基础 与运算
java·开发语言
程序猫.2 小时前
学生管理系统
java·1024程序员节
m0_748241232 小时前
Java注解与反射实现日志与校验
java·开发语言·python
一成码农3 小时前
3w字一文讲透Java IO
java·开发语言
木易 士心3 小时前
MyBatis 与 Spring Data JPA 核心对比:选型指南与最佳实践
java·spring·1024程序员节
2501_929157683 小时前
Switch 20.5.0系统最新PSP模拟器懒人包
android·游戏·ios·pdf