请查看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: