Как вы упомянули в своем вопросе, использование BrowserWindowOpener выглядит правильно.
StreamResource resource = ???;
BrowserWindowOpener browserWindowOpener = new BrowserWindowOpener(resource);
browserWindowOpener.extend(button);
Чтобы получить «ресурс StreamResource», мы можем сделать следующее:
StreamResource resource = new StreamResource(streamSource, "printnig_"+System.currentTimeMillis()+".pdf");
resource.setMIMEType("application/pdf");
Сейчаснам нужен streamSource типа com.vaadin.server.StreamSource.Чтобы получить, что у нас есть специальный класс, который объединяет отчеты, я надеюсь, что это отвечает вашим потребностям:
FStreamSource_Report<MyUserDataClass> streamSource = new FStreamSource_Report<MyUserDataClass>(myUserDataClassInstance) {
protected void init(int reportIndex){
//init to print the report at reportIndex.
}
protected void shut(int reportIndex){
//dispose the necessary data for reportIndex
}
protected boolean next(int reportIndex){
//Return true if you have a report to print at reportIndex
}
protected String getReportFileName(int reportIndex){
//Return the report filename at reportIndex
}
protected JRFocObjectParameters getParams(int reportIndex){
//Return the JRFocObjectParameters needed for reportIndex
}
protected JRFocListDataSource getDataSource(int reportIndex){
//Return the Jasper/foc Data source for the Jasper details section at reportIndex
}
Вам, очевидно, придется реализовать различные методы, перечисленные выше.Эти вызовы метода сообщат FStreamSource_Report, сколько у него базовых отчетов, и они будут вызываться каждый раз для подготовки данных для этих отчетов.
MyUserDataClass: это класс по вашему выбору, который будет вам доступен внутри различныхреализация метода с использованием getUserData ();
Вот пример: FStreamSource_Report streamSource = new FStreamSource_Report (prodProgram) {
private PrintingAction printingAction = null;
@Override
protected void init(int reportIndex) {
if(reportIndex == 0){//Raw Material printout
ProductionProgram productionProgram = getUserData();
printingAction = RawMaterialReportDesc.getInstance().newPrintingAction();
printingAction.setObjectToPrint(productionProgram);
printingAction.initLauncher();
}else if(reportIndex == 1){//Production Steps
ProductionProgram productionProgram = getUserData();
printingAction = ProductionStepsReportDesc.getInstance().newPrintingAction();
printingAction.setObjectToPrint(productionProgram);
printingAction.initLauncher();
}else if(reportIndex == 2){//Production Steps
ProductionProgram productionProgram = getUserData();
printingAction = FinishedProductsReportDesc.getInstance().newPrintingAction();
printingAction.setObjectToPrint(productionProgram);
printingAction.initLauncher();
}
}
@Override
protected void shut(int reportIndex) {
if(printingAction != null){
printingAction.dispose();
}
}
@Override
protected String getReportFileName(int reportIndex) {
String fileName = null;
PrnContext prnContext = ReportFactory.getInstance().findContext("PRODUCTION_CONTEXT");
if (prnContext != null) {
PrnLayout prnLayout = null;
if(reportIndex == 0) {
prnLayout = prnContext.getLayoutByName("RAW_MATERIAL");
}else if(reportIndex == 1) {
prnLayout = prnContext.getLayoutByName("STEPS");
}else if(reportIndex == 2) {
prnLayout = prnContext.getLayoutByName("FINISHED_PRODUCTS");
}
if (prnLayout != null) {
fileName = printingAction != null ?
printingAction.getLauncher().getReportFileName(prnLayout) : null;
}
}
return fileName;
}
@Override
protected JRFocObjectParameters getParams(int reportIndex) {
JRFocObjectParameters params = null;
if(reportIndex == 0 || reportIndex == 1 || reportIndex == 2){
//I am using the same header FocObject for all 3 reports
ProductionProgram productionProgram = getUserData();
params = new JRFocObjectParameters(productionProgram);
}
}
@Override
protected JRFocListDataSource getDataSource(int reportIndex) {
JRFocListDataSource source = null;
if(reportIndex == 0){//Raw material
ProductionProgram productionProgram = getUserData();
source = new JRFocListDataSource(productionProgram.getRawMaterialFocList());
}else if(reportIndex == 1){//Production Steps
ProductionProgram productionProgram = getUserData();
source = new JRFocListDataSource(productionProgram.getProductionStepsFocList());
}else if(reportIndex == 2){//Production Steps
ProductionProgram productionProgram = getUserData();
source = new JRFocListDataSource(productionProgram.getFinishedGoodsFocList());
}
return source;
}
@Override
protected boolean next(int reportIndex) {
return reportIndex <= 2;//Because we have 3 printouts 1,2,3
}
};