如何在vaadin中打开生成的PDF?

时间:2016-09-03 10:52:29

标签: java vaadin vaadin7

在我的 vaadin 应用程序中,我有一个Table,其中包含一个包含打印Button的其他列。 Button调用以下util方法创建pdf并在新窗口中打开它(ui参数是按钮):

public static void printPDF(Offer offer, AbstractComponent ui) throws IOException, DocumentException, TemplateException {
    // ... create PDF 

    FileResource resource = new FileResource(pdfFile);

    BrowserWindowOpener opener = new BrowserWindowOpener(resource);
    opener.setFeatures("");
    opener.extend(ui);
}

现在第一次点击按钮不起作用。第二次单击它可以工作。第三次单击它,打开两个窗口。每增加一次点击就会增加。

我还想使用上下文菜单打开pdf,例如

table.addActionHandler(new Handler()...

我甚至没有按钮可以延长。我更愿意,不使用.extend()部分,只需打开一个新窗口。我怎么能这样做?

编辑:这会阻止按钮打开多个实例,仍然不是一个好的解决方案,第一次点击不起作用。

Collection<Extension> extensions = ui.getExtensions();
for (Extension e : extensions) {
    if (e instanceof BrowserWindowOpener) {
        ((BrowserWindowOpener) e).setResource(resource);
        return;
    }
}

我想我需要为BrowserWindowOpener中的每个打印Button创建Table
这个表不是一个非常干净的解决方案,可能包含很多行,这些行会创建许多永远不会被使用的BrowserWindowOpener个实例。上下文菜单问题也无法解决。

EDIT2:这是我尝试过的另一个解决方案:

ResourceReference rr = ResourceReference.create(resource, ui, "print");
Page.getCurrent().open(rr.getURL(), "blank_");

这里我收到以下错误:

  

按钮(175)未处理连接器请求    打印/ 2016_9090_R_1634500091131558445.pdf

2 个答案:

答案 0 :(得分:1)

您可以使用FileDownloader来实现您的目标。

FileResource resource = new FileResource(pdfFile);
FileDownloader downloader = new FileDownloader(resource);
Button pdf= new Button("Download PDF");
downloader.extend(pdf);

答案 1 :(得分:1)

使用此代码

    Window window = new Window();
((VerticalLayout) window.getContent()).setSizeFull();
window.setResizable(true);
window.setCaption("Exemplo PDF");
window.setWidth("800");
window.setHeight("600");
window.center();
StreamSource s = new StreamResource.StreamSource() {

@Override
public InputStream getStream() {
try {
File f = new File("C:/themes/repy.pdf");
FileInputStream fis = new FileInputStream(f);
return fis;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
};

StreamResource r = new StreamResource(s, "repy.pdf", mainLayout.getApplication());
Embedded e = new Embedded();
e.setSizeFull();
e.setType(Embedded.TYPE_BROWSER);
r.setMIMEType("application/pdf");

e.setSource(r);
window.addComponent(e);
getMainWindow().addWindow(window);