在itext

时间:2018-07-16 14:41:16

标签: java itext

我正在为PDF单元格编写单元格事件。我需要写一些文本,并在该文本后附加超链接。 一切正常,但超链接未显示且不可点击。 我正在使用 itext5

注意:我的要求是在单元事件中而不是在普通单元中编写代码(在内部搜索,所有示例均针对普通单元)。

private static class AddHyperLink implements PdfPCellEvent {

    public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) {

        Paragraph mainPragraph = new Paragraph();
        Chunk descCk = new Chunk("This is "), descFont);

        mainPragraph.add(descCk);
        Chunk orgDiscriptionMore = new Chunk("HyperLink");
        orgDiscriptionMore.setAnchor("http:/www.google.com");
        mainPragraph.add(orgDiscriptionMore);

        PdfContentByte canvas = canvases[PdfPTable.TEXTCANVAS];
        ColumnText ct = new ColumnText(canvas);

        ct.setSimpleColumn(position);
        ct.addElement(mainPragraph);

        ct.go();
    }
}

1 个答案:

答案 0 :(得分:0)

简而言之

基本上,您的代码对我有用,您只需要为其提供足够大的单元格即可工作!

详细信息

更正明显的错误

Chunk descCk = new Chunk("This is "), descFont);

显然是错误的,左括号和右括号不匹配。而且由于您没有在任何地方提供descFont,因此我只是将其删除并将行减少为

Chunk descCk = new Chunk("This is ");

ct.go();

显然会导致编译错误,因为该方法被声明为throws DocumentException。我只是将其封装在try {} catch() {}中:

try {
    ct.go();
} catch (DocumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

现在您的班级可以编译了...

Cf. the inner class AddHyperLink in the CreateLink test

啊,显然还有一个细节需要修正:

orgDiscriptionMore.setAnchor("http:/www.google.com");

URL无效,要使其正常工作,请使用有效的URL:

orgDiscriptionMore.setAnchor("http://www.google.com");

提供足够大的单元格

要验证侦听器是否正常运行,我们只需要一个表,该表的单元格足够大,可以容纳您要添加的文本,例如

Image image = Image.getInstance(...);
image.scaleToFit(110,110);

Document doc = new Document();
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(new File(RESULT_FOLDER, "link-in-cell-event.pdf")));
writer.setCompressionLevel(0);
doc.open();

PdfPTable table = new PdfPTable(1);
PdfPCell cell = new PdfPCell(image);
cell.setCellEvent(new AddHyperLink());

table.addCell(cell);
doc.add(table);

doc.close();

CreateLink测试testCreateLinkInCellEvent

示例图片的结果:

screen shot

因此,它可以正常工作。