所以我有一个我正在研究的webapp。它运行在java / MVC patter / MYsql / scala / play框架上。
我希望找到一种基于WEBAPP上的报告使用itext生成pdf文档的方法,所以基本上我们需要添加一个"打印按钮"在报告页面上,将信息提取为PDF。
谢谢
答案 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解决方案,但目标是向您展示概念,而不是为您提供可以复制/粘贴的代码。