java PPT 转成PDF,中文乱码解决

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

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

百度和谷歌都找了很久,有看到说apache官网有人说是bug(https://bz.apache.org/bugzilla/show_bug.cgi?id=54880 ),但他们回复说是字体问题,这个问题其实我觉得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<XSLFTextRun> 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<truns.length;k++){      
                   RichTextRun[] rtruns = truns[k].getRichTextRuns();      
                  for(int l=0;l<rtruns.length;l++){      
//                       int index = rtruns[l].getFontIndex();      
//                        String name = rtruns[l].getFontName();                
                        rtruns[l].setFontIndex(1);      
                        rtruns[l].setFontName("宋体");                          
                   }      
                }      
                
                
                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);
                graphics.getPaint();
                slideImage = Image.getInstance(img, null);
                table.addCell(new PdfPCell(slideImage, true));
            }
        }
        if (fileType.equalsIgnoreCase(".pptx")) {
            XMLSlideShow ppt = new XMLSlideShow(inputStream);
            pgsize = ppt.getPageSize();
            XSLFSlide 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++) {
                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<XSLFTextRun> 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配置:

<dependency>
      <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
    <!--  <version>3.13</version> -->
     <version>3.9</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
       <!--  <version>3.10-FINAL</version> -->
       <version>3.9</version>
    </dependency>
    
    <dependency>
          <groupId>com.itextpdf</groupId>
          <artifactId>itextpdf</artifactId>
          <version>5.5.7</version>
    </dependency>

    <dependency>
      <groupId>com.itextpdf.tool</groupId>
      <artifactId>xmlworker</artifactId>
      <version>5.5.7</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-scratchpad</artifactId>
      <!--  <version>3.12</version> -->
       <version>3.9</version>
    </dependency>

参考资料:

http://www.tutorialspoint.com/apache_poi_ppt/apache_poi_ppt_quick_guide.htm

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

相关文章
|
11月前
|
小程序
公众号如何添加附传Word、Excel、Pdf、PPT文档
公众号里添加一些文档给公众号粉丝下载,比如课件PPT、申请表Word文档、岗位需求Excel表、大赛入围/获奖名单等。公众号本身是不支持直接上传文件的,但我们可以通过附件小程序“间接”上传文件。
1632 0
|
XML 人工智能 Java
java实现PDF 电子签章
本文介绍了使用Java将Word文档转换为PDF并添加水印、签名和盖章的方法。通过Apache POI读取Word内容,结合OpenPDF生成PDF文件,并利用PdfPageEvent接口实现页面水印与签名功能。代码示例清晰展示了转换流程及关键实现细节。
834 0
|
存储 安全 算法
Java 集合面试题 PDF 下载及高频考点解析
本文围绕Java集合面试题展开,详细解析了集合框架的基本概念、常见集合类的特点与应用场景。内容涵盖`ArrayList`与`LinkedList`的区别、`HashSet`与`TreeSet`的对比、`HashMap`与`ConcurrentHashMap`的线程安全性分析等。通过技术方案与应用实例,帮助读者深入理解集合类的特性和使用场景,提升解决实际开发问题的能力。文末附带资源链接,供进一步学习参考。
348 4
|
人工智能 算法 安全
使用CodeBuddy实现批量转换PPT、Excel、Word为PDF文件工具
通过 CodeBuddy 实现本地批量转换工具,让复杂的文档处理需求转化为 “需求描述→代码生成→一键运行” 的极简流程,真正实现 “技术为效率服务” 的目标。感兴趣的快来体验下把
987 10
|
安全 搜索推荐 iOS开发
WPS Office for Mac 7.3.1 - 写作、表格处理、PPT 制作和 PDF 编辑
WPS Office for Mac 7.3.1 - 写作、表格处理、PPT 制作和 PDF 编辑
961 8
WPS Office for Mac 7.3.1 - 写作、表格处理、PPT 制作和 PDF 编辑
|
数据挖掘 BI
.net8 Syncfusion生成pdf/doc/xls/ppt最新版本
通过使用 Syncfusion,您可以高效地生成各种文档,满足不同的业务需求。这些工具不仅易于使用,还具有高性能和高度可扩展性,是处理文档的理想选择。
730 16
|
Java Apache Maven
Java将word文档转换成pdf文件的方法?
【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
5896 1
|
JavaScript 前端开发 容器
Vue生成PDF文件攻略:html2canvas与jspdf联手,中文乱码与自动换行难题攻克
Vue生成PDF文件攻略:html2canvas与jspdf联手,中文乱码与自动换行难题攻克
2982 0
|
存储 Java API
如何使用 Java 中的 API 更改 PDF 纸张大小
如何使用 Java 中的 API 更改 PDF 纸张大小
458 11
|
存储 前端开发 Java
浅谈Java中文乱码浅析及解决方案
浅谈Java中文乱码浅析及解决方案
740 0