0

我正在尝试使用 iText 库将 JUNG 网络输出到 PDF。

许多解决方案似乎在使用库捕获屏幕并将其输出为某种格式(例如 EPS)之前在框架中显示图形。但是,我的应用程序会自动构建许多网络并输出它们,因此在保存到文件之前在屏幕上显示每个网络并不是一个很好的解决方案。

我已经进行了一些搜索,但并没有完全找到我在做什么。将图形输出到 PNG 似乎很简单(请参阅此处),但 PNG 的质量不适合我的需要。

我当前的代码如下,基于将图表从 JFreeChart 写入 PDF(参见此处)。我正在尝试获取一个 Graphics2D 对象,我可以将图形“绘制”到该对象上,然后输出到 PDF。此代码生成空指针异常,因为从 visualise.getGraphics() 返回的图形对象为空。

任何建议、代码片段或在线示例将不胜感激。

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();
}
4

1 回答 1

0

约书亚提供的答案是正确的。我想我永远不会搜索无头的!

我不得不稍微修改http://sourceforge.net/projects/jung/forums/forum/252062/topic/1407188的代码,因为我发现从 BufferedImage 创建 Graphics2D 对象是不合适的。相反,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();

}
于 2012-05-16T08:58:46.880 回答