Hi!
I am trying to generate an SVG file that includes a few Greek letters /
math symbols, but I'm only getting '? (question marks) for those; the rest
of the text is produced OK.
Here is a minimal code sample: the first example, using a rasterized
Graphics2D, has no issue displaying and saving the letters/symbols. The
second example, using Batik's SVGGraphics2D, is the one that can't display
Greek letters / math symbols:
// % java --version
// openjdk version "23.0.2" 2025-01-21
// OpenJDK Runtime Environment (build 23.0.2+7-58)
// OpenJDK 64-Bit Server VM (build 23.0.2+7-58, mixed mode, sharing)
// pom.xml:
// ...
// <dependency>
// <groupId>org.apache.xmlgraphics</groupId>
// <artifactId>batik-all</artifactId>
// <version>1.18</version><!-- Oct 09, 2024 -->
// <exclusions>
// <exclusion>
// <groupId>xml-apis</groupId>
// <artifactId>xml-apis</artifactId>
// </exclusion>
// </exclusions>
// </dependency>
// ...
public static void main(final String [] ARG) {
try {
graphics2DExample();
System.out.println("graphics2DExample() completes OK.");
} catch (Exception e) {
System.out.println("graphics2DExample() aborted with exception: " +
e.getMessage()
+ ".");
}
try {
batikExample();
System.out.println("batikExample() completes OK.");
} catch (SVGGraphics2DIOException e) {
System.out.println("batikExample() aborted with exception: " + e.getMessage()
+ ".");
}
}// main
static void graphics2DExample() throws IOException {
BufferedImage bufferedImage = new BufferedImage(300, 300, BufferedImage.
TYPE_INT_ARGB);
Graphics2D graphics2D = bufferedImage.createGraphics();
String fontName = "DejaVu Math TeX Gyre";
Font dejaVu = new Font(fontName, Font.PLAIN, 24);
graphics2D.setFont(dejaVu);
graphics2D.setColor(Color.black);
graphics2D.drawString("∑ (Σ) - Summation", 10, 30);
graphics2D.drawString("∫ - Integral", 10, 60);
graphics2D.drawString("π (pi) - Pi", 10, 90);
graphics2D.drawString("√ - Square root", 10, 120);
graphics2D.drawString("∞ - Infinity", 10, 150);
File pngfile = new File("math_symbols.png");
ImageIO.write(bufferedImage, "png", pngfile);
}// graphics2DExample
static void batikExample() throws SVGGraphics2DIOException {
DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation();
String svgNS = "http://www.w3.org/2000/svg";
Document document = domImpl.createDocument(svgNS, "svg", null);
SVGGraphics2D graphics2D = new SVGGraphics2D(document);
graphics2D.setSVGCanvasSize(new Dimension(300, 300));
String fontName = "DejaVu Math TeX Gyre";
Font dejaVu = new Font(fontName, Font.PLAIN, 24);
graphics2D.setFont(dejaVu);
graphics2D.setColor(Color.black);
graphics2D.drawString("∑ (Σ) - Summation", 10, 30);
graphics2D.drawString("∫ - Integral", 10, 60);
graphics2D.drawString("π (pi) - Pi", 10, 90);
graphics2D.drawString("√ - Square root", 10, 120);
graphics2D.drawString("∞ - Infinity", 10, 150);
String svgfile = "math_symbols.svg";
graphics2D.stream(svgfile);
}// batikExample
Both examples complete OK. Here are their outputs: (attached).
What am I missing in the Batik code? I've tried several other fonts and
quite a few other (supported) characters from several Unicode planes,
and the results are always the same: Batik displays '?' instead of the
expected symbols. I'm in an Ubuntu 24.04 system, if that matters.
Any help much appreciated. Thanks in advance!
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]