如何使用java MVC模式中的itext生成PDF文档

时间:2015-02-11 19:25:34

标签: java scala pdf model-view-controller itext

所以我有一个我正在研究的webapp。它运行在java / MVC patter / MYsql / scala / play框架上。

我希望找到一种基于WEBAPP上的报告使用itext生成pdf文档的方法,所以基本上我们需要添加一个"打印按钮"在报告页面上,将信息提取为PDF。

谢谢

1 个答案:

答案 0 :(得分:1)

如果没有给你实际的代码,我会就你如何做到这一点给你一个方法。

如果我们假设您有某种结构化数据,例如您要打印的项目列表,则可以使用visitor模式。

您希望它执行的操作是您要打印的每种类型的项目都有一个visit(...)方法。

例如,如果您有2个类:

public class Foo {
    ...
    public int foo;
    ...
}

public class Bar {
    ...
    public boolean bar;
    ...
}

然后你可以让你的PDF访问者看起来像这样:

public class MyPDFVisitor {
    ...
    public void visit(Foo foo) {
        ...
        // do something with foo.foo
        ...
    }

    public void visit(Bar bar) {
        ...
        // do something with Bar.bar
        ...
    }
}

现在,我发现您要使用iText。那么,您可以添加到MyPDFVisitor类以支持它的内容是这样的:

public class MyPDFVisitor {
    public MyPDFVisitor() {
        this.document = new Document(PageSize.A4);
        this.outputStream = new ByteArrayOutputStream();

        try {
            this.pdfWriter = PdfWriter.getInstance(this.document, this.outputStream);
        } catch (DocumentException e) {
            e.printStackTrace();
        }

        this.document.open();
    }

    private void addDocumentName(String description) throws DocumentException {
        Paragraph preface = new Paragraph();
        preface.setAlignment(ElementTags.ALIGN_CENTER);
        addEmptyLine(preface, 1);
        preface.add(new Paragraph(new Chunk(description, getTitleFont())));
        addEmptyLine(preface, 2);
        document.add(preface);
    }

    private void addEmptyLine(Paragraph paragraph, int number) {
        for (int i = 0; i < number; i++) {
            paragraph.add(new Paragraph(" "));
        }
    }

    public void visit(Foo foo) {
        Integer fooValue = foo.foo;
        write(fooValue.toString(), Color.GREEN);
    }

    public void visit(Bar bar) {
        Boolean barValue = bar.bar;
        write(barValue.toString(), Color.RED);
    }

    public void write(String text, Color color) {
        // do the actual write to document here
    }

    public InputStream getInputStream() {
        try {
            // you can do some final actions here, before closing the writing to the document

            this.document.close();
        } catch (DocumentException e) {
            e.printStackTrace();
        }

        ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
        return inputStream;
    }

}

请不要将此与生产代码混淆。我刚刚给你一个例子,说明如何处理问题并从那里解决问题。

免责声明:显然,这是一个Java解决方案,但目标是向您展示概念,而不是为您提供可以复制/粘贴的代码。