2013-06-20 157 views
2

我正面臨BIRT報告生成器的問題。我使用設計器創建了一個報告,並將其主頁面設置爲橫向,頁面類型設置爲A4,但無法使用我的服務器的報告引擎(它始終使用縱向方向渲染)使其工作。如果我忽略pdfOptions添加,問題仍然出現。BIRT報告爲PDF與橫向佈局

但是,它使用設計師的預覽選項。

這是我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頁面方向爲this link說一種選擇,但我不知道在哪裏以應用。我正在使用birt runtime 4.2.0。

有什麼想法?

回答

1

我終於設法得到它的工作沒有設置的類加載器的引擎,沒有對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(); 
+0

上沒有_setMasterPageContent_ _setOutputMaster_您正在通過_reportParams_傳遞哪些參數? – OGrandeDiEnne

+0

您的報告將用於呈現數據@OGrandeDiEnne。這個一般情況並不重要。 –

+0

它適用於特定的問題:您發佈的代碼沒有任何選項可以告訴BIRT生成橫向pdf文件..或者我錯過了什麼? – OGrandeDiEnne

-1

你應該添加到您的代碼:

options.setMasterPageContent(true); 
options.setOutputMasterPageMargins(true); 
+0

是不是隻適用於[HTML渲染器](http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.birt.doc.isv%2Fengine%2Fapi%2Forg %2Feclipse%2Fbirt%2Freport%2Fengine%2Fapi%2FIHTMLRenderOption.html)? –

+0

在Birt運行時4.4.2 _IRenderOption_ – OGrandeDiEnne

-1

的Xtreme 「騎車人」的解決方案對我無效。

我的問題是我沒有在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騎車)有在GUI的一個選項來強制取向Designer GUI option to force orientation

但是,我不得不以編程方式處理頁面溢出

+0

您使用的是相同版本的引擎嗎?如果是,您可以在報告模板的xml代碼中看到「orientation」屬性嗎?這可能是您的報表編輯器中沒有附加的錯誤。很奇怪。無論如何,感謝分享它。 –

+0

我正在使用最新的4.4.2 – OGrandeDiEnne

+0

我沒有深入瞭解模板XML。我看到的唯一方向是_ ltr _ – OGrandeDiEnne