前言

温馨提示:本博客使用Thymeleaf模板引擎实现PDF打印仅供参考:

在阅读该博客之前,先要了解一下Thymeleaf模板引擎,因为是使用Thymeleaf模板引擎实现的PDF打印的,

Thymeleaf是一个现代的服务器端 Java 模板引擎,适用于 Web 和独立环境。

Thymeleaf 的主要目标是为您的开发工作流程带来优雅的自然模板——HTML可以在浏览器中正确显示,也可以用作静态原型,从而在开发团队中实现更强大的协作。

借助 Spring Framework 的模块、与您最喜欢的工具的大量集成以及插入您自己的功能的能力,Thymeleaf 是现代 HTML5 JVM Web 开发的理想选择——尽管它可以做的更多。

不了解小伙伴可以去Thymeleaf官网查看,有更详细的讲解。

接下来就不一一介绍了,直接上代码。

一、引入依赖

1.Thymeleaf,生成PDF相关依赖

1.1 以下依赖为必要依赖,一个都不能少,依赖version可以根基实际情况使用相关的依赖版本。

二、application.yml配置

1.yml配置文件

yml配置文件使用配置thymeleaf模板路径(示例):

以上相关为基础且必须配置的内容,接下来继续讲解thymeleaf引擎需要生成PDF的相关配置。

三、PDF相关配置

1.PDF配置代码(如下):

package com.cy.xgsm.configuration;

import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;

import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.layout.font.FontProvider;
import com.cy.xgsm.controller.PrintPdfController;

/**
 * 
 * @author Dylan
 * PDF相关配置
 */
@Configuration
public class PdfConfiguration {
	
	private static final Logger log = LoggerFactory.getLogger(PdfConfiguration.class);
	
	@Bean
	public FontProvider getFontProvider() throws URISyntaxException, IOException {
		FontProvider provider = new DefaultFontProvider(true, true, false);
		byte[] bs = null;
		//SIMSUN.TTC为字体
		try (InputStream in = PrintPdfController.class.getClassLoader().getResourceAsStream("font/SIMSUN.TTC")) {
			bs = IOUtils.toByteArray(in);
		}		
		PdfFont pdfFont = PdfFontFactory.createTtcFont(bs, 1, PdfEncodings.IDENTITY_H, false, true);
		provider.addFont(pdfFont.getFontProgram());
		return provider;
	}
	
	@Bean
	public ConverterProperties converterProperties(FontProvider fontProvider, Configuration config) {
		ConverterProperties cp = new ConverterProperties();
		cp.setBaseUri(config.getPdfUrl());
		try {
			cp.setFontProvider(fontProvider);
		} catch (Exception e) {
			log.error("打印PDF时未能添加字体", e);
		}
		return cp;
	}
	
}

注意PDF配置需要添加打印PDF字体,SIMSUN.TTC为打印需要的字体,但是也可以是其他的

四、Controller

1.以上所有的相关配置信息都配置完了,接下来就可以写Api接口了

package com.cy.xgsm.controller;

import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.cy.xgsm.common.Result;
import com.cy.xgsm.model.OrderInfo;
import com.cy.xgsm.service.OrderInfoService;

/**
 * 打印PDF 控制接入层
 * 
 * @author Dylan
 *
 */
@Controller
@RequestMapping("print")
public class PrintPdfController {
	
    private static final Logger log = LoggerFactory.getLogger(PrintPdfController.class);
    
	@Autowired
	private OrderInfoService service;
	//thymeleaf模板引擎
    @Autowired
    TemplateEngine templateEngine;
	//html转换成pdf需要使用ConverterProperties
    @Autowired
    ConverterProperties converterProperties;    
	
    @GetMapping("order/{orderId}.pdf")
	public void orderPdf(@PathVariable Long orderId, HttpServletResponse resp) throws IOException {
		Result<OrderInfo> result = service.selectByPrimaryKey(orderId);
		if (!result.isComplete()) {
            resp.sendError(404, "订单ID不存在");
        }
        Context context = new Context();
        context.setVariable("order", result.getData());
		///html/pdf/order-template为打印模板纸张路径
        processPdf(context, "/html/pdf/order-template", result.getData().getKddh(), resp);
		
	}

