如何每25个字画一条线?

时间:2015-02-25 01:30:09

标签: position itextsharp line word draw

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

enter image description here

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

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

1 个答案:

答案 0 :(得分:0)

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

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()方法之间做了什么?我们定义一个破折号模式,我们移动到页面的左边,我们构造一个到右边的路径,然后我们画一个短的向上的线,用右边的一条线完成路径。一旦构建了路径,我们就会划线。

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

这就是结果every25words.pdf

enter image description here