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 runtime 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