【问题标题】:How to draw a line every 25 words?如何每25个字画一条线?
【发布时间】:2015-04-26 21:23:03
【问题描述】:

使用 iTextSharp,我创建了一个 pdf,将一些文本写入其中。 我需要的是每 25 个单词画一条线来分隔文本,如下图:

基本上,我需要这样做:每 25 个字画一条线,就像图像一样。

我知道有一种finding the position of a word on a page 的方法,但考虑到我正在将文本写入 pdf 文件,我想可能有一种方法可以计算它而无需真正找到文本位置,对吧?

【问题讨论】:

  • 请张贴一些你已经尝试过的和没有用的。 Stack Overflow 旨在在您遇到问题时为您提供帮助,而不是作为代码编写服务。
  • 我完全理解这一点。我不打算你们给我所有代码,但我真的不知道从哪里开始..真的不需要完整的代码(我的意思是,打开一个作家,打印文本,冲洗它,关闭它),但我确实需要一个提示 - 至少 - 我如何才能实现我正在寻找的东西,那就是每 N 个单词画一条线。基本上,我不知道的是如何获得一个单词的位置。如果我明白了,我想从固定位置画线到单词位置就不会那么难了。
  • 进一步阐述.. 我见过的查找某个文本位置的方法也不起作用,因为假设 N° 25 是“房子”,我可能在我的文本中的其他地方再次出现“房子”这个词,但我只关心文本中第 25 个单词。所以我想我可以一个字一个字地写,并进行计数..所以当我写第 25 个字时,然后以某种方式获得那个特定单词的位置,并在那里画线。但我不知道如何做到这一点。

标签: position itextsharp line word draw


【解决方案1】:

请查看Every25Words 示例。在该示例中,我使用readFile() 方法将文本文件读入String。然后,我根据空格的出现将文本拆分为单词,并将每个单词一个一个添加:

public void createPdf(String dest) throws IOException, DocumentException {
    Document document = new Document();
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
    writer.setPageEvent(new WordCounter());
    writer.setInitialLeading(16);
    document.open();
    String[] words = readFile().split("\\s+");
    Chunk chunk = null;
    for (String word : words) {
        if (chunk != null) {
            document.add(new Chunk(" "));
        }
        chunk = new Chunk(word);
        chunk.setGenericTag("");
        document.add(chunk);
    }
    document.close();
}

魔法发生在这一行:

writer.setPageEvent(new WordCounter());

chunk.setGenericTag("");

首先我们声明一个WordCounter 事件的实例。您可以为该类选择一个更好的名称,因为它不仅会计算单词,还会画一条虚线:

public class WordCounter extends PdfPageEventHelper {

    public int count = 0;

    @Override
    public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) {
        count++;
        if (count % 25 == 0) {
            PdfContentByte canvas = writer.getDirectContent();
            canvas.saveState();
            canvas.setLineDash(5, 5);
            canvas.moveTo(document.left(), rect.getBottom());
            canvas.lineTo(rect.getRight(), rect.getBottom());
            canvas.lineTo(rect.getRight(), rect.getTop());
            canvas.lineTo(document.right(), rect.getTop());
            canvas.stroke();
            canvas.restoreState();
        }
    }
}

你看到我们在saveState()restoreState() 方法之间做了什么吗?我们定义一个破折号模式,我们移动到页面的左边,我们在单词的右边构造一条路径,然后我们画一条向上的短线,以一条向右的线结束路径。一旦构建了路径,我们就可以画线了。

每次添加Chunk(我们使用了setGenericTag 方法)时都会触发此onGenericTag() 方法。

这就是结果的样子every25words.pdf

【讨论】:

  • 谢谢一百万,布鲁诺!不仅是为了帮助我,而且甚至通过示例给出了如此详细的解释。真的,非常感谢!!
  • 现在我重新审视了代码,得出的结论是,关键是要使用 PdfPageHandler 中的 OnGenericTag 事件。除非我知道有这样的事件......无论如何,再次感谢布鲁诺! PS:我完全赞成,但我缺乏足够的声誉:(
  • 没问题。我正在度假,但是当我看到您的问题已经收到一张反对票和一张接近票时,我决定给它一个赞成票和一个答案,因为这是一个原始要求和一个好问题。写这个例子很有趣(但现在我回到了假期模式)。
  • 再次感谢,祝您假期愉快! :=)
猜你喜欢
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
相关资源
最近更新 更多