为了账号安全,请及时绑定邮箱和手机立即绑定

JAVA 使用POI替换word中的某些字符串,在本地调试一切ok,在服务器上出现乱码

JAVA 使用POI替换word中的某些字符串,在本地调试一切ok,在服务器上出现乱码

GCT1015 2019-04-12 14:15:38
最近做了一个在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的时候,有问题。帮忙看下这一段代码有什么地方会造成本地和服务器的差异吗?
查看完整描述

9 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

应该是字体问题,服务器环境经常会出现和开发环境字体不一致,以前试过html转PDF,也是这个坑,导致两个环境生成的PDF字体大小不一样,解决方法是给服务器环境配置齐全字体,或者代码处理字体
更正---------------------------
语言包有误导,改为字体

查看完整回答
反对 回复 2019-05-14
?
萧十郎

TA贡献1815条经验 获得超13个赞

中文也有很多种字体,上面可能描述成语言包有误导,是字体,比如windows默认微软雅黑,但是很多时候我们比较喜欢使用宋体,新宋体等字体编写文档,这就导致字体不一致,转换PDF就出现乱码。

查看完整回答
反对 回复 2019-05-14
?
BIG阳

TA贡献1859条经验 获得超6个赞

可以加载对应的语言包,服务器上可能不支持


查看完整回答
反对 回复 2019-05-14
?
忽然笑

TA贡献1806条经验 获得超5个赞

下载了语言包也要在生成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,你可以看看,


查看完整回答
反对 回复 2019-05-14
?
千万里不及你

TA贡献1784条经验 获得超9个赞

1、本地的JDK版本和生产线的是不是一致的?
2、是不是编码格式直接发生了改变?
3、本地模拟生产环境去找问题?重现一下

查看完整回答
反对 回复 2019-05-14
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

linux服务器有种可能是服务器使用的语言包和你本地的语言包不一致,


查看完整回答
反对 回复 2019-05-14
?
HUWWW

TA贡献1874条经验 获得超12个赞

建议采用Document.save的方式,转换pdf,能避免好多因为加水印导致原本格式错乱的问题以及乱码。
图片说明
本人资历有限,仅供参考,写的不对的地方,望请指正,谢谢。

查看完整回答
反对 回复 2019-05-14
  • 9 回答
  • 0 关注
  • 1636 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号