一、前言

        上一篇我们介绍了导出word,既然有了导出word,那么到处pdf也将会出现,导出word和pdf基本上是配套的需求,跑不了,那么本次我就简单介绍一下导出pdf。

二、代码实现

        2.1、依赖引入

        导出pdf是基于documents4j实现的,需要引入一些依赖,pom文件的话大家以实际情况编写,比如小永哥本地只加了documents4j-local和documents4j-transformer-msoffice-word就好了,如果只引这两个报不全的话,建议大家讲依赖包都documents4j都加到pom文件中,除了documents4j还有一个org下的zeroturnaround依赖,详情请看下图。

        2.2、代码实现

package com.relation;import com.documents4j.api.DocumentType;
import com.documents4j.api.IConverter;
import com.documents4j.job.LocalConverter;
import java.io.*;
public class PdfTest {public static void convert(String inputPath, String outputPath) throws Exception {File inputFile = new File(inputPath);File outputFile = new File(outputPath);try (InputStream docx = new FileInputStream(inputFile);OutputStream pdf = new FileOutputStream(outputFile)) {IConverter converter = LocalConverter.builder().build();converter.convert(docx).as(DocumentType.DOCX).to(pdf).as(DocumentType.PDF).execute();converter.shutDown();}}public static void main(String[] args) {try {convert("C:\\Users\\ASP.NET\\Downloads\\导出测试文件.docx", "C:\\Users\\ASP.NET\\Downloads\\导出测试文件.pdf");} catch (Exception e) {e.printStackTrace();}}
}

        

        2.3、web实现

        我们通过2.2步骤可以看到,已经能实现了,我们再来看看开发过程中的写法,其实是大同小异,都是对文件流的操作而已。我们看代码。

