简体   繁体   English

合并 Memory 流以创建 http PDF 响应在 Z240AA2CEC4B29DCEE7EZ0A

[英]Merging Memory Streams to create a http PDF response in c#

I am trying to merge 2 crystal reports into single pdf file and I'm using Itextsharp v5.1.1.我正在尝试将 2 个水晶报告合并到单个 pdf 文件中,并且我正在使用 Itextsharp v5.1.1。 But it says the document cannot be opened.但它说文件无法打开。 It might be corrupted.它可能已损坏。 There are no build errors.没有构建错误。 but the pdf is malformed and cant be opened.但是 pdf 格式错误,无法打开。 Here is the order I chose to accomplish this.这是我选择完成此操作的顺序。

  1. Export the Crystal report to MemoryStream1 in pdf format以 pdf 格式将 Crystal 报表导出到 MemoryStream1
  2. Export the second report into MemoryStream2.将第二个报告导出到 MemoryStream2。
  3. Merge the Memory Streams合并 Memory 流
  4. Send the Streams to Http Output Response as PDF.将流发送到 Http Output 响应为 PDF。

Here is the Code for each step in the order.这是订单中每个步骤的代码。

   /// 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);

For Step 2对于第 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);

For Step 3对于第 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 method is as follows 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;
    }

Step 4 to Serialize the Memory stream as PDF第 4 步将 Memory stream 序列化为 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();

Thanks for all those Developers helping me with this.感谢所有帮助我解决此问题的开发人员。 This is Urgent because it has to go production in a day or 2. Please respond.这是紧急的,因为它必须在一两天内生产 go。请回复。

Chandanan.昌达南。

Here's a simple merge method that copies PDF files into one PDF.这是一个简单的合并方法,将 PDF 文件复制到一个 PDF 中。 I use this method quite often when merging pdfs.我在合并 pdf 时经常使用这种方法。 Hope it helps.希望能帮助到你。

    public MemoryStream MergePdfForms(List<byte[]> files)
    {
        if (files.Count > 1)
        {
            PdfReader pdfFile;
            Document doc;
            PdfWriter pCopy;
            MemoryStream msOutput = new MemoryStream();

            pdfFile = new PdfReader(files[0]);

            doc = new Document();
            pCopy = new PdfSmartCopy(doc, msOutput);

            doc.Open();

            for (int k = 0; k < files.Count; k++)
            {
                pdfFile = new PdfReader(files[k]);
                for (int i = 1; i < pdfFile.NumberOfPages + 1; i++)
                {
                    ((PdfSmartCopy)pCopy).AddPage(pCopy.GetImportedPage(pdfFile, i));
                }
                pCopy.FreeReader(pdfFile);
            }

            pdfFile.Close();
            pCopy.Close();
            doc.Close();

            return msOutput;
        }
        else if (files.Count == 1)
        {
            return new MemoryStream(files[0]);
        }

        return null;
    }

Step 4 try:第4步尝试:

        rptCS.Close();
        rptCS.Dispose();
        rptAd.Close();
        rptAd.Dispose();

        Response.Clear();
        Response.ContentType = "application/pdf";
        Response.AddHeader("Content-Disposition", 
    "attachment; filename=" + 
    "Application of " + FullName.Trim() + ".pdf");
        Response.BinaryWrite(ms.ToArray());
        ApplicationInstance.CompleteRequest();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM