Почему Java удаляет пустое пространство между абзацами во время преобразования в PDF? - PullRequest
1 голос
/ 02 апреля 2019

Почему Java удаляет пробелы между абзацами? Я использую iText5 для преобразования файла .rtf в PDF. Файл содержит отчеты, и каждый отчет находится на отдельной странице. После преобразования пробелы между абзацами удаляются, что делает пейджинг не таким, каким он был до преобразования.

Я пытался использовать Rectangle для установки размера страницы, но, поскольку в отчете нет одинакового количества строк, некоторые отчеты по-прежнему используют одну и ту же страницу с другими отчетами.

//Set PDF layout
//Rectangle rectangle = new Rectangle (0, 0, 1350, 16615);
Document document = new Document(PageSize.A4.rotate());
document.setMargins(13, 0, 10, 10);           
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();

br = new BufferedReader(new FileReader(TEXT));

String line;
Paragraph p;       
//PDF font configuration
Font normal = new Font(FontFamily.COURIER, 5);
Font bold = new Font(FontFamily.COURIER, 5, Font.BOLD);

//add page to PDF       
boolean title = true;
    while ((line = br.readLine()) != null) {               
    p = new Paragraph(line, title ? bold : normal);
        document.add(p);
     }           
        document.close();

Я не хочу, чтобы программа удаляла пробелы между абзацами.

1 Ответ

0 голосов
/ 02 апреля 2019

Сначала

Я сомневаюсь, что ваш вклад действительно является файлом RTF. RTF-файл выглядит так

{\rtf1\ansi{\fonttbl\f0\fswiss Helvetica;}\f0\pard
This is some {\b bold} text.\par
}

(из Википедия о расширенном текстовом формате )

Если вы добавите этот файл в свой код, вы получите что-то вроде

screen shot

что, по-видимому, не то, что вы хотите.

Итак, давайте предположим, что вы вводите простой текст, который вы читаете построчно.

Как предотвратить выпадение пустых строк

Обратите внимание, что Paragraph, построенный из пустой строки, практически не требует вертикального пробела, например,

doc.add(new Paragraph("1 Between this line and line 3 there is an empty paragraph."));
doc.add(new Paragraph(""));
doc.add(new Paragraph("3 This is line 3."));
doc.add(new Paragraph("4 Between this line and line 6 there is a paragraph with only a space."));
doc.add(new Paragraph(" "));
doc.add(new Paragraph("6 This is line 6."));

( ПустыеПараграфы Тест testEmptyParagraphsForFazriBadri)

Результаты в

screen shot

Обратите внимание, что строка 2 фактически отброшена.

Причина в том, что Paragraph(String string) конструктор - это удобное сокращение,

p = new Paragraph(string);

по существу эквивалентно

p = new Paragraph();
if (string != null && string.length() != 0) {
    p.add(new Chunk(string));
}

Таким образом, для new Paragraph("") блок не добавляется в абзац, он пуст, для его фрагментов не требуется вертикальное пространство.

В таком случае вы можете начать играть с Leading, SpacingBefore или SpacingAfter самого абзаца или окружающих абзацев, но самый простой способ, безусловно, состоит в замене пустой строки "" на строка, содержащая пробел " ".

В вашем случае это можно сделать, заменив

while ((line = br.readLine()) != null) {               
    p = new Paragraph(line, title ? bold : normal);
    document.add(p);
}           

от

while ((line = br.readLine()) != null) {               
    p = new Paragraph(line.length() == 0 ? " " : line, title ? bold : normal);
    document.add(p);
}           
...