当前位置: 首页 > news >正文

itext 转换word文档转pdf

itext 转换word文档转pdf

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version><scope>compile</scope></dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><!-- iText --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.2</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.9</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.6</version> <!-- 使用最新版本 --></dependency>
package com.msun.csm.service.proj.disastercloud;import java.io.FileInputStream;
import java.io.FileOutputStream;import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;import cn.hutool.core.util.StrUtil;public class WordToPdfConverter {public static void convert(String inputFilePath, String outputFilePath) {try {// 读取Word文档XWPFDocument document = new XWPFDocument(new FileInputStream(inputFilePath));// 创建PDF文档Document pdfDocument = new Document();// 将PDF文档写入输出文件PdfWriter.getInstance(pdfDocument, new FileOutputStream(outputFilePath));// 打开PDF文档pdfDocument.open();// 将Word文档内容写入PDF文档WordToPdfWriter writer = new WordToPdfWriter(pdfDocument);writer.write(document);// 关闭PDF文档pdfDocument.close();System.out.println("Word转PDF成功!");} catch (Exception e) {System.out.println("Word转PDF失败:" + e.getMessage());}}public static void main(String[] args) {String inputFilePath = "C:\\\\Users\\\\Administrator\\\\Desktop\\\\aa.docx";String outputFilePath = "C:\\\\Users\\\\Administrator\\\\Desktop\\\\aa.pdf";convert(inputFilePath, outputFilePath);}
}class WordToPdfWriter {private Document pdfDocument;WordToPdfWriter(Document pdfDocument) {this.pdfDocument = pdfDocument;}public void write(XWPFDocument document) throws Exception {//设置基础中文字体BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);//给字体添加样式Font fontChinese = new Font(bfChinese, 15, Font.BOLD);Font normal = new Font(bfChinese, 15, Font.NORMAL);//设置文字导出时的字体// 逐页将Word文档内容写入PDF文档
//        for (XWPFParagraph paragraph : document.getParagraphs()) {
            pdfDocument.add(new com.itextpdf.text.Paragraph(paragraph.getText()));
//            pdfDocument.add(new Paragraph(paragraph.getText(), fontChinese));
//        }for (XWPFParagraph paragraph : document.getParagraphs()) {String text = paragraph.getText();Paragraph pdfParagraph;if (text.contains("$a")) {pdfParagraph = new Paragraph(text.replace("$a", StrUtil.EMPTY), fontChinese);pdfParagraph.add("\n");pdfParagraph.setAlignment(Element.ALIGN_CENTER);} else if (text.contains("$b")) {pdfParagraph = new Paragraph(text.replace("$b", StrUtil.EMPTY), normal);pdfParagraph.setFirstLineIndent(30);} else if (text.contains("$c")) {pdfParagraph = new Paragraph(text.replace("$c", StrUtil.EMPTY), normal);pdfParagraph.add("\n");pdfParagraph.setAlignment(Element.ALIGN_RIGHT);} else if (text.contains("$d")) {pdfParagraph = new Paragraph(text.replace("$d", StrUtil.EMPTY), normal);pdfParagraph.add("\n");pdfParagraph.setAlignment(Element.ALIGN_RIGHT);} else if (text.contains("$e")) {pdfParagraph = new Paragraph(text.replace("$e", StrUtil.EMPTY));pdfParagraph.add("\n");} else {pdfParagraph = new Paragraph(text, normal);Chunk chunk = new Chunk();chunk.setLineHeight(12);pdfParagraph.add(chunk);}
//            pdfParagraph.setPaddingTop(40);pdfParagraph.setMultipliedLeading(2);
//            for (XWPFRun run : paragraph.getRuns()) {
                Text pdfText = new Text(run.getText(0) != null ? run.getText(0) : "");
//                String text = run.getText(0); // 注意:这里可能丢失格式化文本,但对于简单文档通常足够
//                if (text == null) {
//                    text = "";
//                } else {
//                    text = sb.toString();
//                }
//                Chunk chunk = new Chunk(text);
//
//                // 设置样式
//                if (run.isBold()) {
//                    chunk.setFont(fontChinese);
//                }
//                if (run.isItalic()) {
//                    chunk.setFont(fontChinese);
//                }
//                if (run.getFontSize() != -1) {
//                    chunk.setFont(fontChinese);
//                }
                chunk.setFontSize(run.getFontSize() != -1 ? run.getFontSize() : 12);
//                pdfParagraph.add(chunk);
//
                pdfDocument.add(new Paragraph(run.getText(0), fontChinese));
//            }pdfDocument.add(pdfParagraph);}}
}

相关文章:

itext 转换word文档转pdf

itext 转换word文档转pdf <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version><scope>compile</scope></dependency> <dependency><groupId>org.a…...

WSL-默认root登录

WSL-默认root登录 使用管理员&#xff0c;打开powershell PS C:\WINDOWS\system32> wsl -l 适用于 Linux 的 Windows 子系统分发版: Ubuntu-22.04 (默认) PS C:\WINDOWS\system32> ubuntu2204.exe config --default-user root PS C:\WINDOWS\system32>修改之后&…...

ASIO网络调试助手之四:浅谈QTcpServer性能

网络上有些质疑Qt Network模块性能的声音,本文将从理论和压测两个方面对比ASIO tcp server和QTcpServer在Windows上的性能,最后给出结论。 一.理论 QTcpServer在Windows上的实现是基于select模型,源码位置:5.12.6\Src\qtbase\src\network\socket\qnativesocketengine_win…...

快手 日常实习一面面经

官网投递&#xff0c;三天约面 线上面试 &#xff08;60mins&#xff09;&#xff1a; 1. 自我介绍 2. 问实习 介绍自己做的业务上一段实习的公司框架和开源的 RPC 框架的区别负责的业务与核心业务的依赖关系场景题 -> 设计高并发下的负载均衡 3. 项目拷打 手写 双检锁…...

Cursor零基础小白教程系列 - 创建你的第一个Cursor 项目

最适合小白零基础的Cursor教程 网站lookai.top相同作者&#xff0c;最新文章会在网站更新&#xff0c;欢迎收藏书签 创建你的第一个Cursor 项目 实操视频 概述 开始使用Cursor进行编程的第一步是创建或导入一个项目。本指南将帮助您了解如何在Cursor中创建新项目、导入现有项…...

通用序列化和反序列化实现思路

本文简单的记录一下采用模板来实现序列化与反序列的思路&#xff0c; 同时采用C20标准的concept和requires来简化模板函数的选择。 首先了解一下自定义类支持序列化的两种方式&#xff1a; 一、序列化自定义类型&#xff08;侵入式&#xff09; struct Test {std::string na…...

书生营第四期L0G2000 Python 基础知识

闯关任务 Leetcode 383(笔记中提交代码与leetcode提交通过截图) class Solution:def canConstruct(self, ransomNote: str, magazine: str) -> bool:note [0]*26maga [0]*26for s in ransomNote:note[ord(s)-ord(a)] 1for s in magazine:maga[ord(s)-ord(a)] 1for i in…...

Day12-数据库服务冗余架构

Day-12-数据库服务高可用集群 1、数据库MGR组复制实践2、数据库高可用MHA应用介绍3、数据库高可用MHA环境准备4、数据库高可用MHA原理机制5、数据库高可用MHA功能配置 1、数据库MGR组复制实践 &#xff08;强一致性主从同步) 2、数据库高可用MHA应用介绍 3、数据库高可用MHA环境…...

js监听div尺寸,ResizeObserver

示例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><style>.observedDiv {width: 40vw;height: 50vh;background-color: lightblue;}</style></head><body><div id"…...

STM32与openmv的串口通信

OpenMV与STM32的通信是嵌入式系统和物联网领域中的一项重要技术。OpenMV是一种开源的微型机器视觉模块&#xff0c;基于ARM Cortex-M7微控制器&#xff0c;支持多种图像处理功能&#xff0c;如颜色识别、形状检测等。而STM32是STMicroelectronics公司推出的基于ARM Cortex内核的…...

C#基于SkiaSharp实现印章管理(11)

PdfSharpCore支持类似GDI方式在PDF页面绘制文字、矩形、圆形、多边形、路径、图片等内容&#xff0c;本文学习基于PdfSharpCore将结构化印章数据导出为PDF文件的基本用法&#xff0c;评估其使用可行性。   PdfSharpCore创建PDF文件很方便&#xff0c;调用PdfDocument类创建实…...

Spring使用@Async出现循环依赖原因以及解决方案

场景复现 1、首先项目需要打开spring的异步开关&#xff0c;在application主类上加EnableAsync 2、创建一个包含了Async方法的异步类MessageService&#xff1a; Service public class MessageService {Resource private TaskService taskService; Async public void…...

如何训练 RAG 模型

训练 RAG&#xff08;Retrieval-Augmented Generation&#xff09;模型涉及多个步骤&#xff0c;包括准备数据、构建知识库、配置检索器和生成模型&#xff0c;以及进行训练。以下是一个详细的步骤指南&#xff0c;帮助你训练 RAG 模型。 1. 安装必要的库 确保你已经安装了必…...

鸿蒙网络编程系列34-Wifi热点扫描及连接示例

1. Wifi热点简介 Wifi热点是移动设备接入网络的重要形式&#xff0c;特别是在不具备固定网络接入点的情况下&#xff0c;可以通过Wifi热点灵活方便的接入网络&#xff0c;因此在日常生活中具有广泛的应用。鸿蒙系统也提供了方便的Wifi管理API&#xff0c;支持热点扫描&#xf…...

LVS三种模式工作原理

常用负载均衡设备 实现负载均衡的技术的方式有哪些&#xff1a;硬件层面有F5负载均衡器&#xff0c;网络层层面有LVS(Linux Virtual Server)&#xff0c;应用层层面就是nginx、Haproxy等。 lvs工作在网络层&#xff0c;nginx工作在应用层。 LVS有三种工作模式 lvs是由章文崇…...

【二轮征稿启动】第三届环境工程与可持续能源国际会议持续收录优质稿件

第三届环境工程与与可持续能源国际会议&#xff08;EESE 2024&#xff09;由中南林业科技大学主办&#xff0c;湖南农业大学协办&#xff0c;将于2024年12月20日-22日在湖南长沙召开。 大会邀请到国家杰出青年科学基金获得者、华中科技大学能源与动力工程学院冯光教授&#xf…...

网络安全——防火墙技术

目录 前言基本概念常见防火墙技术防火墙的主要功能防火墙的不足之处相关题目1.组织外部未授权用户访问内部网络2.DMZ区3.包过滤防火墙和代理服务防火墙 前言 这是在软件设计师备考时编写的资料文章&#xff0c;相关内容偏向软件设计师 基本概念 防火墙技术是网络安全领域中的…...

Missing classes detected while running R8报错解决方案

Android 打包release版本时报错如下&#xff1a; > Task :printlib:minifyReleaseWithR8 FAILED AGPBI: {"kind":"error","text":"Missing classes detected while running R8. Please add the missing classes or apply additional ke…...

智能指针

目录 1. 为什么需要智能指针&#xff1f; 2. 内存泄漏 2.1 什么是内存泄漏&#xff0c;内存泄漏的危害 2.2 内存泄漏分类&#xff08;了解&#xff09; 堆内存泄漏(Heap leak) 系统资源泄漏 2.3 如何检测内存泄漏&#xff08;了解&#xff09; 2.4如何避免内存泄漏 3.…...

通过DevTools逃离Chrome沙盒(CVE-2024-6778和CVE-2024-5836)

介绍 这篇博文详细介绍了如何发现CVE-2024-6778和CVE-2024-5836的&#xff0c;这是Chromium web浏览器中的漏洞&#xff0c;允许从浏览器扩展&#xff08;带有一点点用户交互&#xff09;中进行沙盒逃逸。 简而言之&#xff0c;这些漏洞允许恶意的Chrome扩展在你的电脑上运行…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...