	/**
	 * 调用生成PDF
	 * @param context 上下文
	 * @param template 模板文件
	 * @param filename 文件名
	 * @param resp
	 */
	private void processPdf(Context context, String template, String filename, HttpServletResponse resp) throws IOException {
        log.info("生成PDF:"   filename);
        String html = templateEngine.process(template, context);
        String filenameEncoded = URLEncoder.encode(filename, "utf-8");
        resp.setContentType("application/pdf");
        resp.setHeader("Content-Disposition", "filename="   filenameEncoded   ".pdf");
        try (OutputStream out = resp.getOutputStream()) {
            PdfDocument doc = new PdfDocument(new PdfWriter(out));
			//打印使用什么什么纸张可根据实际情况,我这里默认使用A4
            doc.setDefaultPageSize(PageSize.A4.rotate());
            HtmlConverter.convertToPdf(html, doc, converterProperties);
        }
		
	}

}

1.请求接口报错解决方式:

如果在请求接口的时候发生以下错误信息是打印模板的路径错误了。

解决该错误需在你的yml配置thymeleaf路径即可,不懂怎么配置请往上看第二点application.yml配置,可按照application.yml复制上去即可解决。

五、生成PDF文件响应效果

点击Save to a file保存,响应结果数据均为测试数据,仅供参考。

到此这篇关于SpringBoot Thymeleaf实现生成PDF文档的文章就介绍到这了,更多相关SpringBoot Thymeleaf生成PDF内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

SpringBoot+Thymeleaf实现生成PDF文档的更多相关文章

  1. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  2. ios – 将PDF文件附加到电子邮件 – Swift

    我想发送带有PDF附件的电子邮件.我创建了PDF文件,然后我做了以下哪些错误我相信:在发送电子邮件之前,我可以看到附带的chart.pdf,但是当我发送电子邮件时,它是在没有附件的情况下发送的,这是因为我没有正确附加文件.解决方法您将错误的mimeType传递给addAttachmentData().使用application/pdf而不是pdf.

  3. xcode – 无法在iOS8beta5中使用UIWebView打开PDF文件

    如果是,请提供一些示例代码.解决方法我找到了一种在WebView中查看PDF的解决方法

  4. iOS从UIWebview内容创建pdf

    哪个是从webview内容中获取最佳质量pdf文档的最佳选择?

  5. ios – 在Swift中将图像合并为PDF

    我想创建一个应用程序,要求用户从设备相机上传图片,然后使用swift将这些图像合并为PDF.怎么能实现这一目标?

  6. 我们可以在IOS应用程序的UIWebview中将条款和条件作为PDF加载吗?

    我在UIWebview中向我的应用添加了条款和条件.我真正想知道的是,我可以将其显示为逐页的pdf文档,还是应该使用任何其他方法?App商店会接受pdf格式吗?解决方法是的,这可以使用UIWebview完成,肯定会被Apple接受.如果您尝试从WebURL显示PDF文件,请使用以下代码.或者,如果您的应用程序中捆绑了PDF文件,请使用以下代码.

  7. ios – 通过UIDocumentInteractionController与Mail交互

    我正在通过UIDocumentInteractionController与其他应用共享PDF.在添加此功能之前,我使用MFMailComposeViewController定制了“发送到电子邮件”按钮–但现在我的UIDocumentInteractionController中还有一个Mail按钮,我想使用它来避免重复按钮.我的问题是,通过旧的邮件控制器,我曾经设置主题和内容文本,而如果我使用UID

  8. Quicklook / QLPreviewController,iOS 8的一些问题,但一切都适用于iOS 7.1

    我正在使用QuickLook查看PDF文件.它在iOS7.1中正常工作,但iOS8GM会出现一些问题.图片比文字好,我想告诉你问题:iOS7.1Xcode6使用QuickLook进行转换页面滚动,navigationBar隐藏得很好————————————————–————————而现在,iOS8GM与Xcode6使用QuickLook进行转换…页面滚动,navigationBar不隐藏,页面指示器隐藏在NavigationBar后面与iPhone模拟器,iPad模拟器,iPhone设备和iPad设备相同

  9. 如何选择PDF中的文本行然后突出显示它们? (IOS)

    我不想使用FastPDFKit,因为它显示徽标并且需要花钱,或者UIWebView,因为它对我们可以用它做的事情非常有限,而且我想学习如何自己做这些:-)谢谢!

  10. 如何在iOS上生成带有“真实”文本内容的PDF?

    我想在iOS6应用程序中生成一个好看的PDF.我试过了:>UIView在上下文中渲染>使用CoreText>使用NsstringdrawInRect>使用UILabeldrawRect这是一个代码示例:呈现的UIViews只包含UIImageView一堆UILabel.我还尝试了在stackoverflow上找到的建议:继承UILabel并执行此操作:但这也没有改变任何事情.无论我做什么,当在预览中打开PDF时,文本部分可以选择作为块,但不是每个字符的字符,并且缩放pdf显示它实际上是位图图像.有什么建议

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部