Как изменить размер/формат страницы, когда загрузить и существующий шаблон в JasperDesign, а затем изменить его?



Я привожу этот вопрос из этого поста. Я не был уверен, следует ли мне создавать новый вопрос, поскольку, похоже, я уже создавал новую тему? Заранее приношу извинения за это.



Итак, вот моя проблема:



Я пытаюсь динамически изменить формат моего отчета (книжного отчета с несколькими страницами, частями или вложенными отчетами). То, что я делаю, это сначала загружаю его из существующего шаблона в держатель объекта JasperDesign. Затем, изменяя размер и другие параметры самой страницы. Позже я скомпилирую и попытаюсь распечатать отчет в формате PDF с помощью скомпилированного файла. В конечном счете, я хочу напечатать отчет с разными страницами и разными шаблонами для каждой отдельной страницы с форматом, который я могу указать.



Вот что я сделал. Я смог указать основной отчет на другие форматы отдельных страниц. Поэтому, когда я экспортирую отчет в PDF, все выглядит хорошо(как вы, вероятно, думаете, что это было не так просто, чтобы попасть туда. но сейчас есть работающий). Поэтому теперь я хочу параметризовать формат (A4, LETTER и т. д.) во время выполнения для каждой отдельной страницы отчета книги.



Возможно ли это? Я имею в виду сделать это динамически вместо того, чтобы создавать новый статический шаблон для каждой страницы и формата, а затем создавать проблему обслуживания? Если да, то как это сделать?



Вот мой код для перенастройки шаблона объекта JasperDesing:



private static JasperDesign getTemplateDesign(String templatePath) throws JRException{

JasperDesign design = JRXmlLoader.load(templatePath);

logger.info("Setting Page Dimessions Format to: " + pageFormat);
if(JRDriver.pageFormat.equals("A3")){
JRDriver.pageWidth=842;
JRDriver.pageHeight=1190;
JRDriver.columnCount=1;
JRDriver.columnWidth=802;
JRDriver.columnSpacing=0;
JRDriver.leftMargin=20;
JRDriver.rightMargin=20;
JRDriver.topMargin=30;
JRDriver.bottomMargin=30;
}
else if (JRDriver.pageFormat.equals("A4")) {
JRDriver.pageWidth=842;
JRDriver.pageHeight=1190;
JRDriver.columnCount=1;
JRDriver.columnWidth=555;
JRDriver.columnSpacing=0;
JRDriver.leftMargin=20;
JRDriver.rightMargin=20;
JRDriver.topMargin=30;
JRDriver.bottomMargin=30;
}
else if (JRDriver.pageFormat.equals("LETTER")) {
JRDriver.pageWidth=612;
JRDriver.pageHeight=792;
JRDriver.columnCount=1;
JRDriver.columnWidth=517;
JRDriver.columnSpacing=0;
JRDriver.leftMargin=20;
JRDriver.rightMargin=20;
JRDriver.topMargin=30;
JRDriver.bottomMargin=30;
}
//Setting twmplate dimesions
design.setPageWidth(JRDriver.pageWidth);
design.setPageHeight(JRDriver.pageHeight);

design.setColumnCount(JRDriver.columnCount);
design.setColumnWidth(JRDriver.columnWidth);
design.setColumnSpacing(JRDriver.columnSpacing);

design.setLeftMargin(JRDriver.leftMargin);
design.setRightMargin(JRDriver.rightMargin);
design.setTopMargin(JRDriver.topMargin);
design.setBottomMargin(JRDriver.bottomMargin);

return design;
}


Вот мой фрагмент кода для генерации PDF доклад:



...



logger.info("Retrieving Design Template..." + reportTemplatePath);
JasperDesign design= getTemplateDesign(reportTemplatePath);

//jasperReport = JasperCompileManager.compileReport(reportTemplatePath);
jasperReport = JasperCompileManager.compileReport(design);

logger.info("Filling Report...");
jasperPrint = JasperFillManager.fillReport(jasperReport, jasperParameter,new JREmptyDataSource() );//new JREmptyDataSource()


jasperPrint.setPageWidth(JRDriver.pageWidth);
jasperPrint.setPageHeight(JRDriver.pageHeight);

//Create the file dir
File file = new File(reportOuputPath);
file.getParentFile().mkdirs();
//file.delete();

