Как объединить два pdf-документа в один отчет в JasperReports?

Я новичок в JasperReports. Я могу создать простой документ PDF с источником данных Javabean. В моем проекте я создал два отдельных документа PDF с отдельным источником данных javabean. Теперь я хочу объединить оба документа в один документ. Может ли кто-нибудь сказать мне, как объединить оба документа в один документ с помощью JasperReports?


person Kumar    schedule 19.04.2010    source источник


Ответы (5)


к сожалению, решение состоит в том, чтобы создать дополнительный отчет и использовать 2 разных источника данных или любое другое соединение, которое вы когда-либо использовали.

но есть простой способ справиться с этим вопросом :D просто никаких новых отчетов ..... Вуаля

хорошо давай сделаем это

JasperPrint jp1 = JasperFillManager.fillReport(url.openStream(), parameters,
                    new JRBeanCollectionDataSource(inspBean));
JasperPrint jp2 = JasperFillManager.fillReport(url.openStream(), parameters,
                    new JRBeanCollectionDataSource(inspBean));

Хорошо, у нас есть более 2 записей. Давайте возьмем нашу первую запись jp1 и добавим в нее содержимое jp2.

List pages = jp2 .getPages();
for (int j = 0; j < pages.size(); j++) {
    JRPrintPage object = (JRPrintPage)pages.get(j);
    jp1.addPage(object);

}
JasperViewer.viewReport(jp1,false);

Это работает как шарм .. с помощью нескольких циклов вы можете объединить любое количество отчетов вместе .. без создания новых отчетов

http://lnhomez.blogspot.com/2011/11/merge-multiple-jasper-reports-in-to.html

person Lahiru Nirmal    schedule 26.11.2011
comment
+1 Простое и элегантное решение после того, как я застрял в подотчетах, панорамирующих друг друга и еще много чего. - person Smig; 20.03.2013
comment
Это хорошее решение (спасибо, Лахиру), поскольку у нас есть требование, при котором клиентам должны отправляться уведомления на двух разных языках, и клиент может выбрать либо оба, либо один язык. То, что предложил @lahiru, идеально подходит для нашей корзины. - person Anand; 01.10.2013
comment
Я думаю, что это может быть решением и для приведенной ниже проблемы. ="как я могу иметь несколько источников данных jrbeancollection в jasperfillmanager fillrepo"> stackoverflow.com/questions/29974890/ - person prime; 30.04.2015
comment
Красиво, а про количество страниц или оглавление? Можно ли будет наполнить нужным контентом? - person kavain; 20.10.2015

Для этого можно использовать подотчеты. Вам не нужно заново создавать текущие отчеты. Создайте основной отчет с нулевыми полями. Добавьте все свои отчеты к этому в качестве подотчета и поставьте условие, что если источник данных доступен для этого, только затем распечатайте этот отчет. Теперь поместите все свои отдельные источники данных в один источник данных карты и передайте этот источник данных в основной отчет. Настройте все подотчеты на ключ на карте.

person Milind    schedule 20.10.2010
comment
Это возможно, только если у вас есть фиксированное количество вложенных отчетов, если вам нужно динамически добавлять вложенные отчеты в отчеты, это не вариант. - person Wanny Miarelli; 05.11.2019

Несколько страниц в одном JasperPrint

Образец кода:

DefaultTableModel dtm = new DefaultTableModel(new Object[0][3], new String[]{"Id","Name","Family"});
String[] fields= new String[3];    
boolean firstFlag=true;
JasperPrint jp1 =null;
JasperPrint jp2 =null;
for (int i=0 ; i<=pagesCount ; i++)
{
   fields[0]= "id";
   fields[1]= "name";
   fields[2]= "family";
   dtm.insertRow(0, fields); 
   try
   {
      Map<String, Object> params = new HashMap<String, Object>();                
      if (firstFlag)
      {
         jp1 = JasperFillManager.fillReport(getClass().getResourceAsStream(reportsource), params, new JRTableModelDataSource(dtm));                
         firstFlag=false;                            
      }else
      {
         jp2 = JasperFillManager.fillReport(getClass().getResourceAsStream(reportsource), params, new JRTableModelDataSource(dtm));
         jp1.addPage(jp2.getPages().get(0));
      }     
   }catch (Exception e) 
   {
      System.out.println(e.fillInStackTrace().getMessage());
   }
}
JasperViewer.viewReport(jp1,false);
person AhmadReza A    schedule 22.01.2018

