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的时候,有问题。帮忙看下这一段代码有什么地方会造成本地和服务器的差异吗?


GCT1015
浏览 1637回答 9
9回答

温温酱

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

萧十郎

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

BIG阳

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

忽然笑

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

千万里不及你

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

慕运维8079593

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

HUWWW

建议采用Document.save的方式,转换pdf,能避免好多因为加水印导致原本格式错乱的问题以及乱码。本人资历有限,仅供参考,写的不对的地方,望请指正,谢谢。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java