java - Unicode characters not converting from pptx to png -


i have written program convert pptx png. conversion happens fine issue ever there unicode character in pptx file - converts junk character. here code. tried add fonts did not help. pptx contains - "/ˌinəˈvāshən/". converts letters i, n, v, a, s, h, n fine not others.

    fileinputstream = new fileinputstream(strtemppath);     xmlslideshow pptx = new xmlslideshow(is);     is.close();     double zoom = 2; // magnify 2     affinetransform @ = new affinetransform();     at.settoscale(zoom, zoom);     dimension pgsize = pptx.getpagesize();                  xslfslide[] slide = pptx.getslides();      }                   // bufferedimage img = new bufferedimage((int)math.ceil(pgsize.width*zoom), (int)math.ceil(pgsize.height*zoom), bufferedimage.type_int_rgb);     bufferedimage img = new bufferedimage(pgsize.width, pgsize.height, 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[ipageno].draw(graphics);                  // fileoutputstream output = new bytearrayoutputstream("c:/temp/aspose/word/slide-" + (10 + 1) + ".png");             output = new bytearrayoutputstream();     javax.imageio.imageio.write(img, "png", output); 

this how trying add fonts still did not convert.

        font customfont = font.createfont(font.truetype_font, new file("/usr/share/fonts/geinsprg.ttf")).derivefont(12f);         graphicsenvironment ge = graphicsenvironment.getlocalgraphicsenvironment();         //register font         ge.registerfont(font.createfont(font.truetype_font, new file("/usr/share/fonts/geinsprg.ttf")));         graphics.setfont(customfont); 

here code have: given in original question: , test pptx contains word - /ˌinəˈvāshən/ in addition other english letter words.

package foo;  import java.awt.dimension;  import java.awt.graphics2d; import java.awt.geom.affinetransform; import java.awt.geom.rectangle2d; import java.awt.image.bufferedimage; import java.io.fileinputstream; import java.io.fileoutputstream; import org.apache.poi.xslf.usermodel.xmlslideshow; import org.apache.poi.xslf.usermodel.xslfslide;  public class pptxtopng {  public static void main(string[] args) throws exception {      fileinputstream = new fileinputstream("c:/temp/pptxtoimage/unicode_test.pptx");            xmlslideshow ppt = new xmlslideshow(is);     is.close();     double zoom = 2;     affinetransform @ = new affinetransform();     at.settoscale(zoom, zoom);     dimension pgsize = ppt.getpagesize();     xslfslide[] slide = ppt.getslides();      bufferedimage 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.fill(new rectangle2d.float(0, 0, pgsize.width, pgsize.height));      // draw first page in pptx. first page starts @ 0 position     slide[0].draw(graphics);      fileoutputstream out = new fileoutputstream("c:/temp/pptxtoimage/convertedslide.png");       javax.imageio.imageio.write(img, "png", out);     out.close();     system.out.println("done");     } } 

as jongware pointed out above, characters not available in "ge inspira" font, can see in example programm below - you'll need /ˌinəˈvāshən/ (innovation) come around ;)

there several approaches can think off:

  • i'm not sure if graphics.setfont(customfont); setting in code test, poi use (and set) font, specified in document. easiest replace font in original document font supports phonetics (see wikipedia unicode article suitable fonts). btw. if try use font in libre office , insert these phonetics you'll "junk" chars.

  • you use fontforge add missing chars preferred font different font (but of course need used - see above). bit strange, better rectangles ...

  • you check beforehand if chars in text-runs supported specified font , insert new text-run element alternative font unsupported chars

  • i know pdfs have kind of font substitution going on, in case font (or character???) can't found, haven't found similar mechanism java in short search ... maybe there's solution in way ...

(tested poi 3.10-beta1)

import java.awt.*; import java.awt.geom.*; import java.awt.image.bufferedimage; import java.io.*; import org.apache.poi.xslf.usermodel.*;  public class unicodeppt {     public static void main(string[] args) throws exception {         // create sample pptx         xmlslideshow ss = new xmlslideshow();         dimension pgsize = ss.getpagesize();                       xslfslide slide = ss.createslide();         xslftextbox tb = slide.createtextbox();         tb.setshapetype(xslfshapetype.heart);         int shapesize = 150;         tb.setanchor(new rectangle2d.double(pgsize.getwidth()/2-shapesize/2, pgsize.getheight()/2-shapesize/2, shapesize, shapesize));         tb.setlinewidth(2);         tb.setlinecolor(color.black);         xslftextparagraph par = tb.addnewtextparagraph();         tb.setverticalalignment(verticalalignment.distributed);         par.settextalign(textalign.center);         xslftextrun run = par.addnewtextrun();         run.settext("/\u02ccin\u0259\u02c8v\u0101sh\u0259n/");         run.setfontfamily("dejavu serif");         run.setfontsize(12);         par.addlinebreak();         run = par.addnewtextrun();         run.settext("/\u02ccin\u0259\u02c8v\u0101sh\u0259n/");         run.setfontfamily("ge inspira");         run.setfontsize(12);          // set font         graphicsenvironment ge = graphicsenvironment.getlocalgraphicsenvironment();         inputstream = new fileinputstream("src/main/resources/geinsprg.ttf");         font font = font.createfont(font.truetype_font, is);         is.close();         ge.registerfont(font);            = new fileinputstream("src/main/resources/dejavuserif.ttf");         font = font.createfont(font.truetype_font, is);         is.close();         ge.registerfont(font);            // render         double zoom = 2; // magnify 2         affinetransform @ = new affinetransform();         at.settoscale(zoom, zoom);          bufferedimage 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.draw(graphics);                       fileoutputstream fos = new fileoutputstream("unicodeppt.png");         javax.imageio.imageio.write(img, "png", fos);                fos.close();     } } 

Comments

Popular posts from this blog

Unable to remove the www from url on https using .htaccess -