Ответ Лахиру Нирмал был прост и по существу. Вот несколько расширенная версия, которая также копирует стили и другие вещи (не все из которых, я уверен, имеют решающее значение).

Обратите внимание, что все страницы имеют одинаковый размер.

public static JasperPrint createJasperReport(String name, JasperPrint pattern)
{
    JasperPrint newPrint = new JasperPrint();
    newPrint.setBottomMargin(pattern.getBottomMargin());
    newPrint.setLeftMargin(pattern.getLeftMargin());
    newPrint.setTopMargin(pattern.getTopMargin());
    newPrint.setRightMargin(pattern.getRightMargin());
    newPrint.setLocaleCode(pattern.getLocaleCode());
    newPrint.setName(name);
    newPrint.setOrientation(pattern.getOrientationValue());
    newPrint.setPageHeight(pattern.getPageHeight());
    newPrint.setPageWidth(pattern.getPageWidth());
    newPrint.setTimeZoneId(pattern.getTimeZoneId());

    return newPrint;
}

public static void addJasperPrint(JasperPrint base, JasperPrint add)
{
    for (JRStyle style : add.getStyles())
    {
        String styleName = style.getName();
        if (!base.getStylesMap().containsKey(styleName))
        {
            try
            {
                base.addStyle(style);
            }
            catch (JRException e)
            {
                logger.log(Level.WARNING, "Couldn't add a style", e);
            }
        }
        else
            logger.log(Level.FINE, "Dropping duplicate style: " + styleName);
    }

    for (JRPrintPage page : add.getPages())
        base.addPage(page);

    if (add.hasProperties())
    {
        JRPropertiesMap propMap = add.getPropertiesMap();
        for (String propName : propMap.getPropertyNames())
        {
            String propValue = propMap.getProperty(propName);
            base.setProperty(propName, propValue);
        }
    }

    if (add.hasParts())
    {
        PrintParts parts = add.getParts();
        Iterator<Entry<Integer, PrintPart>> partsIterator = parts.partsIterator();
        while (partsIterator.hasNext())
        {
            Entry<Integer, PrintPart> partsEntry = partsIterator.next();
            base.addPart(partsEntry.getKey(), partsEntry.getValue());
        }
    }

    List<PrintBookmark> bookmarks = add.getBookmarks();
    if (bookmarks != null)
        for (PrintBookmark bookmark : bookmarks)
            base.addBookmark(bookmark);
}

Затем, чтобы использовать его:

JasperPrint combinedPrint = createJasperReport("Multiple Reports",
    print1);
for (JasperPrint addPrint : new JasperPrint[] { print1, print2, print3 })
    addJasperPrint(combinedPrint, addPrint);

// Now do whatever it was you'd do with the JasperPrint.
String combinedXml = JasperExportManager.exportReportToXml(combinedPrint);

Я вижу, что в JasperReports теперь есть более новая функция «Книга отчетов», которая может быть лучшим решением, но я еще не использовал ее.

person Pixelstix    schedule 23.05.2018

Вы можете использовать список JasperPrint следующим образом:

List<JasperPrint> jasperPrintList = new ArrayList<JasperPrint>();

jasperPrintList.add(JasperFillManager.fillReport("Report_file1.jasper", getReportMap(1), new JREmptyDataSource()));
jasperPrintList.add(JasperFillManager.fillReport("Report_file2.jasper", getReportMap(2), new JREmptyDataSource()));
jasperPrintList.add(JasperFillManager.fillReport("Report_file3.jasper", getReportMap(3), new JREmptyDataSource()));

JRPdfExporter exporter = new JRPdfExporter();

exporter.setExporterInput(SimpleExporterInput.getInstance(jasperPrintList));
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput("Report_PDF.pdf"));
SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration();
configuration.setCreatingBatchModeBookmarks(true);
exporter.setConfiguration(configuration);

exporter.exportReport();
person i-tms    schedule 09.07.2019