Альтернатива LineSeparator в старых версиях iText?

Я пытаюсь вставить разделитель строк (вы знаете, эту горизонтальную линию, которая проходит через документы) в свой документ с помощью iText. Я нашел некоторые ресурсы через Google, которые используют com.lowagie.text.pdf.draw.LineSeparator, но версия iText, которую я использую (1.4.2), похоже, не имеет этого пакета.

Может ли кто-нибудь предложить другой способ добавить хороший разделитель строк для моего PDF? И, пожалуйста, не говорите, что обновите .jar — я привязан к 1.4.2.

Спасибо!


person Fran Fitzpatrick    schedule 15.09.2010    source источник


Ответы (9)


В более ранних версиях iText это немного запутано. Если вы сохраните элемент над горизонтальной линией в PdfPCell, вы можете установить его границу так, чтобы отображалась только нижняя часть. (Эта ячейка также может быть пустой, если необходимо)

PdfPCell myCell = new PdfPCell(new Paragraph("Hello World") );
myCell.setBorder(Rectangle.BOTTOM);

Результат должен выглядеть так (сплошная линия, не шашечка)

Hello World
-----------

Это должно дать вам то, что вы желаете. Не оптимальное решение, но это способ обойти ограничения старой банки.

Для справки, если вы хотите выполнить этот трюк, чтобы поместить строку сверху и снизу вашего текста, чтобы получить результат

-----------
Hello World
-----------

Аргументом setBorder() является целое число, с которым вы можете использовать побитовую операцию для управления значениями. Таким образом, приведенный выше пример может быть выполнен с помощью

myCell.setBorder(Rectangle.BOTTOM | Rectangle.TOP);

редактировать: пример

//Create the table which will be 2 Columns wide and make it 100% of the page
PdfPTable myTable = new PdfPtable(2);
myTable.setWidthPercentage(100.0f);

//create a 3 cells and add them to the table
PdfPCell cellOne = new PdfPCell(new Paragraph("Hello World"));
PdfPCell cellTwo = new PdfPCell(new Paragraph("Bottom Left"));
PdfPcell cellThree = new PdfPCell(new Paragraph("Bottom Right"));

cellOne.setColspan(2);
cellOne.setBorder(Rectangle.BOTTOM);
cellOne.setHorizontalAlignment(Element.ALIGN_LEFT);

cellTwo.setBorder(Rectangle.NO_BORDER);
cellTwo.setHorizontalAlignment(Element.ALIGN_LEFT);
cellThree.setBorder(Rectangle.LEFT);
cellThree.setHorizontalAlignment(Element.ALIGN_RIGHT);

//Add the three cells to the table
myTable.addCell(cellOne);
myTable.addCell(cellTwo);
myTable.addCell(cellThree);

//Do something to add the table to your root document

Это должно создать вам таблицу, которая выглядит примерно так (при условии, что вы исправите мои опечатки)

Hello World
------------------------------------
Bottom Left      |      Bottom Right
person Sean    schedule 15.09.2010
comment
Похоже, это почти ТОЧНО то, что мне нужно, но будет ли граница заполнять всю страницу или идти только до конца того, что находится в абзаце? -- В основном мне нужна линия, идущая от одной стороны страницы к другой. - person Fran Fitzpatrick; 15.09.2010
comment
Дал вам пример того, как это сделать в редактировании выше. Я только что написал это здесь, так что не кричите, когда найдете синтаксические ошибки. Ключевая часть — посмотреть на myTable.setWidthPercentage(). Это по отношению к родительскому элементу. Если вы добавите это к объекту Document, у вас будет таблица, занимающая 100% документа. - person Sean; 15.09.2010

LineSeparator ls = new LineSeparator();
document.add(new Chunk(ls));

Пример: iText в действии

person ftarucco    schedule 31.05.2011
comment
ОП специально сказал, что не может его использовать. - person Ricardo A.; 28.05.2019

Я также за использование элементов Line, а не таблиц... не повторяйте ошибок форматирования HTML!

final LineSeparator lineSeparator = new LineSeparator();
lineSeparator.drawLine(pdfCB, leftX, rightX, y);
person Laurent    schedule 25.05.2012
comment
хехехе... Я искал именно это, то есть добавление LineSeparator к PdfContentByte. ОТЛИЧНО РАБОТАЕТ! :) - person Leniel Maccaferri; 06.07.2013

Просто добавьте объект-разделитель строк в объект документа PDF. Это должно быть так

LineSeparator objectName = new LineSeparator();              
document.add(objectName);
person pritesh dhebar    schedule 01.12.2012
comment
дублированный ответ. И оператор специально сказал, что он не может использовать LineSeparator. - person Ricardo A.; 28.05.2019

Решение, данное Шоном, обеспечивает большую гибкость при работе с текстом, подчеркнутым разделителем строк. Я не знаю, может ли LineSeparator сделать это, кажется, это просто разделитель строк.

Paragraph ph = new Paragraph(new Phrase("My line separator", yourFont));
PdfPCell cell = new PdfPCell(ph);
cell.Border = Rectangle.BOTTOM_BORDER;
cell.BorderColor = new BaseColor(44, 67, 144);
cell.BorderWidth = 2f;

PdfPTable table = new PdfPTable(1);                
table.AddCell(cell);
table.HorizontalAlignment = Element.ALIGN_LEFT;
table.WidthPercentage = 100f;
doc.Add(table);

Надеюсь, это может помочь. Должно быть напечатано что-то вроде этого .Разделитель строк с текстом

person hdoghmen    schedule 09.11.2013

Я также столкнулся с аналогичной проблемой, поскольку моя компания также использовала более старую версию iText, то есть 1.4.2. Вот два решения, которые я предлагаю для создания горизонтального правила. Первый использует графику, а второй использует таблицу с нижней границей. Оба работают нормально для меня.

Решение 1:

protected static final Graphic HR = new Graphic();
  static {
    HR.setHorizontalLine(1f, 100f, Color.BLACK);
  }

Решение 2:

    private static void addHorizontalLine(Document document, PdfWriter writer) throws DocumentException, IOException{
    PdfPTable myTable = new PdfPTable(1);
    myTable.setWidthPercentage(100.0f);
    PdfPCell cellOne = new PdfPCell();
    cellOne.setBorder(Rectangle.BOTTOM);
    document.add(new Paragraph(" "));
    document.add(myTable);
}

PS: Причина, по которой мы не можем обновить JAR, заключается в том, что старые версии iText бесплатны для коммерческого использования, а более новые платные.

Надеюсь, что это поможет!

person Akshay Kumar    schedule 26.07.2017

table.setExtendLastRow(true);

сделаю это!

person Boolasa    schedule 21.12.2011

Простой способ, если вам нужна совершенно новая строка:

    document.add(Chunk.NEWLINE);
    LineSeparator ls = new LineSeparator();
    document.add(new Chunk(ls));
person luizMello    schedule 02.06.2016
comment
оп специально сказал, что он не может использовать LineSeparator - person Ricardo A.; 28.05.2019

Я обнаружил, что это больше всего похоже на HTML-тег <HR>:

import com.itextpdf.kernel.color.Color;
import com.itextpdf.kernel.pdf.canvas.draw.SolidLine;
import com.itextpdf.layout.element.LineSeparator;

...

final SolidLine lineDrawer = new SolidLine(1f);
lineDrawer.setColor(Color.GRAY);
document.add(new LineSeparator(lineDrawer));

(iText 7.0.0)

person David Lavender    schedule 06.03.2018