在我的 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
答案 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);