KcDaRookie
Temporär Suspendiert :D
- Registriert
- 14 Juli 2013
- Beiträge
- 402
Tachchen Zusammen,
Ich hab einen txt2pdf Converter in C# der txt-Dateien aus dem input-Ordner als PDF im output-Ordner speichert.
Dazu benutze ich die PdfSharp Library, und das klappt auch ganz gut, nur wird der Converter immer langsamer.
Bei weniger als 1000 Dateien merkt man das nicht so, ich müsste aber bisschen über 100.000 txt-Dateien umwandeln.
Nur weiß ich nicht wo genau das Problem liegt. Ich glaube, der Arbeitsspeicher wird immer weiter zugemüllt und hab da den StreamReader im Verdacht, aber den close und dispose ich nach jeder Datei.
Habt ihr noch eine Idee, was man optimieren könnte?
Ich hab einen txt2pdf Converter in C# der txt-Dateien aus dem input-Ordner als PDF im output-Ordner speichert.
Dazu benutze ich die PdfSharp Library, und das klappt auch ganz gut, nur wird der Converter immer langsamer.
Bei weniger als 1000 Dateien merkt man das nicht so, ich müsste aber bisschen über 100.000 txt-Dateien umwandeln.
Nur weiß ich nicht wo genau das Problem liegt. Ich glaube, der Arbeitsspeicher wird immer weiter zugemüllt und hab da den StreamReader im Verdacht, aber den close und dispose ich nach jeder Datei.
Habt ihr noch eine Idee, was man optimieren könnte?
[src=csharp]using System;
using System.IO;
using System.Reflection;
using PdfSharp.Drawing;
using PdfSharp.Pdf;
using System.Windows.Forms;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
public static int filecount;
public Form1()
{
//eingebettete pdfsharp.dll wird hier eingelesen
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
string resourceName = new AssemblyName(args.Name).Name + ".dll";
string resource = Array.Find(this.GetType().Assembly.GetManifestResourceNames(), element => element.EndsWith(resourceName));
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource))
{
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}
};
InitializeComponent();
//überprüfen ob der input ordner existiert und dateien enthält
invoiceamount();
}
private void invoiceamount()
{
if (!Directory.Exists("input"))
{
label1.Text = "No input folder found.";
button1.Enabled = false;
button1.Refresh();
}
else
{
filecount = Directory.GetFiles("input").Length;
if (filecount < 1)
{
label1.Text = "No files in input folder.";
button1.Enabled = false;
button1.Refresh();
}
else
{
label1.Text = "File count: " + filecount;
}
}
}
private void button1_Click(object sender, EventArgs e)
{
startconvert();
}
private void startconvert()
{
if (!Directory.Exists("output"))
{
Directory.CreateDirectory("output");
}
int processed = 0;
string[] fileEntries = Directory.GetFiles("input");
foreach (string fileName in fileEntries)
{
//files an converter weiterreichen
convert(fileName);
processed++;
if (processed % 10 == 0)
{
label2.Text = "Processed: " + processed.ToString();
label2.Refresh();
}
}
}
private void convert(string input)
{
{
//hier wird mit dem SR die Textdatei durchgegangen und bei einem form feed eine neue PDF Seite gestartet
//Ich hab nur den Font und das Seitenlayout etwas angepasst, der Originalcode kommt von hier http://forum.pdfsharp.de/viewtopic.php?f=8&t=3072
const double LINE_SPACING = 6.8;
const double FONT_SIZE = 7.2;
const int MAX_LINES = 112;
StreamReader sr = new StreamReader(input, System.Text.Encoding.Default);
PdfDocument document = new PdfDocument();
XFont font = new XFont("Courier New", FONT_SIZE, XFontStyle.Regular, null);
string textAfterFormFeed = "";
while (sr.Peek() >= 0)
{
PdfPage page = document.AddPage();
XGraphics gfx = XGraphics.FromPdfPage(page);
bool formFeed = false;
string buffer = "";
double pos = 30;
int lines = 0;
if (textAfterFormFeed != "")
{
gfx.DrawString(textAfterFormFeed, font, XBrushes.Black, new XRect(12, pos, page.Width, page.Height), XStringFormats.TopLeft);
pos = pos + LINE_SPACING;
lines++;
textAfterFormFeed = "";
}
while (sr.Peek() >= 0 && !formFeed)
{
buffer = sr.ReadLine();
if (buffer.IndexOf("\x0c") >= 0)
{
formFeed = true;
if (buffer.IndexOf("\x0c") + 1 != buffer.Length)
textAfterFormFeed = buffer.Substring(buffer.IndexOf("\x0c") + 1, buffer.Length - buffer.IndexOf("\x0c") - 1);
if (buffer.IndexOf("\x0c") > 0)
gfx.DrawString(buffer.Substring(0, buffer.IndexOf("\x0c")), font, XBrushes.Black, new XRect(12, pos, page.Width, page.Height), XStringFormats.TopLeft);
}
else
gfx.DrawString(buffer, font, XBrushes.Black, new XRect(12, pos, page.Width, page.Height), XStringFormats.TopLeft);
pos = pos + LINE_SPACING;
lines++;
if (lines > MAX_LINES)
formFeed = true;
}
}
sr.Close();
sr.Dispose();
string output = input.Replace("input\\", "");
output = output.Replace(".txt", "");
document.Save("output\\" + output + ".pdf");
document.Close();
}
}
}
}
[/src]
using System.IO;
using System.Reflection;
using PdfSharp.Drawing;
using PdfSharp.Pdf;
using System.Windows.Forms;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
public static int filecount;
public Form1()
{
//eingebettete pdfsharp.dll wird hier eingelesen
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
string resourceName = new AssemblyName(args.Name).Name + ".dll";
string resource = Array.Find(this.GetType().Assembly.GetManifestResourceNames(), element => element.EndsWith(resourceName));
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource))
{
Byte[] assemblyData = new Byte[stream.Length];
stream.Read(assemblyData, 0, assemblyData.Length);
return Assembly.Load(assemblyData);
}
};
InitializeComponent();
//überprüfen ob der input ordner existiert und dateien enthält
invoiceamount();
}
private void invoiceamount()
{
if (!Directory.Exists("input"))
{
label1.Text = "No input folder found.";
button1.Enabled = false;
button1.Refresh();
}
else
{
filecount = Directory.GetFiles("input").Length;
if (filecount < 1)
{
label1.Text = "No files in input folder.";
button1.Enabled = false;
button1.Refresh();
}
else
{
label1.Text = "File count: " + filecount;
}
}
}
private void button1_Click(object sender, EventArgs e)
{
startconvert();
}
private void startconvert()
{
if (!Directory.Exists("output"))
{
Directory.CreateDirectory("output");
}
int processed = 0;
string[] fileEntries = Directory.GetFiles("input");
foreach (string fileName in fileEntries)
{
//files an converter weiterreichen
convert(fileName);
processed++;
if (processed % 10 == 0)
{
label2.Text = "Processed: " + processed.ToString();
label2.Refresh();
}
}
}
private void convert(string input)
{
{
//hier wird mit dem SR die Textdatei durchgegangen und bei einem form feed eine neue PDF Seite gestartet
//Ich hab nur den Font und das Seitenlayout etwas angepasst, der Originalcode kommt von hier http://forum.pdfsharp.de/viewtopic.php?f=8&t=3072
const double LINE_SPACING = 6.8;
const double FONT_SIZE = 7.2;
const int MAX_LINES = 112;
StreamReader sr = new StreamReader(input, System.Text.Encoding.Default);
PdfDocument document = new PdfDocument();
XFont font = new XFont("Courier New", FONT_SIZE, XFontStyle.Regular, null);
string textAfterFormFeed = "";
while (sr.Peek() >= 0)
{
PdfPage page = document.AddPage();
XGraphics gfx = XGraphics.FromPdfPage(page);
bool formFeed = false;
string buffer = "";
double pos = 30;
int lines = 0;
if (textAfterFormFeed != "")
{
gfx.DrawString(textAfterFormFeed, font, XBrushes.Black, new XRect(12, pos, page.Width, page.Height), XStringFormats.TopLeft);
pos = pos + LINE_SPACING;
lines++;
textAfterFormFeed = "";
}
while (sr.Peek() >= 0 && !formFeed)
{
buffer = sr.ReadLine();
if (buffer.IndexOf("\x0c") >= 0)
{
formFeed = true;
if (buffer.IndexOf("\x0c") + 1 != buffer.Length)
textAfterFormFeed = buffer.Substring(buffer.IndexOf("\x0c") + 1, buffer.Length - buffer.IndexOf("\x0c") - 1);
if (buffer.IndexOf("\x0c") > 0)
gfx.DrawString(buffer.Substring(0, buffer.IndexOf("\x0c")), font, XBrushes.Black, new XRect(12, pos, page.Width, page.Height), XStringFormats.TopLeft);
}
else
gfx.DrawString(buffer, font, XBrushes.Black, new XRect(12, pos, page.Width, page.Height), XStringFormats.TopLeft);
pos = pos + LINE_SPACING;
lines++;
if (lines > MAX_LINES)
formFeed = true;
}
}
sr.Close();
sr.Dispose();
string output = input.Replace("input\\", "");
output = output.Replace(".txt", "");
document.Save("output\\" + output + ".pdf");
document.Close();
}
}
}
}
[/src]