博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java PPT 转成PDF,中文乱码解决
阅读量:7006 次
发布时间:2019-06-27

本文共 4363 字,大约阅读时间需要 14 分钟。

ppt转成pdf,原理是ppt转成图片,再用图片生产pdf,过程有个问题,不管是ppt还是pptx,都遇到中文乱码,编程方框的问题,其中ppt后缀网上随便找就有解决方案,就是设置字体为统一字体,pptx如果页面是一种中文字体不会有问题,如果一个页面有微软雅黑和宋体,就会导致部分中文方框,怀疑是poi处理的时候,只读取第一种字体,所以导致多个中文字体乱码。

百度和谷歌都找了很久,有看到说apache官网有人说是bug( ),但他们回复说是字体问题,这个问题其实我觉得poi可能可以自己做,读取原来字体设置成当前字体,不过性能应该会有很多消耗,反正我估计很多人跟我一样花费大量时间找解决方案,网上几乎没有现成的方案。自己也是一步步尝试,最终找到解决办法,ppt格式的就不说了网上找得到,pptx后缀的网上我是没找到。

问题前的pptx转成图片:

image

解决后的pptx转成图片:

image

解决方法:

图取每个shape,将文字转成统一的字体,网上找到的那段代码不可行,我自己改的方案如下:

for( XSLFShape shape : slide[i].getShapes() ){                    if ( shape instanceof XSLFTextShape ){                        XSLFTextShape txtshape = (XSLFTextShape)shape ;                        System.out.println("txtshape" + (i+1) + ":"  + txtshape.getShapeName());                        System.out.println("text:" +txtshape.getText());                                                for ( XSLFTextParagraph textPara : txtshape.getTextParagraphs() ){                            List
textRunList = textPara.getTextRuns(); for(XSLFTextRun textRun: textRunList) { textRun.setFontFamily("宋体"); } } } }

完整代码如下(除了以上自己的解决方案,大部分是stackoverflow上的代码):

public static void convertPPTToPDF(String sourcepath, String destinationPath, String fileType) throws Exception {        FileInputStream inputStream = new FileInputStream(sourcepath);        double zoom = 2;        AffineTransform at = new AffineTransform();        at.setToScale(zoom, zoom);        Document pdfDocument = new Document();        PdfWriter pdfWriter = PdfWriter.getInstance(pdfDocument, new FileOutputStream(destinationPath));        PdfPTable table = new PdfPTable(1);        pdfWriter.open();        pdfDocument.open();        Dimension pgsize = null;        Image slideImage = null;        BufferedImage img = null;        if (fileType.equalsIgnoreCase(".ppt")) {            SlideShow ppt = new SlideShow(inputStream);            inputStream.close();            pgsize = ppt.getPageSize();            Slide slide[] = ppt.getSlides();            pdfDocument.setPageSize(new Rectangle((float) pgsize.getWidth(), (float) pgsize.getHeight()));            pdfWriter.open();            pdfDocument.open();            for (int i = 0; i < slide.length; i++) {                                TextRun[] truns = slide[i].getTextRuns();                      for ( int k=0;k
textRunList = textPara.getTextRuns(); for(XSLFTextRun textRun: textRunList) { textRun.setFontFamily("宋体"); } } } } img = new BufferedImage((int) Math.ceil(pgsize.width * zoom), (int) Math.ceil(pgsize.height * zoom), BufferedImage.TYPE_INT_RGB); Graphics2D graphics = img.createGraphics(); graphics.setTransform(at); graphics.setPaint(Color.white); graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height)); slide[i].draw(graphics); // FileOutputStream out = new FileOutputStream("src/main/resources/test"+i+".jpg"); // javax.imageio.ImageIO.write(img, "jpg", out); graphics.getPaint(); slideImage = Image.getInstance(img, null); table.addCell(new PdfPCell(slideImage, true)); } } pdfDocument.add(table); pdfDocument.close(); pdfWriter.close(); System.out.println("Powerpoint file converted to PDF successfully"); }

maven配置:

org.apache.poi
poi
3.9
org.apache.poi
poi-ooxml
3.9
com.itextpdf
itextpdf
5.5.7
com.itextpdf.tool
xmlworker
5.5.7
org.apache.poi
poi-scratchpad
3.9

参考资料:

文章转载自 开源中国社区[https://www.oschina.net]

你可能感兴趣的文章
四年前从这里开始,四年后从这里继续-回归博客园
查看>>
node.js的作用、回调、同步异步代码、事件循环
查看>>
深入学习虚拟机类加载过程
查看>>
WPF笔记(2.6 ViewBox)——Layout
查看>>
Linux命令--删除软连接
查看>>
Nginx 错误汇总
查看>>
Maven将jar包放入本地库
查看>>
SnowNLP:一个处理中文文本的 Python 类库
查看>>
linux系统性能监视命令
查看>>
iOS: 悬浮的条件筛选下拉框的使用
查看>>
2016 SDCC会后总结
查看>>
学习ASP.NET Core, 怎能不了解请求处理管道[6]: 管道是如何随着WebHost的开启被构建出来的?...
查看>>
Chrome浏览器插件推荐大全
查看>>
在现有的图像处理软件中融合dxf格式输出
查看>>
2016-2017-1 《信息安全系统设计基础》第十一周课程总结
查看>>
ChartControl 折线图 柱状图
查看>>
拖动滚动条时某一处相对另一处固定不动(position:fixed)
查看>>
线性模型
查看>>
查看本地电脑的端口及对应的使用程序
查看>>
Spring AOP 问与答
查看>>