java创建pdf文档

一、使用freeMarker通过模版生成html
1、引入jar包
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>3.8.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.23</version>
</dependency>
2、上代码
import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.*;
import java.util.Map;


/**
     * 使用freeMarker通过模版生成html
     * @param dataMap 模版的参数
     * @param srcDir 模版在resources下的路径
     * @param srcName 模版文件名
     * @param destPath 生成html的路径
     */
    public static void createHtml(Map<String, Object> dataMap, String srcDir, String srcName, String destPath) {
		// 1、 创建freeMarker配置实例
		Configuration configuration = new Configuration();
		Writer out = null;
		try {
			// 2、 获取模版路径
			String path = Html2pdfUtils.class.getResource(srcDir).getPath();
			configuration.setDirectoryForTemplateLoading(new File(path));
			// 3、加载模版文件
			Template template = configuration.getTemplate(srcName);
			// 4、生成数据
			File docFile = new File(destPath);
			out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
			// 5、 输出文件
			template.process(dataMap, out);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (null != out) {
					out.flush();
				}
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
    }

    public static String getPathBySystem () {
    	String os = System.getProperty("os.name");
    	String path = "";
    	if (os.toLowerCase().indexOf("win")>-1) {
    		path = "D:";
		} else {
    		path = "/work/vschool";
		}
    	return path;
	}
二、转换html文件为pdf文件
1、下载安装wkhtmltopdf

官网地址:http://wkhtmltopdf.org/

2、上代码
package com.coactsoft.vschool.core.interceptor;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * author: mizhaoya
 * date: 2019/12/11
 */

public class HtmlToPdfInterceptor extends Thread {
    private InputStream is;

    public HtmlToPdfInterceptor(InputStream is){
        this.is = is;
    }

    @Override
    public void run(){
        try{
            InputStreamReader isr = new InputStreamReader(is, "utf-8");
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null) {
                System.out.println(line.toString()); //输出内容
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
/**
     * 转换html文件为pdf文件
     * @param srcPath html文件路径
     * @param destPath pdf文件路径
     * @return 转换是否成功:true成功,false失败
     */
    public static boolean html2pdf(String srcPath, String destPath){
        //1、wkhtmltopdf在系统中的路径
        String toPdfTool = "D:\\softwared\\wkhtmltopdf\\bin\\wkhtmltopdf.exe";
        if(System.getProperty("os.name").indexOf("Windows") == -1){
            //非windows 系统
            toPdfTool = "/work/vschool/wkhtmltox/bin/wkhtmltopdf";
        }
        //2、如果pdf保存路径不存在,则创建路径
        File file = new File(destPath);
        File parent = file.getParentFile();
        if(!parent.exists()){
            parent.mkdirs();
        }
        //3、写入pdf配置
        StringBuilder cmd = new StringBuilder();

        cmd.append(toPdfTool);
        cmd.append(" ");
        cmd.append("  --margin-top 3cm ");//设置页面上边距 (default 10mm)
        cmd.append(" --header-spacing 5 ");//    (设置页眉和内容的距离,默认0)
        cmd.append(" --footer-spacing 5 ");// (设置页脚和内容的距离)
        cmd.append(srcPath);
        cmd.append(" ");
        cmd.append(destPath);

        boolean result = true;
        try{
            Process proc = Runtime.getRuntime().exec(cmd.toString());
            HtmlToPdfInterceptor error = new HtmlToPdfInterceptor(proc.getErrorStream());
            HtmlToPdfInterceptor output = new HtmlToPdfInterceptor(proc.getInputStream());
            error.start();
            output.start();
            proc.waitFor();
        }catch(Exception e){
            result = false;
            e.printStackTrace();
        }

        return result;
    }
3、附上wkhtmltopdf 参数详解
wkhtmltopdf [OPTIONS]... <input file> [More input files] <output file>
常规选项
     --allow <path>  允许加载从指定的文件夹中的文件或文件(可重复)
    --book*  设置一会打印一本书的时候,通常设置的选项 
     --collate  打印多份副本时整理 
     --cookie <name> <value>  设置一个额外的cookie(可重复) 
     --cookie-jar <path>  读取和写入的Cookie,并在提供的cookie jar文件 
     --copies <number>  复印打印成pdf文件数(默认为1) 
     --cover* <url>  使用HTML文件作为封面。它会带页眉和页脚的TOC之前插入 
     --custom-header <name> <value>  设置一个附加的HTTP头(可重复) 
     --debug-javascript  显示的javascript调试输出 
    --default-header*  添加一个缺省的头部,与页面的左边的名称,页面数到右边,例如: --header-left '[webpage]' --header-right '[page]/[toPage]'  --header-line 
     --disable-external-links*  禁止生成链接到远程网页
     --disable-internal-links*  禁止使用本地链接
    --disable-javascript  禁止让网页执行JavaScript 
     --disable-pdf-compression*  禁止在PDF对象使用无损压缩 
     --disable-smart-shrinking*  禁止使用WebKit的智能战略收缩,使像素/ DPI比没有不变 
     --disallow-local-file-access  禁止允许转换的本地文件读取其他本地文件,除非explecitily允许用 --allow 
    --dpi <dpi>  显式更改DPI(这对基于X11的系统没有任何影响) 
     --enable-plugins  启用已安装的插件(如Flash
     --encoding <encoding>  设置默认的文字编码 
     --extended-help  显示更广泛的帮助,详细介绍了不常见的命令开关 
     --forms*  打开HTML表单字段转换为PDF表单域 
    --grayscale  PDF格式将在灰阶产生
    --help  Display help 
     --htmldoc  输出程序HTML帮助
     --ignore-load-errors  忽略claimes加载过程中已经遇到了一个错误页面 
    --lowquality  产生低品质的PDF/ PS。有用缩小结果文档的空间 
     --manpage  输出程序手册页 
    --margin-bottom <unitreal>  设置页面下边距 (default 10mm) 
    --margin-left <unitreal>  将左边页边距 (default 10mm) 
    --margin-right <unitreal>  设置页面右边距 (default 10mm) 
    --margin-top <unitreal>  设置页面上边距 (default 10mm) 
     --minimum-font-size <int>  最小字体大小 (default 5) 
     --no-background  不打印背景
    --orientation <orientation>  设置方向为横向或纵向 
     --page-height <unitreal>  页面高度 (default unit millimeter) 
     --page-offset* <offset>  设置起始页码 (default 1) 
    --page-size <size>  设置纸张大小: A4, Letter, etc. 
    --page-width <unitreal>  页面宽度 (default unit millimeter) 
     --password <password>  HTTP验证密码 
     --post <name> <value>  Add an additional post field (repeatable) 
     --post-file <name> <path>  Post an aditional file (repeatable) 
     --print-media-type*  使用的打印介质类型,而不是屏幕 
    --proxy <proxy>  使用代理 
    --quiet  Be less verbose 
    --read-args-from-stdin  读取标准输入的命令行参数 
    --readme  输出程序自述
    --redirect-delay <msec>  等待几毫秒为JS-重定向(default 200) 
    --replace* <name> <value>  替换名称,值的页眉和页脚(可重复) 
    --stop-slow-scripts  停止运行缓慢的JavaScripts 
    --title <text>  生成的PDF文件的标题(第一个文档的标题使用,如果没有指定) 
    --toc*  插入的内容的表中的文件的开头
    --use-xserver*  使用X服务器(一些插件和其他的东西没有X11可能无法正常工作) 
    --user-style-sheet <url>  指定用户的样式表,加载在每一页中
    --username <username>  HTTP认证的用户名 
    --version  输出版本信息退出
     --zoom <float>  使用这个缩放因子 (default 1) 

页眉和页脚选项
--header-center*    <text>    (设置在中心位置的页眉内容)  
--header-font-name* <name>    (default Arial)  (设置页眉的字体名称)
--header-font-size* <size>    (设置页眉的字体大小)
--header-html*  <url> (添加一个HTML页眉,后面是网址)
--header-left*  <text>   (左对齐的页眉文本)
--header-line*      (显示一条线在页眉下)
--header-right* <text>    (右对齐页眉文本)
--header-spacing*   <real>    (设置页眉和内容的距离,默认0)
--footer-center*    <text>    (设置在中心位置的页脚内容)  
--footer-font-name* <name>    (设置页脚的字体名称) 
--footer-font-size* <size>    (设置页脚的字体大小default 11)
--footer-html*  <url> (添加一个HTML页脚,后面是网址)
--footer-left*  <text>    (左对齐的页脚文本)
--footer-line*      显示一条线在页脚内容上)
--footer-right* <text>    (右对齐页脚文本)
--footer-spacing*   <real>    (设置页脚和内容的距离)
./wkhtmltopdf --footer-right '[page]/[topage]' http://www.baidu.com baidu.pdf
./wkhtmltopdf --header-center '报表' --header-line --margin-top 2cm --header-line http://192.168.212.139/oma/  oma.pdf
表内容选项中
 --toc-depth* <level>  Set the depth of the toc (default 3) 
 --toc-disable-back-links*  Do not link from section header to toc 
 --toc-disable-links*  Do not link from toc to sections 
 --toc-font-name* <name>  Set the font used for the toc (default Arial) 
 --toc-header-font-name* <name>  The font of the toc header (if unset use --toc-font-name) 
 --toc-header-font-size* <size>  The font size of the toc header (default 15) 
 --toc-header-text* <text>  The header text of the toc (default Table Of Contents) 
 --toc-l1-font-size* <size>  Set the font size on level 1 of the toc (default 12) 
 --toc-l1-indentation* <num>  Set indentation on level 1 of the toc (default 0) 
 --toc-l2-font-size* <size>  Set the font size on level 2 of the toc (default 10) 
 --toc-l2-indentation* <num>  Set indentation on level 2 of the toc (default 20) 
 --toc-l3-font-size* <size>  Set the font size on level 3 of the toc (default 8) 
 --toc-l3-indentation* <num>  Set indentation on level 3 of the toc (default 40) 
 --toc-l4-font-size* <size>  Set the font size on level 4 of the toc (default 6) 
 --toc-l4-indentation* <num>  Set indentation on level 4 of the toc (default 60) 
 --toc-l5-font-size* <size>  Set the font size on level 5 of the toc (default 4) 
 --toc-l5-indentation* <num>  Set indentation on level 5 of the toc (default 80) 
 --toc-l6-font-size* <size>  Set the font size on level 6 of the toc (default 2) 
 --toc-l6-indentation* <num>  Set indentation on level 6 of the toc (default 100) 
 --toc-l7-font-size* <size>  Set the font size on level 7 of the toc (default 0) 
 --toc-l7-indentation* <num>  Set indentation on level 7 of the toc (default 120) 
 --toc-no-dots*  Do not use dots, in the toc
轮廓选项
 --dump-outline <file>  转储目录到一个文件
 --outline  显示目录(文章中h1,h2来定)
 --outline-depth <level>  设置目录的深度(默认为4)
页脚和页眉
 * [page]       由当前正在打印的页的数目代替
 * [frompage]   由要打印的第一页的数量取代
 * [topage]     由最后一页要打印的数量取代
 * [webpage]    通过正在打印的页面的URL替换
 * [section]    由当前节的名称替换
 * [subsection] 由当前小节的名称替换
 * [date]       由当前日期系统的本地格式取代
 * [time]       由当前时间,系统的本地格式取代
三、调用示例
        //0、参数初始化
        String srcDir = "/templates";
        String srcName = "template.ftl";
        String srcPath = Html2pdfUtils.getPathBySystem() + "\\" + "template.html";
        String destPath = Html2pdfUtils.getPathBySystem() + "\\" + "testQuestion.pdf";
        //生成html
        Map<String, Object> dataMap = new HashMap<String, Object>();
        dataMap.put("username", "zhangsan");
        dataMap.put("password", "123456");
        dataMap.put("age", "18");
        dataMap.put("address", "test");
        Html2pdfUtils.createHtml(dataMap, srcDir, srcName, srcPath);
        //html转pdf
        Html2pdfUtils.html2pdf(srcPath, destPath);
四、参考链接

https://www.cnblogs.com/youcong/p/9520730.html

https://www.cnblogs.com/xionggeclub/p/6144241.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 可以利用第三方库来生成 PDF 文档。以下是一些常用的 Java PDF 生成库: 1. iText:iText 是一个开源的 Java PDF 库,能够生成 PDF 文件、文档和表单。 2. Apache PDFBox:Apache PDFBox 是一个开源的 Java PDF 库,提供了创建、编辑和提取 PDF 内容的功能。 3. Flying Saucer:Flying Saucer 是一个基于开源项目 Apache FOP 的 Java HTML 渲染器,它可以将 HTML 文本转换为 PDF 文档。 4. JasperReports:JasperReports 是一个开源的报表生成器,支持生成多种格式的报表,其中包括 PDF 格式。 这里以 iText 为例,介绍如何使用 Java 生成 PDF 文档: 1. 引入 iText 库:在项目中引入 iText 库,可以通过 Maven 或者 Gradle 进行引入。 2. 创建 PDF 文档:使用 iText 的 PdfWriter 类创建 PDF 文档。 ``` Document document = new Document(); PdfWriter.getInstance(document, new FileOutputStream("example.pdf")); document.open(); ``` 3. 添加内容:使用 iText 的各种元素类添加内容,例如 Paragraph、Chunk、Image 等。 ``` Paragraph paragraph = new Paragraph("Hello World!"); document.add(paragraph); ``` 4. 保存并关闭文档:使用 document.close() 方法保存并关闭 PDF 文档。 ``` document.close(); ``` 完整示例代码: ``` import com.itextpdf.text.Document; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.PdfWriter; import java.io.FileOutputStream; public class PDFGenerator { public static void main(String[] args) throws Exception { Document document = new Document(); PdfWriter.getInstance(document, new FileOutputStream("example.pdf")); document.open(); Paragraph paragraph = new Paragraph("Hello World!"); document.add(paragraph); document.close(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值