1

2 ページの Crystal レポートがあります。1 つは縦向き、もう 1 つは横向きです。レポートでは問題ないように見えますが、PDF にエクスポートすると、両方のページがポートレート形式でエクスポートされ、データの一部が失われます。誰でも私の問題を解決できますか? よろしくお願いします。

4

2 に答える 2

4
  1. 縦向きで最初のページを PDF としてエクスポート
  2. 横向きで 2 ページ目を PDF としてエクスポート
  3. サードパーティのライブラリを使用して 2 つの PDF を結合します

メインのパブリックなものが

report.ExportToStream(ExportFormatType formatType)

FormatOptions を無視します。代わりに、使用する必要があります

report.FormatEngine.ExportToStream(ExportRequestContext reqContext)

このコードは、あなたが望むことをするはずです(PdfSharpを使用して結合します):

using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;
...
using (var report = new ReportClass { FileName = Server.MapPath("/Crystal/Reports/DosBatches.rpt") })
{
    report.Load();

    /* set data source connections */
    /* set parameters */

    // export the first page
    report.PrintOptions.PaperOrientation = PaperOrientation.Portrait;
    var exportOptions1 = new ExportOptions
    {
        ExportFormatType = ExportFormatType.PortableDocFormat,
        FormatOptions = new PdfFormatOptions { UsePageRange = true, FirstPageNumber = 1, LastPageNumber = 1 }
    };
    exportRequestContext.ExportInfo = exportOptions1;
    var stream1 = report.FormatEngine.ExportToStream(exportRequestContext);
    stream1.Seek(0, SeekOrigin.Begin);

    // export the second page
    report.PrintOptions.PaperOrientation = PaperOrientation.Landscape;
    var exportOptions2 = new ExportOptions
    {
        ExportFormatType = ExportFormatType.PortableDocFormat,
        FormatOptions = new PdfFormatOptions { UsePageRange = true, FirstPageNumber = 2, LastPageNumber = 2 }
    };
    exportRequestContext.ExportInfo = exportOptions2;
    var stream2 = report.FormatEngine.ExportToStream(exportRequestContext);
    stream2.Seek(0, SeekOrigin.Begin);

    // merge the two PDF streams
    var combinedPdf = new PdfDocument();
    foreach (PdfPage page in PdfReader.Open(stream1, PdfDocumentOpenMode.Import).Pages)
        combinedPdf.AddPage(page);
    foreach (PdfPage page in PdfReader.Open(stream2, PdfDocumentOpenMode.Import).Pages)
        combinedPdf.AddPage(page);

    // probably not the most efficient, but works
    var output = new MemoryStream();
    combinedPdf.Save(output, false);
    return new FileStreamResult(output, "application/pdf");
}
于 2012-06-29T21:29:14.727 に答える