Java API для создания PDF с таблицами: какие-либо рекомендации? - PullRequest
3 голосов
/ 28 декабря 2010

Мне нужно создать PDF-файл, содержащий несколько таблиц.При поиске в google / stackoverflow наиболее часто используемым API кажется iText, но он находится под лицензией AGPL и поэтому нежелателен для моих целей.Я также часто вижу apache pdfbox, но в нем, похоже, нет встроенной поддержки таблиц (хотя немного хакерский способ был опубликован на Apache PDFBox Java-библиотека - есть ли API для создания таблиц? )

У кого-нибудь есть рекомендации?

Ответы [ 4 ]

3 голосов
/ 28 декабря 2010

перейти на JasperReport

3 голосов
/ 28 декабря 2010

Вы можете попробовать использовать XSL-FO + FOP для создания ваших таблиц.Например, см. http://ashishpatil.blogspot.com/2006/06/creating-pdfs-with-apache-fop.html

1 голос
/ 28 декабря 2010

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

В этом случае я бы предложил вам создать DocBook XML, который затем можно легко преобразовать во многие выходные данные.форматы.См. http://wiki.docbook.org/topic/DocBookPublishingTools

Я бы предложил для небольших документов подход XSL-FO.

0 голосов
/ 28 декабря 2010

JasperReport может быть полезен, если ваш pdf не динамический.Но если он динамический, и вам нужно сделать это на лету, то я рекомендую DynamicJasper

import ar.com.fdvs.dj.core.DynamicJasperHelper;
import ar.com.fdvs.dj.core.layout.ClassicLayoutManager;
import ar.com.fdvs.dj.domain.DynamicReport;
import ar.com.fdvs.dj.domain.Style;
import ar.com.fdvs.dj.domain.builders.ColumnBuilder;
import ar.com.fdvs.dj.domain.builders.DynamicReportBuilder;
import ar.com.fdvs.dj.domain.constants.Border;
import ar.com.fdvs.dj.domain.constants.Font;
import ar.com.fdvs.dj.domain.constants.HorizontalAlign;
import ar.com.fdvs.dj.domain.constants.Page;
import ar.com.fdvs.dj.domain.constants.Transparency;
import ar.com.fdvs.dj.domain.constants.VerticalAlign;
import ar.com.fdvs.dj.domain.entities.columns.AbstractColumn;

HttpServletResponse response = getContext().getResponse();

            response.setHeader("Cache-Control", "no-cache");
            response.setHeader("Pragma", "no-cache");
            response.setDateHeader("Expires", 0);
            response.setCharacterEncoding("ISO-8859-1");

            response.setContentType("application/pdf");     
            response.setHeader("Content-Disposition", "attachment; filename=example.pdf");


DynamicReportBuilder drb = new DynamicReportBuilder();

                Style detailStyle = new Style();
                detailStyle.setBorderTop(Border.THIN);
                detailStyle.setBorderBottom(Border.THIN);
                detailStyle.setBorderLeft(Border.THIN);
                detailStyle.setBorderRight(Border.THIN);

                Style headerStyle = new Style();
                headerStyle.setFont(Font.ARIAL_MEDIUM_BOLD);
                headerStyle.setBorderBottom(Border.THIN);
                headerStyle.setBackgroundColor(Color.gray);
                headerStyle.setTextColor(Color.white);
                headerStyle.setHorizontalAlign(HorizontalAlign.CENTER);
                headerStyle.setVerticalAlign(VerticalAlign.MIDDLE);
                headerStyle.setTransparency(Transparency.OPAQUE);

                Style headerVariables = new Style();
                headerVariables.setFont(Font.ARIAL_MEDIUM_BOLD);
                headerVariables.setHorizontalAlign(HorizontalAlign.RIGHT);
                headerVariables.setVerticalAlign(VerticalAlign.MIDDLE);

                Style titleStyle = new Style();
                titleStyle.setFont(new Font(18, Font._FONT_VERDANA, true));

                Style importeStyle = new Style();
                importeStyle.setHorizontalAlign(HorizontalAlign.RIGHT);
                Style oddRowStyle = new Style();
                oddRowStyle.setBorder(Border.NO_BORDER);
                oddRowStyle.setBackgroundColor(Color.LIGHT_GRAY);
                oddRowStyle.setTransparency(Transparency.OPAQUE);

                drb.addTitle(sessao.getNomeCliente());              
                drb.addTitleStyle(titleStyle);

                drb.addSubtitle("Consulta O.S.");

                drb.addOddRowBackgroundStyle(oddRowStyle);
                drb.addDefaultStyles(titleStyle, null, headerStyle, detailStyle);

                drb.addPageSizeAndOrientation(Page.Page_A4_Landscape());

                int top = 10;
                int bottom = 10;
                int left = 10;
                int right = 10;
drb.addMarginss(top, bottom, left, right);  


if (searchResults.isThereThisField()) {

                    AbstractColumn columnState = ColumnBuilder.getInstance()
                    .addColumnProperty("numeroOs", Integer.class.getName())         
                    .addTitle("This Field")             
                    .addWidth(5)
                    .build();   

                    drb.addColumn(columnState);

                }

Сделать это для всех полей.

drb.addUseFullPageWidth(true);

                DynamicReport dr = drb.build();

JRDataSource ds = new JRBeanCollectionDataSource(lista);

                JasperPrint jp = DynamicJasperHelper.generateJasperPrint(dr, new ClassicLayoutManager(), ds );

                byte[] b = JasperExportManager.exportReportToPdf(jp);
                response.getOutputStream().write(b);

                response.flushBuffer();
                setPath(null);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...