本文目录导读:

我来为您提供一个完整的Java文档转换案例,涵盖常见的文档格式转换场景。
项目依赖配置 (pom.xml)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>document-converter</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Apache POI - Word/Excel/PowerPoint -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<!-- iText - PDF处理 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.2.5</version>
<type>pom</type>
</dependency>
<!-- OpenPDF - 轻量PDF库 -->
<dependency>
<groupId>com.github.librepdf</groupId>
<artifactId>openpdf</artifactId>
<version>1.3.30</version>
</dependency>
<!-- Apache Commons IO -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<!-- Log4j2 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
文档转换工具类
package com.example.converter;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import org.apache.poi.xwpf.converter.pdf.PdfConverter;
import org.apache.poi.xwpf.converter.pdf.PdfOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.List;
/**
* 文档转换工具类
* 支持Word、PDF、TXT等格式转换
*/
public class DocumentConverter {
private static final org.apache.logging.log4j.Logger logger =
org.apache.logging.log4j.LogManager.getLogger(DocumentConverter.class);
/**
* Word转PDF(使用POI和iText)
*/
public static void wordToPdf(String wordPath, String pdfPath) {
try (FileInputStream fis = new FileInputStream(wordPath);
FileOutputStream fos = new FileOutputStream(pdfPath)) {
// 加载Word文档
XWPFDocument document = new XWPFDocument(fis);
// 创建PDF文档
PdfWriter writer = new PdfWriter(fos);
PdfDocument pdf = new PdfDocument(writer);
Document pdfDocument = new Document(pdf);
// 遍历Word段落并转换
List<XWPFParagraph> paragraphs = document.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
StringBuilder lineText = new StringBuilder();
for (XWPFRun run : paragraph.getRuns()) {
lineText.append(run.text());
}
if (lineText.length() > 0) {
pdfDocument.add(new Paragraph(lineText.toString()));
}
}
pdfDocument.close();
document.close();
logger.info("Word转PDF成功: {}", pdfPath);
} catch (Exception e) {
logger.error("Word转PDF失败", e);
throw new RuntimeException("Word转PDF失败", e);
}
}
/**
* Word转PDF(使用POI XWPF converter)
*/
public static void wordToPdfWithConverter(String wordPath, String pdfPath) {
try (FileInputStream fis = new FileInputStream(wordPath);
FileOutputStream fos = new FileOutputStream(pdfPath)) {
XWPFDocument document = new XWPFDocument(fis);
PdfOptions options = PdfOptions.create();
PdfConverter.getInstance().convert(document, fos, options);
document.close();
logger.info("Word转PDF成功(Converter): {}", pdfPath);
} catch (Exception e) {
logger.error("Word转PDF失败(Converter)", e);
throw new RuntimeException("Word转PDF失败", e);
}
}
/**
* PDF转TXT
*/
public static void pdfToTxt(String pdfPath, String txtPath) {
try {
com.itextpdf.kernel.pdf.PdfDocument pdfDoc =
new com.itextpdf.kernel.pdf.PdfDocument(
new com.itextpdf.kernel.pdf.PdfReader(pdfPath));
StringBuilder text = new StringBuilder();
int pages = pdfDoc.getNumberOfPages();
for (int i = 1; i <= pages; i++) {
com.itextpdf.kernel.pdf.PdfPage page = pdfDoc.getPage(i);
com.itextpdf.kernel.pdf.canvas.parser.PdfTextExtractor
.getTextFromPage(page,
new com.itextpdf.kernel.pdf.canvas.parser.listener.SimpleTextExtractionStrategy());
// 使用PDFBox或iText的extractor
String pageText = com.itextpdf.kernel.pdf.canvas.parser.PdfTextExtractor
.getTextFromPage(page, new com.itextpdf.kernel.pdf.canvas.parser.listener.SimpleTextExtractionStrategy());
text.append(pageText);
text.append("\n");
}
// 写入TXT文件
try (FileWriter writer = new FileWriter(txtPath, StandardCharsets.UTF_8)) {
writer.write(text.toString());
}
pdfDoc.close();
logger.info("PDF转TXT成功: {}", txtPath);
} catch (Exception e) {
logger.error("PDF转TXT失败", e);
throw new RuntimeException("PDF转TXT失败", e);
}
}
/**
* TXT转Word
*/
public static void txtToWord(String txtPath, String wordPath) {
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream(txtPath), StandardCharsets.UTF_8));
FileOutputStream fos = new FileOutputStream(wordPath)) {
// 创建Word文档
XWPFDocument document = new XWPFDocument();
String line;
while ((line = reader.readLine()) != null) {
// 创建段落
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText(line);
}
// 保存文档
document.write(fos);
document.close();
logger.info("TXT转Word成功: {}", wordPath);
} catch (Exception e) {
logger.error("TXT转Word失败", e);
throw new RuntimeException("TXT转Word失败", e);
}
}
/**
* HTML转PDF
*/
public static void htmlToPdf(String htmlPath, String pdfPath) {
try {
// 读取HTML内容
String htmlContent = new String(
java.nio.file.Files.readAllBytes(java.nio.file.Paths.get(htmlPath)),
StandardCharsets.UTF_8);
// 创建PDF文档
PdfWriter writer = new PdfWriter(pdfPath);
PdfDocument pdfDoc = new PdfDocument(writer);
Document document = new Document(pdfDoc);
// 简单解析HTML(这里使用简单文本提取,实际应使用更复杂的HTML解析器)
String plainText = htmlContent
.replaceAll("<[^>]*>", "") // 移除HTML标签
.replaceAll(" ", " ") // 替换空格
.replaceAll("&", "&") // 替换&符号
.trim();
// 分割成段落
String[] paragraphs = plainText.split("\\n+");
for (String paragraph : paragraphs) {
if (!paragraph.trim().isEmpty()) {
document.add(new Paragraph(paragraph.trim()));
}
}
document.close();
logger.info("HTML转PDF成功: {}", pdfPath);
} catch (Exception e) {
logger.error("HTML转PDF失败", e);
throw new RuntimeException("HTML转PDF失败", e);
}
}
/**
* 批量转换目录下的所有文档
*/
public static void batchConvert(String sourceDir, String targetDir, String fromFormat, String toFormat) {
File sourceDirectory = new File(sourceDir);
File[] files = sourceDirectory.listFiles((dir, name) -> name.endsWith("." + fromFormat));
if (files == null || files.length == 0) {
logger.warn("没有找到{}格式的文件", fromFormat);
return;
}
File targetDirectory = new File(targetDir);
if (!targetDirectory.exists()) {
targetDirectory.mkdirs();
}
for (File file : files) {
String fileName = file.getName().replaceFirst("[.][^.]+$", "");
String sourcePath = file.getAbsolutePath();
String targetPath = targetDir + File.separator + fileName + "." + toFormat;
try {
switch (fromFormat.toLowerCase() + "2" + toFormat.toLowerCase()) {
case "docx2pdf":
case "word2pdf":
wordToPdfWithConverter(sourcePath, targetPath);
break;
case "pdf2txt":
pdfToTxt(sourcePath, targetPath);
break;
case "txt2docx":
txtToWord(sourcePath, targetPath);
break;
case "html2pdf":
htmlToPdf(sourcePath, targetPath);
break;
default:
logger.warn("不支持的转换格式: {} -> {}", fromFormat, toFormat);
}
} catch (Exception e) {
logger.error("转换文件失败: {}", file.getName(), e);
}
}
}
}
Excel文档处理示例
package com.example.converter;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* Excel文档处理类
*/
public class ExcelConverter {
private static final org.apache.logging.log4j.Logger logger =
org.apache.logging.log4j.LogManager.getLogger(ExcelConverter.class);
/**
* Excel转Word
*/
public static void excelToWord(String excelPath, String wordPath) {
try (FileInputStream fis = new FileInputStream(excelPath);
FileOutputStream fos = new FileOutputStream(wordPath)) {
// 读取Excel
Workbook workbook = new XSSFWorkbook(fis);
// 创建Word
XWPFDocument document = new XWPFDocument();
// 遍历所有工作表
for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
Sheet sheet = workbook.getSheetAt(i);
// 添加工作表名称作为标题
XWPFParagraph titlePara = document.createParagraph();
XWPFRun titleRun = titlePara.createRun();
titleRun.setText("工作表: " + sheet.getSheetName());
titleRun.setBold(true);
titleRun.setFontSize(14);
// 创建表格
int rows = sheet.getPhysicalNumberOfRows();
int cols = getMaxColumns(sheet);
if (rows > 0 && cols > 0) {
XWPFTable table = document.createTable(rows, cols);
// 遍历行和列
for (int r = 0; r < rows; r++) {
Row excelRow = sheet.getRow(r);
XWPFTableRow wordRow = table.getRow(r);
for (int c = 0; c < cols; c++) {
Cell excelCell = excelRow != null ? excelRow.getCell(c) : null;
String cellText = "";
if (excelCell != null) {
switch (excelCell.getCellType()) {
case STRING:
cellText = excelCell.getStringCellValue();
break;
case NUMERIC:
cellText = String.valueOf(excelCell.getNumericCellValue());
break;
case BOOLEAN:
cellText = String.valueOf(excelCell.getBooleanCellValue());
break;
default:
cellText = "";
}
}
// 设置Word表格单元格内容
org.apache.poi.xwpf.usermodel.XWPFTableCell tableCell =
wordRow.getCell(c);
tableCell.setText(cellText);
}
}
}
// 添加空行分隔工作表
if (i < workbook.getNumberOfSheets() - 1) {
document.createParagraph();
}
}
// 保存文档
document.write(fos);
workbook.close();
document.close();
logger.info("Excel转Word成功: {}", wordPath);
} catch (Exception e) {
logger.error("Excel转Word失败", e);
throw new RuntimeException("Excel转Word失败", e);
}
}
private static int getMaxColumns(Sheet sheet) {
int maxCols = 0;
for (Row row : sheet) {
if (row.getLastCellNum() > maxCols) {
maxCols = row.getLastCellNum();
}
}
return maxCols;
}
/**
* Excel转PDF
*/
public static void excelToPdf(String excelPath, String pdfPath) {
List<List<String>> data = readExcelData(excelPath);
String[][] arrayData = new String[data.size()][];
for (int i = 0; i < data.size(); i++) {
List<String> row = data.get(i);
arrayData[i] = row.toArray(new String[0]);
}
try {
com.itextpdf.kernel.pdf.PdfWriter writer =
new com.itextpdf.kernel.pdf.PdfWriter(pdfPath);
com.itextpdf.kernel.pdf.PdfDocument pdfDoc =
new com.itextpdf.kernel.pdf.PdfDocument(writer);
com.itextpdf.layout.Document document =
new com.itextpdf.layout.Document(pdfDoc);
// 创建表格
if (arrayData.length > 0 && arrayData[0].length > 0) {
float[] columnWidths = new float[arrayData[0].length];
for (int i = 0; i < columnWidths.length; i++) {
columnWidths[i] = 100f;
}
com.itextpdf.layout.element.Table table =
new com.itextpdf.layout.element.Table(columnWidths);
// 添加数据
for (String[] rowData : arrayData) {
for (String cellData : rowData) {
table.addCell(new com.itextpdf.layout.element.Cell()
.add(new com.itextpdf.layout.element.Paragraph(cellData != null ? cellData : "")));
}
}
document.add(table);
}
document.close();
logger.info("Excel转PDF成功: {}", pdfPath);
} catch (Exception e) {
logger.error("Excel转PDF失败", e);
throw new RuntimeException("Excel转PDF失败", e);
}
}
private static List<List<String>> readExcelData(String excelPath) {
List<List<String>> data = new ArrayList<>();
try (FileInputStream fis = new FileInputStream(excelPath)) {
Workbook workbook = new XSSFWorkbook(fis);
Sheet sheet = workbook.getSheetAt(0); // 读取第一个工作表
for (Row row : sheet) {
List<String> rowData = new ArrayList<>();
for (Cell cell : row) {
switch (cell.getCellType()) {
case STRING:
rowData.add(cell.getStringCellValue());
break;
case NUMERIC:
rowData.add(String.valueOf(cell.getNumericCellValue()));
break;
case BOOLEAN:
rowData.add(String.valueOf(cell.getBooleanCellValue()));
break;
default:
rowData.add("");
}
}
data.add(rowData);
}
workbook.close();
} catch (Exception e) {
logger.error("读取Excel失败", e);
throw new RuntimeException("读取Excel失败", e);
}
return data;
}
}
主程序示例
package com.example;
import com.example.converter.DocumentConverter;
import com.example.converter.ExcelConverter;
/**
* 文档转换演示主程序
*/
public class Main {
private static final org.apache.logging.log4j.Logger logger =
org.apache.logging.log4j.LogManager.getLogger(Main.class);
public static void main(String[] args) {
try {
// 示例1: Word转PDF
System.out.println("=== 测试 Word 转 PDF ===");
DocumentConverter.wordToPdf(
"input/sample.docx",
"output/sample.pdf"
);
// 示例2: PDF转TXT
System.out.println("=== 测试 PDF 转 TXT ===");
DocumentConverter.pdfToTxt(
"input/sample.pdf",
"output/sample.txt"
);
// 示例3: TXT转Word
System.out.println("=== 测试 TXT 转 Word ===");
DocumentConverter.txtToWord(
"input/sample.txt",
"output/sample.docx"
);
// 示例4: Excel转Word
System.out.println("=== 测试 Excel 转 Word ===");
ExcelConverter.excelToWord(
"input/sample.xlsx",
"output/sample.docx"
);
// 示例5: HTML转PDF
System.out.println("=== 测试 HTML 转 PDF ===");
DocumentConverter.htmlToPdf(
"input/sample.html",
"output/sample.pdf"
);
// 示例6: 批量转换
System.out.println("=== 测试批量转换 ===");
DocumentConverter.batchConvert(
"input/",
"output/",
"docx",
"pdf"
);
System.out.println("所有文档转换完成!");
} catch (Exception e) {
logger.error("文档转换失败", e);
System.err.println("错误: " + e.getMessage());
}
}
}
使用说明
// 创建必要的目录结构 // src/main/java/com/example/ // │── converter/ // │ ├── DocumentConverter.java // │ └── ExcelConverter.java // ├── Main.java // └── resources/ // └── log4j2.xml // input/ 和 output/ 目录放在项目根目录 // log4j2配置 (log4j2.xml)
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="File" fileName="logs/application.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</Root>
</Loggers>
</Configuration>
这个完整的案例涵盖了:
- Word转PDF:两种方式实现
- PDF转TXT:提取PDF文本内容
- TXT转Word:文本写入Word文档
- Excel转Word:Excel数据转换到Word表格
- Excel转PDF:Excel数据呈现在PDF表格中
- HTML转PDF:HTML内容转为PDF
- 批量转换:支持批量处理
使用前请确保:
- 输入文件格式正确
- 输出目录已创建
- 文件编码为UTF-8(中文内容)
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播