jodconverter纯文本文件转为pdf时中文问题解决方案

本文转载:http://nopainnogain.iteye.com/blog/771036

jodconverter转换ms文件都没有出现中文问题,但是在转换最简单的纯文本文件时却出现中文问题。我开始时找了cpdetecter来探测纯文本文件的编码格式,但是对一些文件的编码格式还是探测不对,所以想通过它探测到文本文件的编码格式,再将它转为UTF-8的方式来实现文本的统一编码方式(演示代码见下面)是行不通的:

 

Java代码
import java.io.FileInputStream;   
  1. import java.io.FileOutputStream;   
  2. import java.io.InputStreamReader;   
  3. import java.io.OutputStreamWriter;   
  4.   
  5.   
  6. public class changeCharacterFormat {   
  7.   
  8.     public static void main(String[] args) throws Exception{   
  9.            
  10.         InputStreamReader in = new InputStreamReader(   
  11.                 new FileInputStream("D:\\test\\File\\新建 文本文档 (2).txt"),"GB2312");//按原文件的编码方式进行读取文件信息  
  12.         OutputStreamWriter out = new OutputStreamWriter(   
  13.                 new FileOutputStream("D:\\test\\File\\新建 文本文档 (2)8.txt"),"utf-8");//转换为自己想要的编码格  
  14.         char[] cbuf = new char[1024];   
  15.         int n;   
  16.         while((n=in.read(cbuf))!=-1){   
  17.             out.write(cbuf, 0, n);   
  18.         }   
  19.         in.close();   
  20.         out.close();   
  21.     }   
  22.        
  23. }  
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;


public class changeCharacterFormat {

	public static void main(String[] args) throws Exception{
		
		InputStreamReader in = new InputStreamReader(
				new FileInputStream("D:\\test\\File\\新建 文本文档 (2).txt"),"GB2312");//按原文件的编码方式进行读取文件信息
		OutputStreamWriter out = new OutputStreamWriter(
				new FileOutputStream("D:\\test\\File\\新建 文本文档 (2)8.txt"),"utf-8");//转换为自己想要的编码格
		char[] cbuf = new char[1024];
		int n;
		while((n=in.read(cbuf))!=-1){
			out.write(cbuf, 0, n);
		}
		in.close();
		out.close();
	}
	
}

 

 

如是就试着将纯文本文件(如*.java,*.c,*.log,*.xml,*.mxml,*.jsp,*asp,*.js等等)的后缀改为.txt再打由openoffice打印成pdf,它是可以打印,但是对于有中文的文件,它就会出现乱码。后来我将它们改为*.odt的后缀后就可以正确地打印成pdf,显示出正常的中文。这里其实是这样的,我将它们改为.odt后缀后,那么再用jodconverter来打印时,它就会调用openoffice来打印,那么就相当于它用openoffice打开它的odt格式的文件,再点击打印成pdf;因为它对*.odt文件支持中文,所以它打开它时,中文是正确的,其实它在读这个非odt的纯文本文件时,它就能识别出它的编码格式,所以就不用我们再去找那个原文件的编码格式,再进行转换,我们可以直接打印。所以关键还是理解jodconverter的打印原理,它不过是对openoffice的打印接口的调用,所以我们若将如*.jsp等文本改后缀名为*.txt,因为*.txt不是由openoffice直接产生的文本格式,所以对它的支持力度就没有将这些文件改后缀名为*.odt的好,因此将其它非odt的纯文本文件改名为odt文本文件时,它打印出pdf时能正确显示中文,而改名为txt后缀时,出现乱码的主要原因。

使用 jodconverter 将 workbook 转为 pdf 的代码示例如下: ```java import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.artofsolving.jodconverter.OfficeDocumentConverter; import org.artofsolving.jodconverter.office.DefaultOfficeManagerConfiguration; import org.artofsolving.jodconverter.office.OfficeManager; public class ExcelToPdfConverter { public static void main(String[] args) throws IOException { // 加载 Excel 文件 Workbook workbook = new XSSFWorkbook(new File("test.xlsx")); // 创建 PDF 文件 File pdfFile = new File("test.pdf"); pdfFile.createNewFile(); // 配置 OpenOffice 运行环境 DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration(); configuration.setOfficeHome("C:/Program Files (x86)/OpenOffice 4/"); configuration.setPortNumber(8100); configuration.setTaskExecutionTimeout(1000 * 60 * 5L); configuration.setTaskQueueTimeout(1000 * 60 * 60 * 24L); OfficeManager officeManager = configuration.buildOfficeManager(); officeManager.start(); // 换 Excel 文件为 PDF 文件 OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager); converter.convert(workbook, pdfFile); // 关闭 OpenOffice 运行环境 officeManager.stop(); // 输出 PDF 文件路径 System.out.println("PDF file generated: " + pdfFile.getAbsolutePath()); } } ``` 其中,需要注意以下几点: 1. 需要引入 jodconverter 和 poi 依赖库。 2. 需要下载并安装 OpenOffice,然后在代码中配置正确的 `OfficeHome`(OpenOffice 安装路径)。 3. 需要启动 OpenOffice 运行环境,才能使用 jodconverter 进行换。启动过程较慢,需要耐心等待。 4. 换完成后,需要关闭 OpenOffice 运行环境,释放资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值