JAVA 使用POI替换word中的某些字符串,在本地调试一切ok,在服务器上出现乱码
最近做了一个在word中替换指定字符串,插入图片,转换成pdf的需求,弄了两天多才搞出来,本以为everything is ok,但是在本地调试什么都是好的。
放到服务器上以后。。。却乱码了。。。乱码了。。。码了。。。了,求大佬列出可能的情况。
乱码的样子是这样的:
刚刚问了下运维:服务器是这个alpine
贴上代码,各位大佬帮忙分析分析
public JSONObject createTemplatePdf(File file) throws Exception {
JSONObject res;
// 验证License
if (getLicense()) {
FileOutputStream fileOutputStream = null;
FileInputStream pdfInputStream = null;
try {
Document doc = new Document(new FileInputStream(file));
// 以下几行代码是把这个word文件转化成pdf文件
File pdfFile = mkDirectoryAndFile(FILE_TYPE_PDF);
fileOutputStream = new FileOutputStream(pdfFile);
doc.save(fileOutputStream, SaveFormat.PDF);
// 下面把这个文件传到文件服务器,并返回信息
pdfInputStream = new FileInputStream(pdfFile);
MultipartFile multipartFile = getMulFile(pdfFile);
JSONArray jsonArray = sharedServiceClient.saveFile(multipartFile);
res = jsonArray.getJSONObject(0);
// 删除临时文件
if (pdfFile.exists()) {
pdfFile.delete();
}
// 删除临时文件
if (file.exists()) {
file.delete();
}
} finally {
if (fileOutputStream != null) {
fileOutputStream.flush();
fileOutputStream.close();
}
if (pdfInputStream != null) {
pdfInputStream.close();
}
}
} else {
throw new Exception("授权文件失效!");
}
return res;
}
public MultipartFile getMulFile(File file) {
FileItem fileItem = createFileItem(file);
MultipartFile mfile = new CommonsMultipartFile(fileItem);
return mfile;
}
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
JSONArray saveFile(@Param("file") MultipartFile file);
调试了一下,发现是word转pdf的时候,有问题。帮忙看下这一段代码有什么地方会造成本地和服务器的差异吗?
已经搞定,感谢上面大佬们的回复,确实是语言包的问题,因为word里面全弄的是微软雅黑这个字体,
于是就单独把微软雅黑字体放进服务器,但是依旧是不行,于是我以为不是这个问题,今天实在是没招了,
网上搜了一大堆,大半都是说服务器字体的原因,然后就让运维把windows下的所有字体全部移到服务器下,
然后再试了一次,就好了。代码没有变动!
1、本地的JDK版本和生产线的是不是一致的?
2、是不是编码格式直接发生了改变?
3、本地模拟生产环境去找问题?重现一下
linux服务器有种可能是服务器使用的语言包和你本地的语言包不一致,
应该是字体问题,服务器环境经常会出现和开发环境字体不一致,以前试过html转PDF,也是这个坑,导致两个环境生成的PDF字体大小不一样,解决方法是给服务器环境配置齐全字体,或者代码处理字体
更正---------------------------
语言包有误导,改为字体
可以加载对应的语言包,服务器上可能不支持
下载了语言包也要在生成pdf的时候设置
//生成空白pdf文件
Document document = new Document();
PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(mmSavePath + ppFileName));
//设置只有打印权限
pdfWriter.setEncryption(null,null, PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);
document.open();
document.newPage();
document.add(new Paragraph(" "));
document.close();
pdfWriter.close();
String url = new File(file1).toURI().toURL().toString();
String outputFile = mmSavePath + ppFileName;
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
/*PDFEncryption pdfEncryption = new PDFEncryption(null,null,PdfWriter.ALLOW_PRINTING,PdfWriter.ENCRYPTION_AES_128);
renderer.setPDFEncryption(pdfEncryption); //只有打印权限的
*/ renderer.setDocument(url);
// 解决中文问题
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont(basePath + "muban/simsun.ttc",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
fontResolver.addFont(basePath + "muban/SIMFANG.TTF",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
renderer.layout();
renderer.createPDF(os);
os.close();
但是我这是生成html,转换为pdf,你可以看看,