I'm trying to insert a line separator (you know, that horizontal line that runs across documents) into my document with iText. I've found some resources via Google that use com.lowagie.text.pdf.draw.LineSeparator but the version of iText that I'm using (1.4.2) doesn't seem to have that package.
Can anyone suggest another way to add a nice line seperator for my pdf? And please don't say update the .jar-- I'm locked in to 1.4.2.
Thanks!
There is a bit of a messy way around this in the earlier versions of iText. If you store the element above the horizontal line in a PdfPCell, you can then set the border of that to show only the bottom. (That cell can also be blank if needed)
PdfPCell myCell = new PdfPCell(new Paragraph("Hello World") );
myCell.setBorder(Rectangle.BOTTOM);
The result should look like (solid line, not checkered)
Hello World
-----------
This should give you what you desire. Not the optimal solution but it is a way to work around the limitations of the old jar.
For your reference, if you want to perform this trick to put a line on top and below your text to give a result of
-----------
Hello World
-----------
The argument to setBorder() is an int which you can use bitwise operation on to manipulate the values. So the above example can would be accomplished with
myCell.setBorder(Rectangle.BOTTOM | Rectangle.TOP);
edit: Example
//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
This should create you a table which looks something like the following (assuming you correct my typos)
Hello World
------------------------------------
Bottom Left | Bottom Right
LineSeparator ls = new LineSeparator();
document.add(new Chunk(ls));
Example: iText in action
I'm also in favor of using Line elements rather than tables... do not repeat HTML formatting mistakes !
final LineSeparator lineSeparator = new LineSeparator();
lineSeparator.drawLine(pdfCB, leftX, rightX, y);
Just Add a line separator object to pdf document object. That should be it
LineSeparator objectName = new LineSeparator();
document.add(objectName);
The solution given by Sean offer more flexibility when dealing with a text underlined by the line separator.
I don't know if LineSeparator can do that, it seems to be meant to be just a line separator.
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);
Hope this can help.
Should print something like this .
I also faced the similar problem as my company was also using older version of iText i.e. 1.4.2. These are the two solutions that I propose for creating horizontal rule. First one uses Graphic and second uses Table with bottom border. Both works fine for me.
Solution 1 :
protected static final Graphic HR = new Graphic();
static {
HR.setHorizontalLine(1f, 100f, Color.BLACK);
}
Solution 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 : The reason we can not update JAR is that older versions of iText are free for commercial use and newer versions are paid.
Hope that it helps!
table.setExtendLastRow(true);
will do it!
A simple way, if you want a whole new line:
document.add(Chunk.NEWLINE);
LineSeparator ls = new LineSeparator();
document.add(new Chunk(ls));
I found this most closely resembles an HTML <HR>
tag:
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)