System crashing when the print button is clicked

2019-01-20 05:34发布

问题:

I have done like this for generating pdf at runtime when i click on the print button The process is like this when I click on the print button the pdf is generated with folder.

For that I have done like this:

private void btnPrint_Click(object sender, EventArgs e)
{

    private const string PAYMENT_PATH = @"c:\xxxxx\xxxxx\paymentType_{0}";

    btnPrint.Visible = true;
    btnPrint.Enabled = true;

    string pay = cbpaymenttype.Text;
    string dds = cbddprovider.Text;

    string path = String.Format(PAYMENT_PATH, DateTime.Now.ToString("ddMMyyyyHHmm"));

    //List<paymenttypeprint> paymenttype = new List<paymenttypeprint>();

    List<printfunctions> printfunction = new List<printfunctions>();
    foreach (ListViewItem item in lstviewcashmembers.Items)
    {

        printfunctions allpayments = new printfunctions();
        allpayments.member_Lastname = item.SubItems[1].Text;
        allpayments.member_Firstname = item.SubItems[2].Text;
        allpayments.Postcode = item.SubItems[3].Text;
        allpayments.ddReference = item.SubItems[4].Text;
        allpayments.ddprovider = item.SubItems[5].Text;
        allpayments.Monthlyamount = Convert.ToDecimal(item.SubItems[6].Text);
        allpayments.MembershipType = item.SubItems[7].Text;
        allpayments.Status = item.SubItems[8].Text;
        allpayments.Enddate = Convert.ToDateTime(item.SubItems[9].Text);
        allpayments.paymentmethods = item.SubItems[10].Text;
        printfunction.Add(allpayments);
    }

    new printFunction(printfunction, new Company(mf.gBaseUrl).GetSingleLineCompanyDetails(), path, pay, dds);

    System.Diagnostics.Process.Start("explorer.exe", path);
}

I have created the class printfunctions like this:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using PdfSharp;
using PdfSharp.Drawing;
using PdfSharp.Pdf;
using PdfSharp.Drawing.Layout;
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
using MigraDoc.DocumentObjectModel.Shapes;
using MigraDoc.DocumentObjectModel.Tables;
using MigraDoc.DocumentObjectModel.Fields;
using System.IO;

namespace classes
{
    public class printfunctions
    {
        public string member_Lastname;
        public string member_Firstname;
        public string Postcode;
        public string ddReference;
        public string ddprovider;
        public decimal Monthlyamount;
        public string MembershipType;
        public string Status;
        public DateTime Enddate;
        public string paymentmethods;
    }

    public class printFunction
    {
        private Document _document;
        private Table _table;
        private List<printfunctions> _array;
        private string _address;
        private string _paymethod;
        private string _ddproviders;

        public printFunction(List<printfunctions> array, string address, string exportpath, string paymentmethod, string ddproviders)
        {
            _array = array;
            _address = address;
            _paymethod = paymentmethod;
            _ddproviders = ddproviders;

            Document ddreportdoc = CreateDocument();
            PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(true);

            pdfRenderer.Document = ddreportdoc;

            if (!Directory.Exists(exportpath))
                Directory.CreateDirectory(exportpath);

            pdfRenderer.RenderDocument();

            if (paymentmethod != "All")
            {
                pdfRenderer.Save(String.Format(@"{0}\{1}  MEMBERS REPORT.pdf", exportpath, _paymethod));
            }
            else if (ddproviders != "")
            {
                pdfRenderer.Save(String.Format(@"{0}\{1} MEMBERS REPORT.pdf", exportpath, _ddproviders));
            }
        }

        public Document CreateDocument()
        {

            _document = new Document();

            if (_ddproviders != "")
            {
                _document.Info.Title = string.Format("{0}", _ddproviders);
            }
            else if (_paymethod != "All")
            {

                _document.Info.Title = string.Format("{0}", _paymethod);
            }
            _document.Info.Author = "xxxxxxx";

            DefineStyles();
            CreatePage();
            FillContent();

            return _document;
        }

        private void DefineStyles()
        {
            Style style = _document.Styles["Normal"];
            style.Font.Name = "Verdana";

            style = _document.Styles[StyleNames.Header];
            style.ParagraphFormat.AddTabStop("8cm", TabAlignment.Right);

            style = _document.Styles[StyleNames.Footer];
            style.ParagraphFormat.AddTabStop("7cm", TabAlignment.Center);

            // Create a new style called Table based on style Normal
            style = _document.Styles.AddStyle("Table", "Normal");
            style.Font.Name = "Verdana";
            style.Font.Size = 6;

            // Create a new style called Reference based on style Normal
            style = _document.Styles.AddStyle("Reference", "Normal");
            style.ParagraphFormat.SpaceBefore = "6mm";
            style.ParagraphFormat.SpaceAfter = "6mm";
            style.ParagraphFormat.TabStops.AddTabStop("6cm", TabAlignment.Right);

        }

