使用iTextSharp,我创建了一个pdf写入一些文本。 我需要的是绘制一条线来分隔每25个单词的文本,如下图所示:
基本上,我需要这样做:每25个字画一条线,就像图像一样。
我知道有finding the position of a word on a page的方式,但考虑到我正在将文本写入pdf文件,我想可能有一种计算方法而无需找到文本位置,对?
答案 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: