Итак, я пытаюсь разместить довольно сложный узел JavaFX в виде древовидной диаграммы на PDF-файл с помощью Apache PDF Box. Однако из-за проблем с разрешением я не хочу растрировать диаграмму, сначала создавая изображение или делая снимок. При первой попытке с более простой гистограммой мне удалось добиться этого, но только потому, что я вручную нарисовал всю гистограмму на объекте PDFBoxGraphics2D (см. фрагмент кода), а затем смог поместить ее в PDF с помощью Apache PDF Box. и это сработало нормально.
Код: Выделить всё
public void drawHistogram(PdfBoxGraphics2D g2d, double width, double height) {
g2d.clearRect(0, 0, (int) width, (int) height);
double scaleX = width / (counts.size() * BAR_WIDTH + 10);
double scaleY = height / (dimHeight + 100);
int x = 10;
for (Map.Entry entry : counts.entrySet()) {
int barHeight = entry.getValue() * INCREMENT;
int y = horizon - barHeight;
int scaledBarWidth = (int) (BAR_WIDTH * scaleX);
int scaledX = (int) (x * scaleX);
int scaledY = (int) (y * scaleY);
int scaledBarHeight = (int) (barHeight * scaleY);
g2d.setColor(java.awt.Color.CYAN);
g2d.fillRect(scaledX, scaledY, scaledBarWidth - 10, scaledBarHeight);
g2d.setColor(java.awt.Color.BLACK);
g2d.drawString(entry.getKey() + " chars", scaledX, (int) (horizon * scaleY) + 10);
g2d.drawString(entry.getValue() + " times", scaledX, scaledY - 2);
x += BAR_WIDTH;
}
}
Приведенный пример кажется очень простым, единственная проблема в том, что я не могу найти ничего, что могло бы помочь с преобразованием узла в SVG. Эта библиотека https://github.com/hervegirod/fxsvgimage показалась очень многообещающей, поскольку они прямо заявляют, что «она также позволяет конвертировать дерево узлов JavaFX в файл SVG», однако, похоже, существует ошибка, связанная с этим конкретным преобразованием в момент. Теоретически, я думаю, это могло бы работать так:
Код: Выделить всё
// get treeChart
Node node = treeChart.getChart().getContent();
double contentWidth = node.getBoundsInParent().getWidth() + ADDITIONAL_WIDTH;
double contentHeight = node.getBoundsInParent().getHeight() + ADDITIONAL_HEIGHT;
// taken from example usage of the converter from https://github.com/hervegirod/fxsvgimage
ConverterParameters params = new ConverterParameters();
params.width = contentWidth;
params.height = contentHeight;
SVGConverter converter = new SVGConverter();
// Perform the conversion
File svgFile = new File("mysample.svg");
try {
converter.convert(node, svgFile, params);
System.out.println("SVG file created: " + svgFile.getAbsolutePath());
} catch (Exception e) {
e.printStackTrace();
}
//create PDF document object
try (PDDocument document = new PDDocument()) {
PDPage page = new PDPage(PDRectangle.A4);
document.addPage(page);
// idea how to get svg onto pdf from here https://stackoverflow.com/questions/31718075/drawing-vector-images-on-pdf-with-pdfbox
URI uri = svgFile.toURI();
SVGUniverse svgUniverse = new SVGUniverse();
SVGDiagram diagram = svgUniverse.getDiagram(svgUniverse.loadSVG(uri.toURL()));
// Create a PDFGraphics2D object
PdfBoxGraphics2D graphics2D = new PdfBoxGraphics2D(document, (int) contentWidth, (int) contentHeight);
// Render the JavaFX node onto the PDFGraphics2D object
try {
diagram.render(graphics2D);
} finally {
graphics2D.dispose();
}
// Get XObjects
PDFormXObject xform = graphics2D.getXFormObject();
PDPageContentStream contentStream = new PDPageContentStream(document, page);
Matrix matrix = new Matrix();
matrix.translate(0, 20);
contentStream.transform(matrix);
// Draw the form
contentStream.drawForm(xform);
contentStream.close();
// Save the document
document.save(new File("mysample.pdf"));
document.close();
Кто-нибудь знает другую библиотеку, которая могла бы преобразовать узел в файл SVG? Или, может быть, у кого-то есть совершенно другое представление о том, как отобразить мой узел в PDF-файле. Возможно, SVG все-таки не нужен...
Подробнее здесь: https://stackoverflow.com/questions/787 ... -using-svg