logger.info("Writing PDF..." + reportOuputPath);
JasperExportManager.exportReportToPdfFile(jasperPrint, reportOuputPath);


...



Я мог бы включить информацию для моих файлов статических шаблонов JRXML. Но я не думаю, что это необходимо сейчас. Это можно сделать, если вы думаете иначе



Пожалуйста, помогите мне и заранее спасибо

615   1  

1 ответ:

Здравствуйте и спасибо за быстрый ответ. Я не смог найти, как прокомментировать ваш ответ, поэтому я думаю, что мне придется включить его в этот пост.

Во-первых, вы были правы, не гарантируя изменение размера макета всей страницы, просто изменив размеры страницы de. Однако форматы, которые я менял, были очень похожи (A4 и LETTER), поэтому влияние на компоненты и размер полей perse, было не таким уж большим.

Более того, что я должен сделать, чтобы на самом деле изменить каждый индивидуальная страница формата книги, загружала каждую отдельную страницу сначала в держатель объекта JasperDesing, а затем сохраняла ее с измененным размером в поле jasper, которое будет использоваться в процессе заполнения. Вместо того, чтобы просто делать это для самой страницы книги отчетов.

Вот код:

    private static JasperDesign getPageTemplateDesign(String templatePath) throws JRException{

    logger.info("Setting format page desing for Template: " + templatePath);

    JasperDesign design = JRXmlLoader.load(templatePath);

    logger.info("Setting Page Dimessions Format to: " + pageFormat);
    if (JRDriver.pageFormat.equals("A4")) {
        JRDriver.pageWidth=595; 
        JRDriver.pageHeight=842;
        JRDriver.columnCount=1;
        JRDriver.columnWidth=555;
        JRDriver.columnSpacing=0;
        JRDriver.leftMargin=20;
        JRDriver.rightMargin=20;
        JRDriver.topMargin=20;
        JRDriver.bottomMargin=20;
    }
    else if (JRDriver.pageFormat.equals("LETTER")) {
        JRDriver.pageWidth=612; 
        JRDriver.pageHeight=792;
        JRDriver.columnCount=1;
        JRDriver.columnWidth=517;
        JRDriver.columnSpacing=0;
        JRDriver.leftMargin=20;
        JRDriver.rightMargin=20;
        JRDriver.topMargin=20;
        JRDriver.bottomMargin=20;
    }
    //Setting twmplate dimesions
    design.setPageWidth(JRDriver.pageWidth);
    design.setPageHeight(JRDriver.pageHeight);

    design.setColumnCount(JRDriver.columnCount);
    design.setColumnWidth(JRDriver.columnWidth);
    design.setColumnSpacing(JRDriver.columnSpacing);

    design.setLeftMargin(JRDriver.leftMargin);
    design.setRightMargin(JRDriver.rightMargin);
    design.setTopMargin(JRDriver.topMargin);
    design.setBottomMargin(JRDriver.bottomMargin);      

    return design;
}

private static void reformattingPageTemplate(String path) throws JRException{

    logger.info("Getting Design Template from: " + path);
    JasperDesign design= getPageTemplateDesign(path);

    String destFile=path.replaceAll("jrxml", "jasper");     
    logger.info("Compiling Re-formated Design Template to: " + destFile);
    JasperCompileManager.compileReportToFile(design, destFile); 
}

private static void formattingALLPage() throws JRException{

    reformattingPageTemplate(reportBookPagesDir + "/FrontCover.jrxml");
    reformattingPageTemplate(reportBookPagesDir + "/Copyright.jrxml");
    reformattingPageTemplate(reportBookPagesDir + "/TableOfContent.jrxml");
    reformattingPageTemplate(reportBookPagesDir + "/Summary.jrxml");
    reformattingPageTemplate(reportBookPagesDir + "/Content.jrxml");
    reformattingPageTemplate(reportBookPagesDir + "/AppendixWarnings.jrxml");
    reformattingPageTemplate(reportBookPagesDir + "/Index.jrxml");
    reformattingPageTemplate(reportBookPagesDir + "/BackCover.jrxml");
    //reformattingPageTemplate(reportTemplatePath);
}

Спасибо за помощь

Comments

    Ничего не найдено.