@PostMapping("/exportPdfFile")public void exportPdfFile(HttpServletResponse response){//创建XWPFDocumentXWPFDocument doc = getXWPFDocument();ServletOutputStream outputStream = null;try{//获取doc的输入流ByteArrayOutputStream baos = new ByteArrayOutputStream();doc.write(baos);InputStream in = new ByteArrayInputStream(baos.toByteArray());outputStream = response.getOutputStream();response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");response.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode("web测试导出.pdf", "UTF-8"));IConverter converter = LocalConverter.builder().build();converter.convert(in).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute();converter.shutDown();}catch (Exception e){log.error(e.getMessage(),e);throw new RuntimeException("导出异常");}finally {if(Objects.nonNull(outputStream)){try {outputStream.close();doc.close();}catch (Exception e){}}}}private XWPFDocument getXWPFDocument(){try {Resource resource = new ClassPathResource("model/导出模板.docx");XWPFDocument doc = new XWPFDocument(resource.getInputStream());//获取段落List<XWPFParagraph> paragraphs = doc.getParagraphs();for (XWPFParagraph paragraph : paragraphs) {//从段落中获取书签List<CTBookmark> bookmarkStartList = paragraph.getCTP().getBookmarkStartList();for (CTBookmark ctBookmark : bookmarkStartList) {String ctBookmarkName = ctBookmark.getName();if("exportTitle".equals(ctBookmarkName)){// 清除原有内容paragraph.getRuns().forEach(run -> run.setText("", 0));// 添加新内容paragraph.createRun().setText("导出测试标题!!");}if("tableTitle".equals(ctBookmarkName)){// 清除原有内容paragraph.getRuns().forEach(run -> run.setText("", 0));// 添加新内容paragraph.createRun().setText("测试导出表格标题!!");}if("tableInfo".equals(ctBookmarkName)){// 在书签位置创建表格XWPFTable table = doc.insertNewTbl(paragraph.getCTP().newCursor());//删除默认行table.removeRow(0);//插入3行for (int i = 0; i < 3; i++) {table.createRow();}List<XWPFTableRow> rows = table.getRows();String[] headers = {"序号","姓名","年龄","城市"};XWPFTableRow headerRow = table.getRow(0);for(int i=0; i<headers.length; i++) {headerRow.createCell().setText(headers[i]);}// 添加数据行String[][] data = {{"1","小永哥","18","北京"},{"2","胡彪","45","吉林"}};for (int i = 0; i < data.length; i++) {XWPFTableRow row = table.getRow(i+1);String[] rowData = data[i];for(int j=0; j<rowData.length; j++) {row.createCell().setText(rowData[j]);}}}}}return doc;}catch (Exception e){log.error(e.getMessage(),e);return null;}}

        基于接口形式的代码我们也演示完了,基本上导出pdf的代码就到此了,核心思路其实是根据word文件生成pdf,简单来说就是word转pdf。

三、结语

        本期word转pdf看似很完美,其实还差最核心的一步,就是我们在第二章节的代码实现,目前只能运行在windows环境,如果一旦代码要部署到生产环境,那么就无法使用了,因为word转pdf需要依赖LiberOffice,Windows环境大家基本上都会安装office,所以并未感知到office的作用,而生产环境是linux的话,就需要再安装一套基于linux的LiberOffice,这个问题小永哥暂时还未解决,等解决后,小永哥会再补充一篇,本期暂时就到这里了,晚安......

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/87077.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87077.shtml
英文地址,请注明出处:http://en.pswp.cn/web/87077.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零到一体验 Qwen-TTS:用四川话合成语音的全流程技术实录

今天很高兴看到Qwen-TTS开源。试一试四川方言&#xff08;大概是成都版&#xff09;效果如何。本人无法判断、有兴趣的伙伴可以帮忙听一听。 四川方言TTS "胖娃胖嘟嘟&#xff0c;骑马上成都&#xff0c;成都又好耍。胖娃骑白马&#xff0c;白马跳得高。胖娃耍关刀&…

php数据导出pdf文件

一.导出pdf文件&#xff0c;首先要安装相关的类库文件&#xff0c;我用的是dompdf类库。 1.安装类库文件&#xff1a; composer require dompdf/dompdf 2.引入类库文件到你的控制器中&#xff0c;创建方法&#xff1a; public function generatePdf(){//你需要打印的查询内容…

Beam2.61.0版本消费kafka重复问题排查

1.问题出现过程 在测试环境测试flink的job的任务消费kafka的情况&#xff0c;通过往job任务发送一条消息&#xff0c;然后flink web ui上消费出现了两条。然后通过重启JobManager和TaskManager后&#xff0c;任务从checkpoint恢复后就会出现重复消费。当任务不从checkpoint恢复…

关于 java:9. Java 网络编程

一、Socket 编程 Socket&#xff08;套接字&#xff09;是网络通信的端点&#xff0c;是对 TCP/IP 协议的编程抽象&#xff0c;用于实现两台主机间的数据交换。 通俗来说&#xff1a; 可以把 Socket 理解为“电话插口”&#xff0c;插上后客户端和服务端才能“通话”。 Sock…

主流零信任安全产品深度介绍

腾讯 iOA 零信任安全管理系统 功能&#xff1a;提供零信任接入、终端安全、数据防泄密等十余种功能模块。可实现基于身份的动态访问控制、终端安全一体化防护、数据防泄密体系等。核心优势&#xff1a;基于腾讯内部千万级终端实践打磨&#xff0c;沉淀丰富场景方案&#xff0c…

LabVIEW装配车体挠度无线测量

针对轨道交通车辆装配过程中车体挠度测量需求&#xff0c;基于LabVIEW开发无线快速测量系统&#xff0c;采用品牌硬件构建高精度数据采集与传输架构。系统通过 ZigBee 无线传输技术、高精度模数转换模块及激光位移传感器&#xff0c;实现装配车体挠度的实时、自动、非接触测量&…

java微服务-linux单机CPU接近100%优化

你这个场景&#xff1a; 4核16G 机器 同时运行了 8个 Spring Boot 微服务&#xff0c;每个 JAR 文件 100多 MB 导致 CPU 接近100% 确实是一个常见但资源紧绷的部署情境。下面是分层的优化建议&#xff0c;包括 JVM、系统、服务架构等多个方面&#xff0c;帮助你 降 CPU、稳…

MySQL表的约束和基本查询

一.表的约束 1.1空属性 当我们填写问卷的时候,经常会有不允许为空的问题,比如电话号,姓名等等.而mysql上我们可以在创建表的时候,如果想要某一列不允许为空,可以加上not null来加以限制: mysql> create table myclass( -> class_name varchar(20) not null, -> cla…

VBA代码解决方案第二十六讲:如何新建EXCEL工作簿文件

《VBA代码解决方案》(版权10028096)这套教程是我最早推出的教程&#xff0c;目前已经是第三版修订了。这套教程定位于入门后的提高&#xff0c;在学习这套教程过程中&#xff0c;侧重点是要理解及掌握我的“积木编程”思想。要灵活运用教程中的实例像搭积木一样把自己喜欢的代码…

【unity游戏开发——网络】套接字Socket的重要API

注意&#xff1a;考虑到热更新的内容比较多&#xff0c;我将热更新的内容分开&#xff0c;并全部整合放在【unity游戏开发——网络】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 1、Socket套接字的作用2、Socket类型与创建3、核心属性速查表4、关键方法指…

计算机网络(二)应用层HTTP协议

目录 1、HTTP概念 ​编辑2、工作流程​​ 3、HTTP vs HTTPS​​ 4、HTTP请求特征总结​ 5、持久性和非持久性连接 非持久连接&#xff08;HTTP/1.0&#xff09;​​ ​​持久连接&#xff08;HTTP/1.1&#xff09;​​ 1、HTTP概念 HTTP&#xff08;HyperText Transfer …

c# IO密集型与CPU密集型任务详解,以及在异步编程中的使用示例

文章目录 IO密集型与CPU密集型任务详解&#xff08;C#示例&#xff09;一、基本概念1. IO密集型任务2. CPU密集型任务 二、C#示例1. IO密集型示例1.1 文件操作异步示例1.2 网络请求异步示例1.3 数据库操作异步示例 2. CPU密集型示例2.1 基本CPU密集型异步处理2.2 并行处理CPU密…

用lines_gauss的width属性提取缺陷

自己做了一个图&#xff0c;这个图放在资源里了 结果图是这样&#xff08;这里只结算了窄区&#xff09; 代码和备注如下 read_image (Image11, C:/Users/Administrator/Desktop/分享/15/11.png) rgb1_to_gray (Image11, GrayImage) invert_image (GrayImage, ImageInvert) thr…

从0到100:房产中介小程序开发笔记(中)

背景调研 为中介带来诸多优势&#xff0c;能借助它打造专属小程序&#xff0c;方便及时更新核实租赁信息&#xff0c;确保信息准确无误&#xff0c;像房屋的大致地址、租金数额、租赁条件、房源优缺点等关键信息都能清晰呈现。还可上传房屋拍摄照片&#xff0c;这样用户能提前…

【AI 时代的网络爬虫新形态与防护思路研究】

网络爬虫原理与攻击防护的深度研究报告 网络爬虫技术已进入AI驱动的4.0时代&#xff0c;全球自动化请求流量占比突破51%&#xff0c;传统防御手段在面对高度仿真的AI爬虫时已显疲态。基于2025年最新数据&#xff0c;深入剖析网络爬虫的基本原理、工作流程、分类与攻击方式&…

低代码平台架构设计与关键组件

低代码平台的架构设计是其核心能力的关键支撑&#xff0c;需要平衡可视化开发的便捷性、生成应用的健壮性与性能、可扩展性以及企业级需求&#xff08;如安全、多租户、集成&#xff09;。以下是一个典型的企业级低代码平台架构概览及其关键组件&#xff1a; https://example.…

电商 ERP 系统集成接口指南

电商 ERP 系统的高效运行依赖于与多个业务系统的无缝对接&#xff0c;需要集成的核心接口包括&#xff1a;商品管理、订单处理、库存同步、物流配送、客户管理、财务结算等。这些接口是实现数据互通、业务协同的关键桥梁。 一、电商 ERP 系统集成所需接口类型 &#xff08;一…

Python实现对WPS协作群进行群消息自动推送

前言 本文是该专栏的第59篇,后面会持续分享python的各种干货知识,值得关注。 相信有些同学在工作或者项目中,都会使用到“WPS协作”作为办公聊天软件。如果说,有些项目的监控预警正好需要你同步到WPS协作群,这个时候需要怎么去做呢? 而本文,笔者将基于WPS协作,通过Py…

js严格模式和非严格模式

好的&#xff0c;这是一个非常基础且重要的概念。我们来详细解析一下 JavaScript 中的严格模式&#xff08;Strict Mode&#xff09;和非严格模式&#xff08;Sloppy Mode&#xff09;。 可以把它想象成参加一场考试&#xff1a; 非严格模式&#xff1a;就像是开卷、不计时的…

板凳-------Mysql cookbook学习 (十一--------1)

第11章&#xff1a;生成和使用序列 11.0 引言 11.1 创建一个序列列并生成序列值 CREATE TABLE insect ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY (id)&#xff0c;name VARCHAR(30) NOT NULL,date DATE NOT NULL,origin VARCHAR(30) NOT NULL); 字段说明 ‌id…