Предотвращение наложения обернутого текста в iText7 - PullRequest
0 голосов
/ 11 марта 2020

Я работаю над созданием небольшой программы, которая просто берет файл .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();

Вот пример того, как выглядит вывод: output

Редактировать

По рекомендации mkl я заменил p.SetFixedLeading (4.8f) на document.SetProperty (Property.LEADING, новый Leading (Leading.MULTIPLIED, 1.018f)). Это устраняло проблему с пробелами для обернутого текста, но это заставляло пространство между абзацами увеличиваться больше, чем я хотел. Чтобы обойти это, я решил использовать только один объект абзаца и добавить каждую строку в качестве нового текстового объекта к абзацу. Я пробовал это однажды, но текстовые объекты не переходили на новую строку. Мне пришлось добавить символ новой строки в начало каждого текстового объекта, чтобы они находились в отдельной строке.

Вот так выглядит вывод: newoutput

1 Ответ

0 голосов
/ 12 марта 2020

Вместо того чтобы делать каждую строку из txt-файла новым абзацем, я изменил каждую строку на новый текстовый объект, а затем добавил каждый текстовый объект в один абзац. Затем я перестал использовать фиксированное ведение для абзаца и начал использовать умноженное ведение для самого документа, используя document.SetProperty (Property.LEADING, new Leading (Leading.MULTIPLIED, 1.018f)). Я мог бы также использовать p.SetMultipliedLeading (1.018f), хотя. Это дало желаемый интервал в документе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...