Я работаю над созданием небольшой программы, которая просто берет файл .txt и преобразует его в PDF, и я хочу, чтобы PDF выглядел примерно так же, как и текстовый файл, если бы я использовал Microsoft Print to PDF. У меня это довольно близко, но когда строка текста превышает ширину страницы, она переносится на новую строку, и переносимый текст перекрывает текст над ней. Как заставить переносимый текст вести себя так, как будто я добавляю новый абзац в документ, не разбивая переносимый текст на новый абзац?
Вот мой старый код:
string dest = @"..\TXT2PDF\Test.pdf";
string source = @"..\TXT2PDF\test2.txt";
string fpath = @"..\TXT2PDF\consola.ttf";
string line;
FileInfo destFile = new FileInfo(dest);
destFile.Directory.Create();
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
PageSize ps = new PageSize(612, 792);
pdf.SetDefaultPageSize(ps);
Document document = new Document(pdf);
PdfFont font = PdfFontFactory.CreateFont(fpath);
StreamReader file = new StreamReader(source);
Console.WriteLine("Beginning Conversion");
document.SetLeftMargin(54);
document.SetRightMargin(54);
document.SetTopMargin(72);
document.SetBottomMargin(72);
while ((line = file.ReadLine()) != null)
{
Paragraph p = new Paragraph();
p.SetFixedLeading(4.8f);
p.SetFont(font).SetFontSize(10.8f);
p.SetPaddingTop(4.8f);
p.Add("\u00A0");
p.Add(line);
document.Add(p);
}
document.Close();
file.Close();
Console.WriteLine("Conversion Finished");
Console.ReadLine();
Вот мой новый код:
string dest = @"..\TXT2PDF\Test.pdf";
string source = @"..\TXT2PDF\test2.txt";
string fpath = @"..\TXT2PDF\consola.ttf";
string line;
FileInfo destFile = new FileInfo(dest);
destFile.Directory.Create();
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
PageSize ps = new PageSize(612, 792);
pdf.SetDefaultPageSize(ps);
Document document = new Document(pdf);
PdfFont font = PdfFontFactory.CreateFont(fpath, "cp1250", true);
StreamReader file = new StreamReader(source);
Console.WriteLine("Beginning Conversion");
document.SetLeftMargin(54);
document.SetRightMargin(54);
document.SetTopMargin(68);
document.SetBottomMargin(72);
document.SetProperty(Property.LEADING, new Leading(Leading.MULTIPLIED, 1.018f));
Paragraph p = new Paragraph();
p.SetFont(font).SetFontSize(10.8f);
p.SetCharacterSpacing(0.065f);
string nl = "";
while ((line = file.ReadLine()) != null)
{
Text t = new Text(nl + "\u0000" + line);
p.Add(t);
nl = "\n";
}
document.Add(p);
document.Close();
file.Close();
Console.WriteLine("Conversion Finished");
Console.ReadLine();
Вот пример того, как выглядит вывод: 
Редактировать
По рекомендации mkl я заменил p.SetFixedLeading (4.8f) на document.SetProperty (Property.LEADING, новый Leading (Leading.MULTIPLIED, 1.018f)). Это устраняло проблему с пробелами для обернутого текста, но это заставляло пространство между абзацами увеличиваться больше, чем я хотел. Чтобы обойти это, я решил использовать только один объект абзаца и добавить каждую строку в качестве нового текстового объекта к абзацу. Я пробовал это однажды, но текстовые объекты не переходили на новую строку. Мне пришлось добавить символ новой строки в начало каждого текстового объекта, чтобы они находились в отдельной строке.
Вот так выглядит вывод: 