Отчет BIRT в формате PDF с альбомной ориентацией

У меня возникла проблема с генератором отчетов BIRT. Я создал отчет с помощью конструктора и установил ориентацию его мастер-страницы на альбомную и тип страницы на A4, и нет никакого способа заставить его работать с помощью механизма отчетов моего сервера (он всегда отображает с портретной ориентацией ). Если я пропущу добавление pdfOptions, проблема все равно появится.

Однако это работает, когда я использую опцию предварительного просмотра дизайнера.

Это мой ReportRenderer класс:

import javax.servlet.ServletContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.EngineConstants;
import org.eclipse.birt.report.engine.api.EngineException;
import org.eclipse.birt.report.engine.api.HTMLRenderOption;
import org.eclipse.birt.report.engine.api.IPDFRenderOption;
import org.eclipse.birt.report.engine.api.IRenderOption;
import org.eclipse.birt.report.engine.api.IReportEngine;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
import org.eclipse.birt.report.engine.api.PDFRenderOption;
import org.eclipse.birt.report.engine.api.RenderOption;
import org.eclipse.birt.report.engine.api.ReportEngine;
import org.springframework.web.context.ServletContextAware;

public class ReportRenderer{

    public ByteArrayOutputStream renderReport(ReportPath reportPath,
            Map<String, Object> reportParams,
            Locale locale) throws EngineException {

        IReportEngine engine;
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        EngineConfig config = new EngineConfig();
        engine = new ReportEngine(config);

        final IReportRunnable design = engine
                .openReportDesign(this._ServletContext.getRealPath("/") 
                   + reportPath.get_Path());

        // design.get
        // engine.
        // Create task to run and render the report,
        final IRunAndRenderTask task = engine.createRunAndRenderTask(design);

        //report arguments and language
        task.setParameterValue("data_url", this._DataUrl);
        task.setParameterValue("user_name", this._UserName);
        task.setParameterValue("user_password", this._UserPassword);
        for (Entry<String, Object> entry : reportParams.entrySet()) {
            task.setParameterValue(entry.getKey(), entry.getValue());
        }
        task.setLocale(locale);

        // Set parent classloader for engine
        task.getAppContext().put(EngineConstants.APPCONTEXT_CLASSLOADER_KEY,
                GenericReportRenderer.class.getClassLoader());

        final IRenderOption options = new RenderOption();
        options.setOutputFormat("pdf");

        options.setOutputStream(os);

        final PDFRenderOption pdfOptions = new PDFRenderOption(options);
        pdfOptions.setOption(IPDFRenderOption.PAGE_OVERFLOW,
                IPDFRenderOption.FIT_TO_PAGE_SIZE);
        pdfOptions.setOption(IPDFRenderOption.PAGE_OVERFLOW,
                IPDFRenderOption.OUTPUT_TO_MULTIPLE_PAGES);


        task.setRenderOption(options);

        // run and render report
        task.run();
        task.close();
        return os;
    }
}

Кажется, можно изменить ориентацию страницы с помощью javascript, как это link говорит, но я не знаю, где это применить. Я использую среду выполнения birt 4.2.0.

Есть идеи?


person Xtreme Biker    schedule 20.06.2013    source источник


Ответы (3)


Наконец-то мне удалось заставить его работать без установки загрузчика классов для движка и без специальных опций для рендеринга PDF:

ReportEngine engine = new ReportEngine(new EngineConfig());

// open design document
IReportRunnable runnable = engine.openReportDesign(this._ServletContext
    .getRealPath("/")
    + reportPath.get_Path());

IRunAndRenderTask task = engine.createRunAndRenderTask(runnable);

for (Entry<String, Object> ent : reportParams.entrySet()) {
    task.setParameterValue(ent.getKey(), ent.getValue());
}

task.setParameterValue("data_url", this._DataUrl);
task.setParameterValue("user_name", this._UserName);
task.setParameterValue("user_password", this._UserPassword);

task.setLocale(locale);

