Объединение потоков памяти для создания HTTP-ответа в формате PDF в C #

Я пытаюсь объединить 2 кристаллических отчета в один файл pdf и использую Itextsharp v5.1.1. Но там сказано, что документ нельзя открыть. Возможно, он поврежден. Ошибок сборки нет. но PDF-файл имеет неправильный формат и не может быть открыт. Вот порядок, который я выбрал для этого.

  1. Экспорт отчета Crystal в MemoryStream1 в формате pdf
  2. Экспорт второго отчета в MemoryStream2.
  3. Объединить потоки памяти
  4. Отправить потоки в ответ Http Output как PDF.

Вот код для каждого шага в порядке.

   /// Get the Dataset from Stored Procedure for the CSSource Report
   dsCS = CSData.GetUSSourceXML(ds_input);
   /// Create the Report of type CSsource
   rptCS = ReportFactory.GetReport(typeof(CSsource));
   rptCS .SetDataSource(dsCS);
   /// Set the Parameters to the CS report
   rptCS .ParameterFields["Parameterid"].CurrentValues.Clear();
   rptCS .SetParameterValue("Parameterid", PID);
   //// Serialize the Object as PDF                    
   msCS=(MemoryStream)rptCS .ExportToStream(ExportFormatType.PortableDocFormat);

Для шага 2

   /// Get the Dataset from Stored Procedure for the Aden Report
   dsAd = CSData.GetAdden(ds_input);
   /// Create the Report of type Aden
   rptAd = ReportFactory.GetReport(typeof(Aden));
   rptAd.SetDataSource(dsAd );
   /// Set the Parameters to the Aden report
   rptAd.ParameterFields["Parameterid"].CurrentValues.Clear();
   rptAd.SetParameterValue("Parameterid", PID);
   //// Serialize the Object as PDF                    
   msAD = (MemoryStream)rptAd.ExportToStream(ExportFormatType.PortableDocFormat);

Для шага 3

  System.Collections.Generic.List<byte[]> sourceFiles = new List<byte[]>();
  sourceFiles.Add(msCS.ToArray());
  sourceFiles.Add(msAD.ToArray());
  PdfMerger mpdfs = new PdfMerger();
  /// ms is the Memory stream to which both the streams are added
  ms=mpdfs.MergeFiles(sourceFiles);

Метод MergeFiles выглядит следующим образом

 public MemoryStream MergeFiles(Generic.List<byte[]> sourceFiles)
    {
        Document document = new Document();
        MemoryStream output = new MemoryStream();

        try
        {
            // Initialize pdf writer
            PdfWriter writer = PdfWriter.GetInstance(document, output);
            //writer.PageEvent = new PdfPageEvents();

            // Open document to write
            document.Open();
            PdfContentByte content = writer.DirectContent;

            // Iterate through all pdf documents
            for (int fileCounter = 0; fileCounter < sourceFiles.Count; 
                   fileCounter++)
            {
                // Create pdf reader
                PdfReader reader = new PdfReader(sourceFiles[fileCounter]);
                int numberOfPages = reader.NumberOfPages;

                // Iterate through all pages
                for (int currentPageIndex = 1; currentPageIndex <=
                                   numberOfPages; currentPageIndex++)
                {
                    // Determine page size for the current page
                    document.SetPageSize(
                       reader.GetPageSizeWithRotation(currentPageIndex));

                    // Create page
                    document.NewPage();
                    PdfImportedPage importedPage =
                      writer.GetImportedPage(reader, currentPageIndex);


                    // Determine page orientation
                    int pageOrientation = 
                      reader.GetPageRotation(currentPageIndex);
                    if ((pageOrientation == 90) || (pageOrientation == 270))
                    {
                     content.AddTemplate(importedPage, 0, -1f, 1f, 0, 0,
                     reader.GetPageSizeWithRotation(currentPageIndex).Height);
                    }
                    else
                    {
                    content.AddTemplate(importedPage, 1f, 0, 0, 1f, 0, 0);
                    }
                }
            }
        }
        catch (Exception exception)
        {
        throw new Exception("There has an unexpected exception" +
        " occured during the pdf merging process.", exception);
        }
        finally
        {
           // document.Close();
        }
        return output;
    }

Шаг 4 для сериализации потока памяти как PDF

  // ms is the memory stream which is to be converted to PDF
  Response.Clear();
        Response.ClearContent();
        Response.ClearHeaders();
        Response.ContentType = "application/pdf";
        Response.Charset = string.Empty;
        Response.AddHeader("Content-Disposition", 
        "attachment; filename=" + 
        "Application of " + FullName.Trim() + ".pdf");
        //Write the file directly to the HTTP content output stream.
        Response.OutputStream.Write(ms.ToArray(), 0, 
               Convert.ToInt32(ms.Length));
        Response.OutputStream.Flush();
        Response.OutputStream.Close();
        rptCS.Close();
        rptCS.Dispose();
        rptAd.Close();
        rptAd.Dispose();

Спасибо всем разработчикам, которые помогали мне в этом. Это срочно, потому что производство должно начаться через день или два. Пожалуйста, ответьте.

Чанданан.

7
задан Chandanan 21 July 2011 в 17:07
поделиться