【问题标题】:How to add border to paragraph in itext pdf library in java?如何在java中的itext pdf库中为段落添加边框?
【发布时间】:2015-05-05 12:58:07
【问题描述】:

我在 java 中使用 itext pdf 库创建了一个段落。我必须为段落添加边框,而不是整个文档。怎么办?

【问题讨论】:

  • @user3271518 ...还没有找到任何东西
  • @DeepikaRajani 适用于整个文档而不是段落
  • 是的,我知道。我认为这可能会有所帮助。

标签: java itext


【解决方案1】:

请查看BorderForParagraph 示例。它显示了如何为这样的段落添加边框:

没有方法可以让您为Paragraph 创建边框,但您可以创建一个PdfPageEvent 实现,允许您根据Paragraph 的开始和结束位置绘制一个矩形:

class ParagraphBorder extends PdfPageEventHelper {
    public boolean active = false;
    public void setActive(boolean active) {
        this.active = active;
    }

    public float offset = 5;
    public float startPosition;

    @Override
    public void onParagraph(PdfWriter writer, Document document, float paragraphPosition) {
        this.startPosition = paragraphPosition;
    }

    @Override
    public void onParagraphEnd(PdfWriter writer, Document document, float paragraphPosition) {
        if (active) {
            PdfContentByte cb = writer.getDirectContentUnder();
            cb.rectangle(document.left(), paragraphPosition - offset,
                document.right() - document.left(), startPosition - paragraphPosition);
            cb.stroke();
        }
    }
}

如您所见,我引入了一个名为activeboolean 参数。默认情况下,我将此参数设置为false。我还创建了一个offset(更改此值以微调结果)和一个startPosition 参数。

每次 iText 开始渲染 Paragraph 对象时,startPosition 值都会更新。每次 iText 结束渲染 Paragraph 时,如果 activetrue,则会绘制一个矩形(否则不会发生任何事情)。

我们这样使用这个事件:

public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
    ParagraphBorder border = new ParagraphBorder();
    writer.setPageEvent(border);
    document.open();
    document.add(new Paragraph("Hello,"));
    document.add(new Paragraph("In this document, we'll add several paragraphs that will trigger page events. As long as the event isn't activated, nothing special happens, but let's make the event active and see what happens:"));
    border.setActive(true);
    document.add(new Paragraph("This paragraph now has a border. Isn't that fantastic? By changing the event, we can even provide a background color, change the line width of the border and many other things. Now let's deactivate the event."));
    border.setActive(false);
    document.add(new Paragraph("This paragraph no longer has a border."));
    document.close();
}

如您所见,我们使用setPageEvent() 方法向PdfWriter 声明事件。我们像这样激活事件:

border.setActive(true);

我们这样停用它:

border.setActive(false);

只是概念证明!如果您希望它适用于跨越一页以上的段落,您将需要实现 onStartPage()onEndPage() 方法。这显示在BorderForParagraph2

onStartPage()onEndPage() 的实现很简单:

class ParagraphBorder extends PdfPageEventHelper {
    public boolean active = false;
    public void setActive(boolean active) {
        this.active = active;
    }

    public float offset = 5;
    public float startPosition;

    @Override
    public void onStartPage(PdfWriter writer, Document document) {
        startPosition = document.top();
    }

    @Override
    public void onParagraph(PdfWriter writer, Document document, float paragraphPosition) {
        this.startPosition = paragraphPosition;
    }

    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        if (active) {
            PdfContentByte cb = writer.getDirectContentUnder();
            cb.rectangle(document.left(), document.bottom() - offset,
                document.right() - document.left(), startPosition - document.bottom());
            cb.stroke();
        }
    }

    @Override
    public void onParagraphEnd(PdfWriter writer, Document document, float paragraphPosition) {
        if (active) {
            PdfContentByte cb = writer.getDirectContentUnder();
            cb.rectangle(document.left(), paragraphPosition - offset,
                document.right() - document.left(), startPosition - paragraphPosition);
            cb.stroke();
        }
    }
}

【讨论】:

  • 根据具体要求,为跨越分页符的段落绘制的矩形应在底部(第一页)或顶部(第二页)甚至顶部和底部打开在内页上跨越两页以上的段落。但这对读者来说是一个很好的练习……;)
  • 如果段落在一页上,您的代码工作正常,但如果段落从一页开始并在另一页结束,我有问题它有问题。它首先添加段落的一部分页面在边框内,其他页面上的部分是无边框的。
  • @mominapk 这正是the second example 的意义所在。您没有阅读完整的答案吗?你没看到你说的在第二个屏幕截图中是矛盾的吗?
  • 当我遵循第二个示例时,边界无处不在,我无法删除边界,即 border.setActive(false) 不起作用。实际上,我已经在章节 n 章节中添加了标题作为段落和其他描述,而不是段落,而是在 onSectionEnd() 等部分方法中编写了您的代码,但也获得了标题段落周围的边框。请帮助我解决这个问题已经 4 天了。
  • 它对我有用。也许你应该聘请专家。我认为聘请专家 1 天的费用可能与您 4 天的时间一样昂贵。或者你可以试着问一个体面的问题。也许这也行。
【解决方案2】:

试试这个:

public static void main(String[] args) {
     Document document = new Document();
    // step 2
    PdfWriter writer=PdfWriter.getInstance(document, new FileOutputStream("somepath"));
    document.setPageSize(PageSize.LETTER);
    document.setMargins(36, 72, 108, 180);
    document.setMarginMirroring(false);
    // step 3
    document.open();
    // step 4
    Rectangle rect= new Rectangle(36,108);
    rect.enableBorderSide(1);
    rect.enableBorderSide(2);
    rect.enableBorderSide(4);
    rect.enableBorderSide(8);
    rect.setBorder(2);
    rect.setBorderColor(BaseColor.BLACK);
    rect.setBorderWidth(2);
    document.add(rect);
}

【讨论】:

  • 基本上你需要依赖下面的方法 rect.setBorder(Rectangle.BOX); rect.setBorderWidth(2);
  • 在此您将此矩形添加到文档中,但我想为段落添加边框,例如 - Paragraph par = new Paragraph(); par.add(rect);
  • par.setBorder(someparam) & par.setBorderWidth(someWidth) 也适用于段落的对象,请尝试。
  • 在 Paragraph 类中没有可用的方法 - setBorder 和 setBorderWidth。
  • 答案是错误的。我会提供一个正确的答案。
猜你喜欢
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 2012-11-20
  • 1970-01-01
相关资源
最近更新 更多