Как объединить два документа PDF в один отчет в JasperReports? - PullRequest
7 голосов
/ 19 апреля 2010

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

Ответы [ 4 ]

23 голосов
/ 26 ноября 2011

к сожалению, решение состоит в том, чтобы создать подотчет и использовать 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

1 голос
/ 20 октября 2010

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

0 голосов
/ 23 мая 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 появилась новая функция "Книга отчетов", которая может быть лучшим решением, но я еще не использовал ее.

0 голосов
/ 22 января 2018

Несколько страниц в одной 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);
...