Вывести визуализацию JUNG в PDF с помощью iText

Я пытаюсь вывести сеть JUNG в PDF, используя библиотеку iText.

Многие решения, кажется, отображают график в кадре, прежде чем использовать библиотеку для захвата экрана и вывода его в некоторый формат, такой как EPS. Однако мое приложение автоматически построит множество сетей и выведет их, поэтому отображение каждой сети на экране перед сохранением в файл не является хорошим решением.

Я провел некоторые поиски и не могу точно понять, что я делаю. Кажется простым выводить график в PNG (см. Здесь), но качество PNG не подходит для моих нужд.

Мой текущий код приведен ниже и основан на записи диаграмм из JFreeChart в PDF (см. Здесь). Я пытаюсь получить объект Graphics2D, на который я могу "нарисовать" график и затем вывести в PDF. Этот код генерирует исключение нулевого указателя, так как графический объект, возвращаемый из visualise.getGraphics(), имеет значение null.

Будем благодарны за любые советы, фрагменты кода или онлайн-примеры.

public void write() throws IOException, DocumentException {

    // Open the PDF file for writing
    this.document = new Document();
    this.writer = PdfWriter.getInstance(this.document, new FileOutputStream(this.fileName));
    document.open();
    PdfContentByte contentByte = writer.getDirectContent();
    PdfTemplate template = contentByte.createTemplate(WIDTH, HEIGHT);
    //Graphics2D graphics2d = template.createGraphics(WIDTH, HEIGHT, new DefaultFontMapper());

    // Apply a layout to the graph
    Layout<Vertex, Edge> layout = new CircleLayout<Vertex, Edge>(this.network);
    layout.setSize(new Dimension(WIDTH, HEIGHT));

    // Draw on the graphics 2D object
    VisualizationImageServer<Vertex, Edge> visualise = new VisualizationImageServer<Vertex, Edge>(layout, new Dimension(WIDTH, HEIGHT));
    visualise.setPreferredSize(new Dimension(WIDTH + 50, HEIGHT + 50));
    visualise.setDoubleBuffered(false);
    Graphics2D graphics2d = (Graphics2D) visualise.getGraphics();
    visualise.paintComponents(graphics2d);

    graphics2d.dispose();
    contentByte.addTemplate(template, 0, 0);

    this.document.close();
}

1 ответ

Ответ, предоставленный Иисусом, правильный. Я думаю, я бы никогда не искал безголовых!

Мне пришлось немного изменить код по адресу http://sourceforge.net/projects/jung/forums/forum/252062/topic/1407188 как я обнаружил, что создание объекта Graphics2D из BufferedImage не подходит. Вместо этого Graphics2D должен быть сделан из PDFTemplate. Для дальнейшего использования я разместил свой рабочий код.

public void write() throws IOException, DocumentException {

    // Open the PDF file for writing - and create a Graphics2D object
    this.document = new Document();
    this.writer = PdfWriter.getInstance(this.document, new FileOutputStream(this.fileName));
    document.open();
    PdfContentByte contentByte = writer.getDirectContent();
    PdfTemplate template = contentByte.createTemplate(WIDTH, HEIGHT);
    Graphics2D graphics2d = template.createGraphics(WIDTH, HEIGHT, new DefaultFontMapper());

    // Apply a layout to the graph
    Layout<Vertex, Edge> layout = new CircleLayout<Vertex, Edge>(this.network);
    layout.setSize(new Dimension(WIDTH / 2, HEIGHT / 2));

    // Create a visualisation object - set background color etc
    VisualizationViewer<Vertex, Edge> visualise = new VisualizationViewer<Vertex, Edge>(layout, new Dimension(WIDTH, HEIGHT));
    visualise.setSize(WIDTH, HEIGHT);
    visualise.setBackground(Color.WHITE);

    // Create a container to hold the visualisation
    Container container = new Container();
    container.addNotify();
    container.add(visualise);
    container.setVisible(true);
    container.paintComponents(graphics2d);

    // Dispose of the graphics and close the document
    graphics2d.dispose();
    contentByte.addTemplate(template, 0, 0);
    this.document.close();

}
Другие вопросы по тегам