        private void CreatePage()
        {
            Section section = _document.AddSection();

            // Create footer
            Paragraph paragraph = section.Footers.Primary.AddParagraph();
            paragraph.AddText(_address);
            paragraph.Format.Font.Size = 8;
            paragraph.Format.Alignment = ParagraphAlignment.Center;

            paragraph = section.AddParagraph();
            paragraph.Format.SpaceBefore = "1.3cm";
            paragraph.Style = "Reference";
            if (_paymethod == "All")
            {
                paragraph.AddFormattedText(string.Format("{0} MEMBERS MONTHLY REPORT", _paymethod), TextFormat.Bold);
            }
            else if (_ddproviders == "All providers")
            {

                paragraph.AddFormattedText(string.Format("{0} MEMBERS MONTHLY REPORT", _ddproviders), TextFormat.Bold);
            }
            paragraph.AddTab();
            paragraph.AddDateField("dd MMM yyyy");

            _table = section.AddTable();
            _table.Style = "Table";
            _table.Borders.Color = new Color(0, 0, 0);

            //Defining the columns

            Column column = _table.AddColumn("1.7cm"); //Lastname
            column.Format.Alignment = ParagraphAlignment.Center;

            column = _table.AddColumn("1.7cm"); // first name
            column.Format.Alignment = ParagraphAlignment.Left;

            column = _table.AddColumn("1.7cm"); // postcode
            column.Format.Alignment = ParagraphAlignment.Left;

            column = _table.AddColumn("1.7cm"); // DD ref
            column.Format.Alignment = ParagraphAlignment.Left;

            column = _table.AddColumn("1.7cm"); //DD provider Name
            column.Format.Alignment = ParagraphAlignment.Left;

            column = _table.AddColumn("1.7cm"); // Monthly Amount
            column.Format.Alignment = ParagraphAlignment.Left;

            column = _table.AddColumn("1.7cm"); // mship type
            column.Format.Alignment = ParagraphAlignment.Left;

            column = _table.AddColumn("1.7cm"); // status
            column.Format.Alignment = ParagraphAlignment.Left;

            column = _table.AddColumn("1.7cm"); // Expiry date
            column.Format.Alignment = ParagraphAlignment.Left;

            column = _table.AddColumn("1.7cm"); // payment type
            column.Format.Alignment = ParagraphAlignment.Right;

            // Create the header of the _table
            Row row = _table.AddRow();
            row.HeadingFormat = row.Format.Font.Bold = true;
            row.Format.Alignment = ParagraphAlignment.Center;

            row.Cells[0].AddParagraph("Last Name");
            row.Cells[0].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[1].AddParagraph("First Name");
            row.Cells[1].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[2].AddParagraph("Post Code");
            row.Cells[2].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[3].AddParagraph("DD Reference");
            row.Cells[3].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[4].AddParagraph("DDProvider Name");
            row.Cells[4].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[5].AddParagraph("Monthly Amount");
            row.Cells[5].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[6].AddParagraph("Memebrship Type");
            row.Cells[6].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[7].AddParagraph("Status");
            row.Cells[7].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[8].AddParagraph("ExpiryDate");
            row.Cells[8].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[9].AddParagraph("payment type");
            row.Cells[9].Format.Alignment = ParagraphAlignment.Left;
        }

        private void FillContent()
        {
            foreach (var item in _array)
            {
                // Each item fills two rows
                Row row1 = _table.AddRow();
                row1.TopPadding = 1.0;
                Paragraph paragraph;

                row1.Cells[0].VerticalAlignment = VerticalAlignment.Center;
                row1.Cells[0].Format.Alignment = ParagraphAlignment.Left;
                row1.Cells[0].AddParagraph(item.member_Lastname);

                row1.Cells[1].Format.Alignment = ParagraphAlignment.Right;
                paragraph = row1.Cells[1].AddParagraph(item.member_Firstname);

                row1.Cells[2].Format.Alignment = ParagraphAlignment.Left;
                paragraph = row1.Cells[2].AddParagraph(item.Postcode);

                row1.Cells[3].Format.Alignment = ParagraphAlignment.Right;
                paragraph = row1.Cells[3].AddParagraph(item.ddReference);

                row1.Cells[4].Format.Alignment = ParagraphAlignment.Left;
                paragraph = row1.Cells[4].AddParagraph(item.ddprovider);

                row1.Cells[5].Format.Alignment = ParagraphAlignment.Right;
                paragraph = row1.Cells[5].AddParagraph(item.Monthlyamount.ToString("F2"));

                row1.Cells[6].Format.Alignment = ParagraphAlignment.Left;
                paragraph = row1.Cells[6].AddParagraph(item.MembershipType);

                row1.Cells[7].Format.Alignment = ParagraphAlignment.Right;
                paragraph = row1.Cells[7].AddParagraph(item.Status);

                row1.Cells[8].Format.Alignment = ParagraphAlignment.Left;
                paragraph = row1.Cells[8].AddParagraph(item.Enddate.ToString("dd MMM yyyy"));

                row1.Cells[9].Format.Alignment = ParagraphAlignment.Right;
                paragraph = row1.Cells[9].AddParagraph(item.paymentmethods);
            }
        }
    }
}

Its working fine when the ListView lstviewcashmembers has rows upto 100 or 300, but its not working when the ListView lstviewcashmembers has 1600 rows.

The system crashes at this line:

pdfRenderer.RenderDocument();

The execution does not go to the next line and it does not showing any exception also the system just crashes when I click on the print button and if the ListView has 1600 rows.

Is there anything wrong in my code for generating PDF at run time using MigraDoc and PDFsharp libraries?

Would anyone please help on this .....

Many thanks........

 MODIFIED :  It will take four minutes  for generating pdf so how should I reduce this time 

would any one help on this

Many thanks

回答1:

Enable exceptions handling in VS like here and you will gotten exact exception description. Looking on your problem description sounds like this could be rows quantity limit. By the way check out the link.

Regards.



回答2:

Extract from http://pdfsharp.codeplex.com/releases/view/37054:

If you favor speed: stay with PDFsharp 1.30. If you favor small PDF files: use PDFsharp 1.31. Future versions of PDFsharp will support both modes (favour speed and favour size).

Maybe this helps.