В focframework, как я могу сделать кнопку, которая печатает несколько отчетов Jasper, соединенных вместе в одном отпечатке - PullRequest
0 голосов
/ 09 октября 2018

Я использую focframework для создания своего веб-приложения.У меня уже есть несколько независимых отчетов Jasper, которые были разработаны и работают в focframework независимо друг от друга.Теперь я хочу иметь кнопку, которая позволяет печатать их все вместе в одном кадре, объединяя их в одном файле PDF.

Очевидно, я бы использовал Vaadin BrowserWindowOpener следующим образом.Но тогда я должен подготовить объект ресурса.

StreamResource resource = ???;
BrowserWindowOpener browserWindowOpener = new BrowserWindowOpener(resource);
browserWindowOpener.extend(button);

Есть идеи, как разместить объединение отчетов Jasper в объекте StreamResource?

Я знаю, что есть некоторые ответы, объясняющие, каксделать это в целом, но так как я использую focframework , я хотел получить более целенаправленный ответ, позволяющий мне использовать существующую разработку foc, если таковая имеется.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Как вы упомянули в своем вопросе, использование 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
    }
};
0 голосов
/ 09 октября 2018

То, что вы не можете сделать, это просто объединить все байты различных файлов один за другим.

В Jasper Reports есть опции для вложения различных отчетов друг в друга.Возможно, просто создаст большой отчет с несколькими отчетами внутри.

Это позволит вам контролировать разрывы страниц, стиль и т. Д. Внутри Jasper

...