我的应用程序首先在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,需要很长时间并且应用程序挂起。
我该怎么做才能进行优化?
感谢您的帮助。
答案 0 :(得分:5)
解决方案很简单:逐行读取text.txt文件,为每一行创建一个Paragraph
,并尽快将每个Paragraph
对象添加到文档中。
为什么这是解决方案?
您的代码在设计上存在缺陷:它占用大量内存:首先在richtextbox1
对象中加载2 MByte。然后将相同的2 MByte加载到Paragraph
对象中。原始的2 MByte仍在内存中,但Paragraph
开始分配内存来处理文本。然后将Paragraph
添加到文档中。内存以页面为单位发布(iText会在页面填满后立即刷新内容),但处理仍需要大量内存。当你的电脑“挂起”时,他可能正在交换内存。
我看到你的昵称是聪明人,但我猜你是个年轻人。如果你和我一样年老,你就会知道记忆费用昂贵的日子,人们无法通过设计浪费记忆; - )