gpt4 book ai didi

java - Unicode 字符无法从 pptx 转换为 png

转载 作者:行者123 更新时间:2023-12-02 06:47:15 26 4
gpt4 key购买 nike

我编写了一个将 PPTX 转换为 PNG 的程序。所有转换都进行得很好,唯一的问题是 PPTX 文件中存在 UNICODE 字符 - 它将其转换为垃圾字符。这是代码。我尝试添加字体,但这没有帮助。这就是 PPTX 包含的内容 - “/ˌinəˈvāSHən/”。它可以很好地转换字母 i、n、v、a、S、H、n,但不能转换其他字母。

    FileInputStream is = new FileInputStream(strTempPath);
XMLSlideShow pptx = new XMLSlideShow(is);
is.close();
double zoom = 2; // magnify it by 2
AffineTransform at = 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);

这就是我尝试添加字体但仍然没有转换的方法。

        Font customFont = Font.createFont(Font.TRUETYPE_FONT, new File("/usr/share/fonts/GEInspRg.ttf")).deriveFont(12f);
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
//register the font
ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File("/usr/share/fonts/GEInspRg.ttf")));
graphics.setFont(customFont);
<小时/>

这是我的代码:也在原始问题中给出:并且我的测试PPTX除了其他英文字母单词之外还包含这个单词 -/ˌinəˈvāSHən/。

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 is = new FileInputStream("C:/Temp/PPTXToImage/unicode_test.pptx");

XMLSlideShow ppt = new XMLSlideShow(is);
is.close();
double zoom = 2;
AffineTransform at = 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 the PPTX. First page starts at 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");

}
}

最佳答案

正如 Jongware 上面指出的,这些字符在“GE Inspira”字体中不可用,正如您在下面的示例程序中看到的那样 - 因此您需要一些/ˌinəˈvāSHən/(创新)来解决这个问题; )

我可以想到几种方法:

  • 我不确定这个用于在代码中设置的 graphics.setFont(customFont); 是否只是一个测试,但通常 POI 会使用(并设置)字体,文件中指定了这一点。因此,最简单的方法是将原始文档中的字体替换为支持语音的字体(有关合适的字体,请参阅wikipedia unicode article)。顺便提一句。如果您尝试在 Libre Office 中使用该字体并插入这些语音,您也会得到“垃圾”字符。

  • 您可以使用类似 fontforge 的内容将缺少的字符从不同的字体添加到您喜欢的字体(但当然需要使用它 - 见上文)。它看起来有点奇怪,但比矩形好......

  • 您可以事先检查 text-runs are supported 中是否存在某些字符对于指定的字体,并插入一个新的文本运行元素,其中包含不支持的字符的替代字体

  • 我知道 PDF 会进行某种字体替换,以防找不到字体(甚至字符???),我还没有在 java 中找到类似的机制。简短搜索...也许还有这样的解决方案...

(使用 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 a 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 the font
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
InputStream is = new FileInputStream("src/main/resources/GEInspRg.TTF");
Font font = Font.createFont(Font.TRUETYPE_FONT, is);
is.close();
ge.registerFont(font);

is = new FileInputStream("src/main/resources/DejaVuSerif.ttf");
font = Font.createFont(Font.TRUETYPE_FONT, is);
is.close();
ge.registerFont(font);

// render it
double zoom = 2; // magnify it by 2
AffineTransform at = 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();
}
}

关于java - Unicode 字符无法从 pptx 转换为 png,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18498228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com