2016-09-03 4 views
1

В моем vaadin приложение У меня есть Table с дополнительной колонкой, содержащей отпечаток Button. Button вызывает следующий метод Util, чтобы создать PDF и открыть его в новом окне (ui параметр кнопка):Как открыть сгенерированный PDF-файл в ваадине?

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() и просто открыть новое окно. Как я могу это сделать?

EDIT: Это блокирует кнопку открытия экземпляров mulitple, но не является хорошим решением, и первый щелчок не работает.

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_"); 

Здесь я получаю следующее сообщение об ошибке:

Button (175) did not handle connector request for print/2016_9090_R_1634500091131558445.pdf

+0

Вам нужно добавить расширение BrowserWindowOpener до нажатия кнопки в первый раз. Это не должно быть проблемой с производительностью, так как кнопки будут созданы в любом случае. Мне интересно, если кто-то знает ответ на ваш вопрос в контексте контекстного меню. –

+0

Нашел старый [вопрос] (http://stackoverflow.com/questions/26211489/open-pdf-file-from-menubar-using-vaadin). Кажется, это решение открыть файл в новом окне браузера в целом. –

+0

Если я использую 'ResourceReference', передавая эту кнопку в качестве второго параметра, я получаю следующую ошибку:' Button (175) не обрабатывал запрос коннектора для печати/2016_9090_R_1634500091131558445.pdf' –

ответ

1

Вы можете использовать FileDownloader, чтобы достичь того, чего вы хотите.

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

Если вам нужен код, который будет вызывать, когда пользователь нажимает кнопку, вам нужно создать свой собственный класс, который реализует StreamSource вместо использования FileResource. Вот как я это делал раньше. –

+0

Та же проблема, что и при использовании 'BrowserWindow'. Я бы предпочел не подключать открытый ресурс с компонентом пользовательского интерфейса. –

+0

Если вы создаете класс, который реализует StreamSource, ему не нужно открывать какие-либо ресурсы до тех пор, пока не будет вызван метод getStream(). Это было требование, которое я имел. Я хотел загрузить XML-документ на основе полей на экране. –

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); 
+0

'Embedded.TYPE_BROWSER' устарел в vaadin 7.x« Начиная с версии 7.0 вместо этого используйте компонент {@link BrowserFrame} ». Я бы предпочел решение, в котором откроется новое окно, но в конце концов это может быть решение. –