Java 把html转成pdf文件响应给前端下载

阅读: 评论:0

Java 把html转成pdf文件响应给前端下载

Java 把html转成pdf文件响应给前端下载

字体文件

链接:

提取码: 1id8

1.首先导依赖

<!--pdf--><dependency><groupId>com.itextpdf</groupId><artifactId>html2pdf</artifactId><version>3.0.3</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.1.23</version></dependency><dependency><groupId>org.xhtmlrenderer</groupId><artifactId>core-renderer</artifactId><version>R8</version></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.1</version></dependency><dependency><groupId>l</groupId><artifactId>xmlworker</artifactId><version>5.5.9</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.2</version></dependency><!--pdf-->

 2.二个工具类

①实现页码

import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;
import lombok.AllArgsConstructor;/*** Itext7 实现页码** @author darren* @date 2019-05-25*/
@AllArgsConstructor
public class PageMarker implements IEventHandler {private PdfFont pdfFont;@Overridepublic void handleEvent(Event event) {PdfDocumentEvent docEvent = (PdfDocumentEvent) event;PdfDocument      pdf      = Document();PdfPage          page     = Page();Rectangle        pageSize = PageSize();PdfCanvas pdfCanvas = new LastContentStream(), Resources(), pdf);Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);float  x      = (Left() + Right()) / 2;float  y      = Bottom() + 15;Paragraph p = new Paragraph("第" + PageNumber(page) + "页").setFontSize(12).setFont(pdfFont);canvas.showTextAligned(p, x, y, TextAlignment.CENTER);canvas.close();}
}

②实现水印

import com.itextpdf.kernel.events.Event;
import com.itextpdf.kernel.events.IEventHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.VerticalAlignment;
import lombok.AllArgsConstructor;/*** Itext7 实现水印** @author darren* @date 2019-05-25*/
@AllArgsConstructor
public class WaterMarker implements IEventHandler {private PdfFont pdfFont;@Overridepublic void handleEvent(Event event) {PdfDocumentEvent docEvent = (PdfDocumentEvent) event;PdfDocument      pdf      = Document();PdfPage          page     = Page();Rectangle        pageSize = PageSize();PdfCanvas pdfCanvas = new LastContentStream(), Resources(), pdf);Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);Paragraph waterMarker = new Paragraph("WATER MARKER 文字水印").setFont(pdfFont).setOpacity(.1f).setFontSize(30);for (int i = 0; i < 5; i++) {for (int j = 0; j < 5; j++) {canvas.showTextAligned(waterMarker, (150 + i * 300), (160 + j * 150), NumberOfPages(), TextAlignment.CENTER, VerticalAlignment.BOTTOM, .6f);}}canvas.close();}
}

3.Controller类

传入的json格式

ample.demo123.api;import com.alibaba.fastjson.JSONObject;
ample.demo123.service.PdfGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;@RestController
@RequestMapping("/api")
public class PdfController {@Autowiredprivate PdfGenerator pdfGeneratorService;/*** 访问接口* @param params --json数据* @param response --响应* @throws Exception*/@PostMapping("/demo")public void demo(@RequestBody JSONObject params,HttpServletResponse response) throws Exception {     atePdf(params,response);}}

4.接口类

ample.demo123.service;import com.alibaba.fastjson.JSONObject;
import javax.servlet.http.HttpServletResponse;public interface PdfGenerator {/*** 获取字体文件我的是在resources下面fonts包里* @return*/default String fontpath() {return "/f";}void generatePdf(JSONObject params,HttpServletResponse response) throws Exception;
}

5.实现类

ample.demo123.service;import com.alibaba.fastjson.JSONObject;
ample.demo123.utils.event.PageMarker;
ample.demo123.utils.event.WaterMarker;
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.html2pdf.attach.impl.OutlineHandler;
import com.itextpdf.kernel.events.PdfDocumentEvent;
import com.itextpdf.kernel.font.PdfFont;
import com.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.WriterProperties;
import com.itextpdf.layout.font.FontProvider;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.URLDecoder;
import java.util.Calendar;
import java.util.UUID;@Service
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class PdfGeneratorServicelmpl implements PdfGenerator {private FontProvider fontProvider;@Overridepublic void generatePdf(JSONObject params,HttpServletResponse response) throws Exception {//获取css内容String css = String("css");//获取html内容String html = String("html");//拼接String cont = "<html><head><style>"+ css +"</style></head><body>"+ html +"</body></html>";//调用方法生成pdf返回getGen(cont,response);}public void getGen(String cont,HttpServletResponse response) throws FileNotFoundException, UnsupportedEncodingException {//获取字体文件initFont();//先给个固定目录要确保你E盘下有pdf文件如果没有自己手动创建String outputFile="E:/pdf";//按当前日期生成目录--样式--/年/月/日String generateSavePath = generateSavePath();//拼接目录--E:/pdf/年/月/日String serverFilePath = outputFile + generateSavePath;File flvDir = new File(serverFilePath);//判断当前目录有文件没if (!ists()) {//没有生成flvDir.mkdirs();}//创建个pdf名UUID uuid = UUID.randomUUID();//当前目录加pdf名String filePath = serverFilePath + generateSavePath + uuid + ".pdf";//outputFile也可以是输出流PdfWriter writer = new PdfWriter(filePath, new WriterProperties().setFullCompressionMode(Boolean.TRUE));PdfDocument doc    = new PdfDocument(writer);doc.setDefaultPageSize(PageSize.A4);DefaultPageSize().applyMargins(20, 20, 20, 20, true);//获取字体,提供给水印 和 页码使用PdfFont pdfFont = FontSet().getFonts().stream().findFirst().map(fontProvider::getPdfFont).orElse(null);doc.addEventHandler(PdfDocumentEvent.END_PAGE, new WaterMarker(pdfFont));doc.addEventHandler(PdfDocumentEvent.END_PAGE, new PageMarker(pdfFont));ConverterProperties properties = new ConverterProperties();properties.setFontProvider(fontProvider);//PDF目录properties.ateStandardHandler());vertToPdf(cont, doc, properties);//写入响应extracted(filePath,response);}/***  响应* @param outputFile* @param response* @throws UnsupportedEncodingException*/private void extracted(String outputFile,HttpServletResponse response) throws UnsupportedEncodingException {FileInputStream in;OutputStream out;response.setContentType("'application/pdf");String decode = URLDecoder.decode(outputFile, "UTF-8");try {in = new FileInputStream(new File(decode));out = OutputStream();byte[] b = new byte[512];while ((in.read(b)) != -1) {out.write(b);}out.flush();in.close();out.close();} catch (IOException e) {e.printStackTrace();}}/*** 获取字体文件*/private void initFont() {fontProvider = new FontProvider();//设置中文字体文件的路径fontProvider.addFont(fontpath());}/*** 根据当前日期生成文件层级存放pdf* @return*/private String generateSavePath() {Calendar calendar = Instance();int year = (Calendar.YEAR);int month = (Calendar.MONTH) + 1;int day = (Calendar.DAY_OF_MONTH);return "/" + year + "/" + month + "/" + day + "/";}}

本文发布于:2024-01-29 15:54:07,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170651484816395.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:转成   文件   Java   html   pdf
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23