如何每25个字画一条线?

How to draw a line every 25 words?

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

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

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

请查看 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 事件的实例。您可以为 class 选择一个更好的名称,因为它不仅计算字数,而且还会画一条虚线:

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() 方法之间做了什么吗?我们定义了一个破折号模式,我们移动到页面的左侧,我们在单词的右侧构建了一条路径,然后我们画了一条向上的短线,以右侧的一条线结束路径。构建路径后,我们画线。

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

结果是这样的every25words.pdf: