java实现PPT转PDF出现中文乱码问题的解决方法

 更新时间:2015年11月11日 11:38:54   投稿:lijiao  
这篇文章主要为大家详细介绍了java实现PPT转PDF出现中文乱码问题的解决方法,进行了详细的问题分析,需要的朋友可以参考下

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

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

问题前的pptx转成图片:

解决后的pptx转成图片:

解决方法:
读取每个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>

上面就是为大家分享的java实现PPT转PDF出现中文乱码问题的解决方法,希望对大家的学习有所帮助。

相关文章

  • java学生信息管理系统源代码

    java学生信息管理系统源代码

    这篇文章主要为大家详细介绍了java学生信息管理系统源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • java开发建造者模式验证实例详解

    java开发建造者模式验证实例详解

    这篇文章主要为大家介绍了java开发中建造者模式的验证实例详解,文中附含详细示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • RestTemplate响应中如何获取输入流InputStream

    RestTemplate响应中如何获取输入流InputStream

    这篇文章主要介绍了RestTemplate响应中如何获取输入流InputStream问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 手把手教你SpringBoot整合Mybatis

    手把手教你SpringBoot整合Mybatis

    这篇文章主要介绍了手把手教你SpringBoot整合Mybatis,Mybatis是一款持久化框架,可以帮我们省去大部分jdbc的代码,需要的朋友可以参考下
    2023-03-03
  • JAVA String转化成java.sql.date和java.sql.time方法示例

    JAVA String转化成java.sql.date和java.sql.time方法示例

    这篇文章主要给大家分享了关于JAVA String转化成java.sql.date和java.sql.time的方法,文中给出了详细的示例代码,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03
  • Spring注解@RestControllerAdvice原理解析

    Spring注解@RestControllerAdvice原理解析

    这篇文章主要介绍了Spring注解@RestControllerAdvice原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • springboot多数据源使用@Qualifier自动注入无效的解决

    springboot多数据源使用@Qualifier自动注入无效的解决

    这篇文章主要介绍了springboot多数据源使用@Qualifier自动注入无效的解决,具有很好的参考价值,希望对大家有所帮助。也希望大家多多支持脚本之家
    2021-11-11
  • 关于Poi读取Excel引发内存溢出问题的解决方法

    关于Poi读取Excel引发内存溢出问题的解决方法

    这篇文章主要给大家介绍了关于Poi读取Excel引发内存溢出问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • Java压缩解压缩工具类

    Java压缩解压缩工具类

    这篇文章主要为大家详细介绍了Java压缩解压缩工具类,如何压缩单个文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • mybatis-plus实现逻辑删除的示例代码

    mybatis-plus实现逻辑删除的示例代码

    本文主要介绍了mybatis-plus实现逻辑删除的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05

最新评论