2015-11-23 4 views
0

Я использую Eclipse и Java и хочу сгенерировать PDF. Я использую BIRT, но результат PDF неверен, в то время как веб-просмотрщик верен.BIRT две фазы, генерация отчетов и презентация

Из того, что я понимаю, BIRT генерирует отчет в веб-браузере и в формате PDF по-разному. При генерации PDF две фазы: генерация отчетов и презентация выполняются как одна задача, а не две задачи.

Могу ли я заставить BIRT отделить фазы?

Или, может быть, есть способ получить функцию «экспорта» в веб-браузере BIRT и использовать ее после создания отчета? Значение для создания отчета, а затем его экспорта.

EDIT: Проблема заключается в генерации Оглавления. Это нормально в веб-браузере, но в PDF-формате он не содержит номеров страниц.

EDIT 2: @hvb - Хорошо, хорошее начало. Тем не менее, поправьте меня, если я ошибаюсь, но design является IReportRunnable, который нуждается engine.openReportDesign()

Я попытался это: https://wiki.eclipse.org/Separate_Run_and_Render_(BIRT)_2.1

Я получаю сообщение об ошибке в Platform.startup(config);

Exception in thread "main" java.lang.NoClassDefFoundError: com/ibm/icu/util/UResourceBundle 
    at org.eclipse.birt.core.framework.osgi.OSGILauncher.doStartup(OSGILauncher.java:123) 
    at org.eclipse.birt.core.framework.osgi.OSGILauncher.access$0(OSGILauncher.java:94) 
    at org.eclipse.birt.core.framework.osgi.OSGILauncher$1.run(OSGILauncher.java:79) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at org.eclipse.birt.core.framework.osgi.OSGILauncher.startup(OSGILauncher.java:75) 
    at org.eclipse.birt.core.framework.Platform.startup(Platform.java:79) 
    at xtensus.utils.RunTask.executeReport(RunTask.java:38) 
    at xtensus.utils.RunTask.main(RunTask.java:137) 
Caused by: java.lang.ClassNotFoundException: com.ibm.icu.util.UResourceBundle 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
    ... 8 more 
+0

Вы можете разместить код или изменения URL, который вы используете для 'генерации PDF' через' BIRT' – Vishrant

+0

также который BIRT версии вам используют? – Vishrant

+0

Вы должны добавить некоторые детали, что именно не так с созданным PDF. – hvb

ответ

2

две фазы называются «Run »и« Render ». Если вы вызываете BIRT изнутри Java (я имею в виду не просто вызов веб-просмотра на каждый URL-адрес), вы можете сами решить, что хотите. Вы либо используете RunAndRenderTask, либо отдельно RunTask и RenderTask.

При использовании RunAndRenderTask существуют некоторые незначительные ограничения. В частности, событие onPageStart вызывается только один раз.

фрагмент кода для отдельных задач (обратите внимание на pdfOptions!):

  runTask = engine.createRunTask(design); 
      // set parameter values... 
      // runTask.setParameterValue("Parameter_Rejo_Id", rejo_id); 
      runTask.run(destName + ".rptdocument"); 
      IReportDocument rptdoc = engine.openReportDocument(destName + ".rptdocument"); 
      renderTask = engine.createRenderTask(rptdoc); 
      FileOutputStream fos = null; 
       // Set RenderOptions and PDF RenderOptions 
       IRenderOption options = new RenderOption(); 

       // Workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=428173 

       // options.setOutputFileName(destName); 
       fos = new FileOutputStream(destName); 
       final int BUFSIZE = 32768; 
       options.setOutputStream(new BufferedOutputStream(fos, BUFSIZE)); 
       options.setOutputFormat("PDF"); 
       PDFRenderOption pdfOptions = new PDFRenderOption(options); 
       pdfOptions.setOption(IPDFRenderOption.PAGE_OVERFLOW, IPDFRenderOption.OUTPUT_TO_MULTIPLE_PAGES); 
       pdfOptions.setOption(IPDFRenderOption.PDF_TEXT_WRAPPING, true); 
       pdfOptions.setOption(IPDFRenderOption.PDF_HYPHENATION, true); 
       options.setOption(IRenderOption.CLOSE_OUTPUTSTREAM_ON_EXIT, true); 

       renderTask.setRenderOption(options); 
       renderTask.render();