iText旧版本中LineSeparator的替代方案?

时间:2010-09-15 16:21:05

标签: java pdf itext

我正在尝试使用iText将行分隔符(您知道,在文档中运行的水平线)插入到我的文档中。我通过Google找到了一些使用com.lowagie.text.pdf.draw.LineSeparator的资源,但我正在使用的iText版本(1.4.2)似乎没有该软件包。

有人可以建议另一种方法为我的pdf添加一个好的行分隔符吗?请不要说更新.jar--我已经锁定到1.4.2。

谢谢!

9 个答案:

答案 0 :(得分:26)

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

示例:iText in action

答案 1 :(得分:15)

在早期版本的iText中,有一种混乱的方式。如果将元素存储在PdfPCell中的水平线上方,则可以将其边框设置为仅显示底部。 (如果需要,该单元格也可以为空白)

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

结果看起来像(实线,没有方格)

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

这应该能满足你的需求。不是最佳解决方案,但它是一种解决旧罐子限制的方法。

供您参考,如果您想要执行此操作,在文本顶部和下方放置一行以显示结果

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

setBorder()的参数是一个int,您可以使用按位操作来操作值。所以上面的例子可以用

完成
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

答案 2 :(得分:8)

我也赞成使用Line元素而不是表格...不要重复HTML格式错误!

final LineSeparator lineSeparator = new LineSeparator();
lineSeparator.drawLine(pdfCB, leftX, rightX, y);

答案 3 :(得分:4)

只需将行分隔符对象添加到pdf文档对象即可。应该是它

LineSeparator objectName = new LineSeparator();              
document.add(objectName);

答案 4 :(得分:2)

Sean给出的解决方案在处理行分隔符下划线的文本时提供了更大的灵活性。 我不知道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);

希望这可以提供帮助。 应该打印这样的东西。A line separator with text

答案 5 :(得分:2)

我也遇到了类似的问题,因为我的公司也在使用旧版iText,即1.4.2。这些是我建议用于创建水平规则的两种解决方案。第一个使用Graphic,第二个使用带底边的Table。两者都适合我。

解决方案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可以免费用于商业用途,并且支付更新的版本。

希望它有所帮助!

答案 6 :(得分:1)

table.setExtendLastRow(true);

会做到的!

答案 7 :(得分:0)

一种简单的方法,如果你想要一个全新的行:

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

答案 8 :(得分:0)

我发现这非常类似于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)