为什么ITextSharp需要很长时间来创建pdf?

时间:2014-02-06 16:56:12

标签: c# wpf optimization itextsharp

我的应用程序首先在richtextbox中加载文本文件whitout任何问题:

        StreamReader str = new StreamReader("C:\\test.txt");

        while (str.Peek() != -1)
        {

            richtextbox1.AppendText(str.ReadToEnd());
        }

之后,我想使用itextsharp将richtextbox的文本导出为pdf格式:

      iTextSharp.text.Document doc = new iTextSharp.text.Document();
        iTextSharp.text.pdf.PdfWriter.GetInstance(doc, new FileStream(filename,        FileMode.Create));
        doc.Open();
        doc.Add(new iTextSharp.text.Paragraph(richtextbox1.Text));
        doc.Close();

我使用了背景工作者,但它没有帮助我:

     private delegate void upme(string filenamed);

   private void callpdf(string filename)
    {
        iTextSharp.text.Document doc = new iTextSharp.text.Document();
        iTextSharp.text.pdf.PdfWriter.GetInstance(doc, new FileStream(filename, FileMode.Create));
        doc.Open();
        doc.Add(new iTextSharp.text.Paragraph(richtextbox1.Text));
        doc.Close();
    }

    private void savepdfformat(string filenames)
 {
     BackgroundWorker bg = new BackgroundWorker();

     bg.DoWork += delegate(object s, DoWorkEventArgs args)
     {
        upme movv = new upme(callpdf);

        richtextbox1.Dispatcher.Invoke(movv, System.Windows.Threading.DispatcherPriority.Normal, filenames);

     };
     bg.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
     {
         MessageBox.Show("done");
     };

     bg.RunWorkerAsync();   
}

test.txt的大小约为2 mb,它在richtextbox1中的加载速度非常快,但是当我想

将其转换为pdf,需要很长时间并且应用程序挂起。

我该怎么做才能进行优化?

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

解决方案很简单:逐行读取text.txt文件,为每一行创建一个Paragraph,并尽快将每个Paragraph对象添加到文档中。

为什么这是解决方案?

您的代码在设计上存在缺陷:它占用大量内存:首先在richtextbox1对象中加载2 MByte。然后将相同的2 MByte加载到Paragraph对象中。原始的2 MByte仍在内存中,但Paragraph开始分配内存来处理文本。然后将Paragraph添加到文档中。内存以页面为单位发布(iText会在页面填满后立即刷新内容),但处理仍需要大量内存。当你的电脑“挂起”时,他可能正在交换内存。

我看到你的昵称是聪明人,但我猜你是个年轻人。如果你和我一样年老,你就会知道记忆费用昂贵的日子,人们无法通过设计浪费记忆; - )