如何每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:
我使用 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: