java實(shí)現(xiàn)PPT轉(zhuǎn)PDF出現(xiàn)中文亂碼問題的解決方法
ppt轉(zhuǎn)成pdf,原理是ppt轉(zhuǎn)成圖片,再用圖片生產(chǎn)pdf,過程有個(gè)問題,不管是ppt還是pptx,都遇到中文亂碼,編程方框的問題,其中ppt后綴網(wǎng)上隨便找就有解決方案,就是設(shè)置字體為統(tǒng)一字體,pptx如果頁面是一種中文字體不會有問題,如果一個(gè)頁面有微軟雅黑和宋體,就會導(dǎo)致部分中文方框,懷疑是poi處理的時(shí)候,只讀取第一種字體,所以導(dǎo)致多個(gè)中文字體亂碼。
百度和谷歌都找了很久,有看到說apache官網(wǎng)有人說是bug,但他們回復(fù)說是字體問題,這個(gè)問題其實(shí)我覺得poi可能可以自己做,讀取原來字體設(shè)置成當(dāng)前字體,不過性能應(yīng)該會有很多消耗,反正我估計(jì)很多人跟我一樣花費(fèi)大量時(shí)間找解決方案,網(wǎng)上幾乎沒有現(xiàn)成的方案。自己也是一步步嘗試,最終找到解決辦法,ppt格式的就不說了網(wǎng)上找得到,pptx后綴的網(wǎng)上我是沒找到。
問題前的pptx轉(zhuǎn)成圖片:

解決后的pptx轉(zhuǎn)成圖片:

解決方法:
讀取每個(gè)shape,將文字轉(zhuǎn)成統(tǒng)一的字體,網(wǎng)上找到的那段代碼不可行,我自己改的方案如下:
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實(shí)現(xiàn)PPT轉(zhuǎn)PDF出現(xiàn)中文亂碼問題的解決方法,希望對大家的學(xué)習(xí)有所幫助。
相關(guān)文章
java求最大公約數(shù)與最小公倍數(shù)的方法示例
這篇文章主要介紹了java求最大公約數(shù)與最小公倍數(shù)的方法,涉及java數(shù)值運(yùn)算的相關(guān)操作技巧,并附帶分析了eclipse環(huán)境下設(shè)置運(yùn)行輸入?yún)?shù)的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
SpringCloud_Sleuth分布式鏈路請求跟蹤的示例代碼
Spring Cloud Sleuth是一款針對Spring Cloud的分布式跟蹤工具,本文通過實(shí)例代碼介紹了SpringCloud_Sleuth分布式鏈路請求跟蹤,感興趣的朋友跟隨小編一起看看吧2023-02-02
java.text.DecimalFormat類十進(jìn)制格式化
這篇文章主要為大家詳細(xì)介紹了java.text.DecimalFormat類十進(jìn)制格式化的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
Java如何處理數(shù)據(jù)成為樹狀結(jié)構(gòu)
這篇文章主要介紹了Java如何處理數(shù)據(jù)成為樹狀結(jié)構(gòu)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Java語言中flush()函數(shù)作用及使用方法詳解
這篇文章主要介紹了Java語言中flush函數(shù)作用及使用方法詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
springboot config 攔截器使用方法實(shí)例詳解
本文介紹Spring-Boot中使用攔截器的相關(guān)知識,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-05-05

