TA的每日心情 | 开心 2021-12-13 21:45 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
|
第一步,下载jar包以及建对应的文件夹。注意pd4ml的jar要选择pro版本。然后建一个pd4fonts.properties
里面对应的字体。 - SimSun = simsun.ttf
- 前面为变量名,后面要对应你下载好的字体。网上都有各种字体下载。相应步骤做完了,做完后的文件夹如图格式都有了!
- 注意要引入图片中对应的jar下面的三个jar包到项目中去。
复制代码
以下为从文件读取到数据再作导出功能。
- import java.awt.Insets;
- import java.io.BufferedInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.StringReader;
- import java.net.MalformedURLException;
- import java.security.InvalidParameterException;
- import org.zefer.pd4ml.PD4Constants;
- import org.zefer.pd4ml.PD4ML;
- public class Test {
- protected int topValue = 10;
- protected int leftValue = 20;
- protected int rightValue = 10;
- protected int bottomValue = 10;
- protected int userSpaceWidth = 1300;
- /**
- * @param args
- */
- public static void main(String[] args) {
- try {
- Test jt = new Test();
- //此处填写你的html文件
- String html = readFile("/Users/wangchen/Desktop/370fx2.html", "UTF-8");
- //此处填写你下载的地方
- jt.doConversion2(html, "/Users/wangchen/Desktop/370fx2.pdf");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public void doConversion2(String htmlDocument, String outputPath)
- throws InvalidParameterException, MalformedURLException,
- IOException {
- PD4ML pd4ml = new PD4ML();
- pd4ml.enableDebugInfo();
- pd4ml.setHtmlWidth(userSpaceWidth);
- pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));
- pd4ml.setPageInsetsMM(new Insets(topValue, leftValue, bottomValue,
- rightValue));
- //此处的classPath注意一定要获取到你放fonts的文件夹。他需要获取到你下载的字体
- String classPath = Test.class.getResource("/")+"fonts";
- pd4ml.useTTF(classPath, true);
- pd4ml.setDefaultTTFs("SimSun", "SimSun", "SimSun");
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- pd4ml.render(new StringReader(htmlDocument), baos);
- baos.close();
- File output = new File(outputPath);
- java.io.FileOutputStream fos = new java.io.FileOutputStream(output);
- fos.write(baos.toByteArray());
- fos.close();
- }
- private final static String readFile(String path, String encoding)
- throws IOException {
- File f = new File(path);
- FileInputStream is = new FileInputStream(f);
- BufferedInputStream bis = new BufferedInputStream(is);
- ByteArrayOutputStream fos = new ByteArrayOutputStream();
- byte buffer[] = new byte[2048];
- int read;
- do {
- read = is.read(buffer, 0, buffer.length);
- if (read > 0) {
- fos.write(buffer, 0, read);
- }
- } while (read > -1);
- fos.close();
- bis.close();
- is.close();
- return fos.toString(encoding);
- }
- }
复制代码
如上你就可以下载将HTML转为pdf了。任意文本也可以转为pdf,经测试,可用
附件如下:https://pan.baidu.com/s/1wSvBM6Kti4IpI9IlDaycew
以下为浏览器下载pdf的工具类。直接调用红色的方法即可。htmlDocument 为你要导出的数据,response为该次请求的响应体,fileName为下载的名字
- package com.ccb.common.utils;
- import org.apache.commons.io.output.ByteArrayOutputStream;
- import org.apache.commons.lang3.StringUtils;
- import javax.servlet.http.HttpServletResponse;
- import java.awt.*;
- import java.io.*;
- import java.security.InvalidParameterException;
- import org.zefer.pd4ml.PD4Constants;
- import org.zefer.pd4ml.PD4ML;
- /**
- * @author caihong
- * @time 2019/1/28
- */
- public class PDFUtil {
- private static String PDF_TYPE="application/pdf";
- private static String classpath=PDFUtil.class.getResource("/").getPath();
- protected static int topValue = 10;
- protected static int leftValue = 20;
- protected static int rightValue = 10;
- protected static int bottomValue = 10;
- protected static int userSpaceWidth = 1300;
- public static void pdf4htmlToPdf(String htmlDocument,HttpServletResponse response, String filename)throws InvalidParameterException,
- IOException {
- PD4ML pd4ml = new PD4ML();
- pd4ml.enableDebugInfo();
- pd4ml.setHtmlWidth(userSpaceWidth);
- pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));
- pd4ml.setPageInsetsMM(new Insets(topValue, leftValue, bottomValue,rightValue));
- pd4ml.useTTF(classpath+"fonts", true);
- pd4ml.setDefaultTTFs("SimSun", "SimSun", "SimSun");
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- pd4ml.render(new StringReader(htmlDocument), baos);
- baos.close();
- renderPdf(response,baos.toByteArray(),filename);
- }
- public static void renderPdf(HttpServletResponse response, final byte[] bytes, final String filename) {
- initResponseHeader(response, PDF_TYPE);
- setFileDownloadHeader(response, filename, ".pdf");
- if (null != bytes) {
- try {
- response.getOutputStream().write(bytes);
- response.getOutputStream().flush();
- } catch (IOException e) {
- throw new IllegalArgumentException(e);
- }
- }
- }
- /**
- * 分析并设置contentType与headers.
- */
- private static HttpServletResponse initResponseHeader(HttpServletResponse response, final String contentType, final String... headers) {
- // 分析headers参数
- String encoding = "utf-8";
- boolean noCache = true;
- for (String header : headers) {
- String headerName = StringUtils.substringBefore(header, ":");
- String headerValue = StringUtils.substringAfter(header, ":");
- if (StringUtils.equalsIgnoreCase(headerName, "utf-8")) {
- encoding = headerValue;
- } else if (StringUtils.equalsIgnoreCase(headerName, "no-cache")) {
- noCache = Boolean.parseBoolean(headerValue);
- } else {
- throw new IllegalArgumentException(headerName + "不是一个合法的header类型");
- }
- }
- // 设置headers参数
- String fullContentType = contentType + ";charset=" + encoding;
- response.setContentType(fullContentType);
- if (noCache) {
- // Http 1.0 header
- response.setDateHeader("Expires", 0);
- response.addHeader("Pragma", "no-cache");
- // Http 1.1 header
- response.setHeader("Cache-Control", "no-cache");
- }
- return response;
- }
- /**
- * 设置让浏览器弹出下载对话框的Header.
- * @param
- */
- public static void setFileDownloadHeader(HttpServletResponse response, String fileName, String fileType) {
- try {
- // 中文文件名支持
- String encodedfileName = new String(fileName.getBytes("GBK"), "ISO8859-1");
- response.setHeader("Content-Disposition", "attachment; filename="" + encodedfileName + fileType + """);
- } catch (UnsupportedEncodingException e) {
- }
- }
- private final static String readFile(String path, String encoding)
- throws IOException {
- File f = new File(path);
- FileInputStream is = new FileInputStream(f);
- BufferedInputStream bis = new BufferedInputStream(is);
- java.io.ByteArrayOutputStream fos = new java.io.ByteArrayOutputStream();
- byte buffer[] = new byte[2048];
- int read;
- do {
- read = is.read(buffer, 0, buffer.length);
- if (read > 0) {
- fos.write(buffer, 0, read);
- }
- } while (read > -1);
- fos.close();
- bis.close();
- is.close();
- return fos.toString(encoding);
- }
- }
复制代码
自己完成controller,以及mapping映射后,注意要用get请求
http://localhost:8080/api/img/exportPdf?htmlDocument=12%E7%9A%84%E5%8F%91%E9%A1%BA%E4%B8%B0%E9%98%BF%E6%96%AF%E9%A1%BF%E5%8F%91%E9%80%81%E5%88%B0%E5%8F%91%E9%80%81%E5%A4%A7&fileName=123
便可以下载pdf了 |
|