final IRenderOption options = new RenderOption();
options.setOutputFormat("pdf");
options.setOutputStream(os);

task.setRenderOption(options);
task.run();

task.close();
person Xtreme Biker    schedule 24.06.2013
comment
Какие параметры вы передавали через reportParams? - person OGrandeDiEnne; 13.06.2015
comment
Те, которые ваш отчет будет использовать для отображения данных, @OGrandeDiEnne. Это не имеет большого значения для этого общего случая. - person Xtreme Biker; 13.06.2015
comment
Это относится к конкретному вопросу: в опубликованном вами коде нет возможности указать BIRT для создания альбомных PDF-файлов ... или что мне не хватает? - person OGrandeDiEnne; 13.06.2015
comment
Это вовсе не то, что вы передаете как параметр, а то, что вы настраиваете в шаблоне отчета для конкретной страницы. Моя проблема заключалась в том, что даже если установить в шаблоне альбомную ориентацию, она отображалась как портретная только для формата pdf. - person Xtreme Biker; 13.06.2015
comment
И как вы решили проблему? У меня такая же проблема. - person OGrandeDiEnne; 13.06.2015
comment
Я пропустил часть PDFRenderOption pdfOptions, как я указал в ответе. Просто используйте RenderOption, чтобы сообщить задаче, что вы хотите получить PDF-файл. - person Xtreme Biker; 13.06.2015

Вы должны добавить это в свой код:

options.setMasterPageContent(true);
options.setOutputMasterPageMargins(true);
person Dominique    schedule 22.06.2013
comment
Разве это не доступно только для обработчик HTML? - person Xtreme Biker; 24.06.2013
comment
В среде выполнения Birt 4.4.2 нет setMasterPageContent setOutputMaster в IRenderOption - person OGrandeDiEnne; 14.06.2015

Решение Xtreme Biker мне не подошло.

Моя проблема заключалась в том, что у меня не было настройки ориентации в файле rptdesign.

После двух дней просмотра я обнаружил следующее:

IReportRunnable runnableReport = engine.openReportDesign("myreport.rptdesign");

ReportDesignHandle designHandle = (ReportDesignHandle) runnableReport.getDesignHandle();
designHandle.getMasterPages().get(0).setStringProperty("orientation", "landscape");

(это то же самое, что и код javascript, связанный с вопросом)

Я также должен был соответствовать моему содержанию:

PDFRenderOption pdfOptions = new PDFRenderOption(options);
pdfOptions.setOption(IPDFRenderOption.PAGE_OVERFLOW, IPDFRenderOption.FIT_TO_PAGE_SIZE);

В качестве альтернативного решения (я нашел его позже - спасибо Xtreme Biker) в графическом интерфейсе есть опция для принудительной ориентации Designer GUI  возможность принудительной ориентации

Однако мне пришлось обрабатывать переполнение страницы программно.

person OGrandeDiEnne    schedule 13.06.2015
comment
Вы используете ту же версию движка? Если да, можете ли вы увидеть атрибут orientation в XML-коде вашего шаблона отчета? Это может быть ошибка в вашем редакторе отчетов, который не прикрепляет его. Довольно странно. В любом случае, спасибо, что поделились. - person Xtreme Biker; 13.06.2015
comment
Я использую последнюю версию 4.4.2 - person OGrandeDiEnne; 13.06.2015
comment
Я не особо копался в XML-шаблоне. Единственная ориентация, которую я вижу, это ‹property name=bidiLayoutOrientation›ltr‹/property›. - person OGrandeDiEnne; 13.06.2015
comment
Тогда это твоя проблема. Редактор неправильно добавляет свойство ориентации, поэтому движок не может его использовать. У вас должно быть что-то вроде этого в вашем шаблоне: <page-setup> <simple-master-page name="Simple MasterPage" id="2"> <property name="orientation">landscape</property> <page-header>... Взгляните на этот пример шаблона. - person Xtreme Biker; 13.06.2015