Решение от Ollie Glass перестало работать, потому что конструктор PApplet/Applet
проверяет, является ли среда безголовой или нет, то есть -Djava.awt.headless=true
.
Таким образом, нет никакого способасначала создайте объект PApplet.
Вместо этого создайте PGraphics
напрямую.Например, чтобы нарисовать все в pdf
PGraphics pdf = new PGraphicsPDF();
pdf.setPrimary(false);
pdf.setPath(filename);
pdf.setSize(sizeX, sizeY);
// pdf.setParent(new PApplet()); This is intentionally NOT called.
pdf.beginDraw();
// draw everything
pdf.dispose();
pdf.endDraw();
Добавление текста все равно вызовет исключение, поскольку базовый PGraphics
вызывает его parent
(PApplet
) для некоторых вспомогательных методов.Тем не менее, это не было установлено, потому что мы не имеем права создавать * 1016. * во-первых.
Решение состоит в том, чтобы избавиться от этих вызовов функций, создав собственную версию PGraphicsPDF
.Например,
class MyPGraphicsPDF extends PGraphicsPDF{
@Override
public float textAscent() {
if (textFont == null) {
defaultFontOrDeath("textAscent");
}
Font font = (Font) textFont.getNative();
//if (font != null && (textFont.isStream() || hints[ENABLE_NATIVE_FONTS])) {
if (font != null) {
FontMetrics metrics = this.getFontMetrics(font);
return metrics.getAscent();
}
return super.textAscent();
}
@Override
public float textDescent() {
if (textFont == null) {
defaultFontOrDeath("textDescent");
}
Font font = (Font) textFont.getNative();
//if (font != null && (textFont.isStream() || hints[ENABLE_NATIVE_FONTS])) {
if (font != null) {
FontMetrics metrics = this.getFontMetrics(font);
return metrics.getDescent();
}
return super.textDescent();
}
public FontMetrics getFontMetrics(Font font) {
FontManager fm = FontManagerFactory.getInstance();
return sun.font.FontDesignMetrics.getMetrics(font);
}
}
textAscent()
и textDescent()
являются копиями кода из PGraphics
с изменением не вызывать getFontMetrics(Font font)
из несуществующего parent
PApplet
.Вместо этого оба перенаправляют на третий метод, который переопределяет отсутствующий вспомогательный метод PApplet
как немного более короткую версию java.awt.Component.getFontMetrics(Font font)
.
Надеюсь, это поможет.
Было бы неплохо иметь нативныйбезголовая версия обработки при явном вызове файла как чертежной доски.