如何使用 itext jar 在 pdf 中编写项目符号列表,但项目不应该在下一行
How to write bulleted list in pdf using itext jar but item should not in next line
下面是我从网上搜索到的代码。此代码在下一行打印每个列表项,但我不想那样。
下面是我想用 pdf 格式编写的预期输出:
List orderedList = new List(List.ORDERED);
orderedList.add(new ListItem("Item 1"));
orderedList.add(new ListItem("Item 2"));
orderedList.add(new ListItem("Item 3"));
预期输出:
您实际上并不需要 List
,您只需要 Paragraph
中的一系列带项目符号的项目。
我创建了一个概念证明,向您展示了实现此目标的三种方法:好、更好和最好:
假设我有这些物品:
public static final String[] ITEMS = {
"Insurance system", "Agent", "Agency", "Agent Enrollment", "Agent Settings",
"Appointment", "Continuing Education", "Hierarchy", "Recruiting", "Contract",
"Message", "Correspondence", "Licensing", "Party"
};
而且我有以下字体和块:
Font zapfdingbats = new Font(FontFamily.ZAPFDINGBATS, 8);
Font font = new Font();
Chunk bullet = new Chunk(String.valueOf((char) 108), zapfdingbats);
那么 "good" 示例如下所示:
Paragraph p = new Paragraph("Items can be split if they don't fit at the end: ", font);
for (String item: ITEMS) {
p.add(bullet);
p.add(new Phrase(" " + item + " ", font));
}
document.add(p);
我创建了一个 Paragraph
,我遍历了所有的项目,然后我添加了一个项目符号,一个 space 字符,项目和一个 space 字符到段落中有物品的次数。
如您所见,"Agent Enrollment" 可能存在问题。由于 "Agent" 和 "Enrollment" 之间的 space 字符,该项目被一分为二。这对您来说可能是可以接受的,但我们假设不是。
这使我们找到了更好的解决方案:
p = new Paragraph("Items can't be split if they don't fit at the end: ", font);
for (String item: ITEMS) {
p.add(bullet);
p.add(new Phrase("\u00a0" + item.replace(' ', '\u00a0') + " ", font));
}
document.add(p);
代替普通的spaces,我们现在引入不间断spaces(/u00a0
)。这已经更好了,因为带有 space 的项目(例如 "Agent Enrollment")不再拆分。不幸的是,我们处理的是子弹和物品的不同块,所以子弹和它的物品无论如何都可能被分割开来。这导致最佳解决方案:
BaseFont bf = BaseFont.createFont("c:/windows/fonts/arial.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font f = new Font(bf, 12);
p = new Paragraph("Items can't be split if they don't fit at the end: ", f);
for (String item: ITEMS) {
p.add(new Phrase("\u2022\u00a0" + item.replace(' ', '\u00a0') + " ", f));
}
我们没有使用知道如何绘制项目符号的字体 (Zapfdingbats) 和不知道如何绘制项目符号的字体 (Helvetica),而是使用可以绘制两者的字体 (Arial)。在我的例子中,arial.ttf
可以在我的 c:/windows/fonts
目录中找到。
我仍然使用\u0060
来避免项目被拆分,但我也引入了\u2022
,这是存储在Arial中的项目符号的UNICODE值。
有关完整的源代码,请参阅 Bullets. For the resulting PDF, see bullets.pdf
import com.lowagie.text.*;
import com.lowagie.text.pdf.PdfWriter
import javax.swing.text.Document
public static void main(String[] args){
String[] ITEMS = ["Insurance system", "Agent", "Agency", "Agent Enrollment", "Agent Settings",
"Appointment", "Continuing Education", "Hierarchy", "Recruiting", "Contract",
"Message", "Correspondence", "Licensing", "Party"];
com.lowagie.text.Document document = new com.lowagie.text.Document();
PdfWriter.getInstance(document,new FileOutputStream("List1.pdf"));
Font zapfdingbats = new Font();
Font font = new Font();
Chunk bullet = new Chunk("\u2022", zapfdingbats);
document.open();
Paragraph p = new Paragraph("Items can be split if they don't fit at the end: ", font);
for (String item: ITEMS) {
p.add(bullet);
p.add(new Phrase(" " + item + " ", font));
}
document.add(p);
document.close();
}
下面是我从网上搜索到的代码。此代码在下一行打印每个列表项,但我不想那样。
下面是我想用 pdf 格式编写的预期输出:
List orderedList = new List(List.ORDERED);
orderedList.add(new ListItem("Item 1"));
orderedList.add(new ListItem("Item 2"));
orderedList.add(new ListItem("Item 3"));
预期输出:
您实际上并不需要 List
,您只需要 Paragraph
中的一系列带项目符号的项目。
我创建了一个概念证明,向您展示了实现此目标的三种方法:好、更好和最好:
假设我有这些物品:
public static final String[] ITEMS = {
"Insurance system", "Agent", "Agency", "Agent Enrollment", "Agent Settings",
"Appointment", "Continuing Education", "Hierarchy", "Recruiting", "Contract",
"Message", "Correspondence", "Licensing", "Party"
};
而且我有以下字体和块:
Font zapfdingbats = new Font(FontFamily.ZAPFDINGBATS, 8);
Font font = new Font();
Chunk bullet = new Chunk(String.valueOf((char) 108), zapfdingbats);
那么 "good" 示例如下所示:
Paragraph p = new Paragraph("Items can be split if they don't fit at the end: ", font);
for (String item: ITEMS) {
p.add(bullet);
p.add(new Phrase(" " + item + " ", font));
}
document.add(p);
我创建了一个 Paragraph
,我遍历了所有的项目,然后我添加了一个项目符号,一个 space 字符,项目和一个 space 字符到段落中有物品的次数。
如您所见,"Agent Enrollment" 可能存在问题。由于 "Agent" 和 "Enrollment" 之间的 space 字符,该项目被一分为二。这对您来说可能是可以接受的,但我们假设不是。
这使我们找到了更好的解决方案:
p = new Paragraph("Items can't be split if they don't fit at the end: ", font);
for (String item: ITEMS) {
p.add(bullet);
p.add(new Phrase("\u00a0" + item.replace(' ', '\u00a0') + " ", font));
}
document.add(p);
代替普通的spaces,我们现在引入不间断spaces(/u00a0
)。这已经更好了,因为带有 space 的项目(例如 "Agent Enrollment")不再拆分。不幸的是,我们处理的是子弹和物品的不同块,所以子弹和它的物品无论如何都可能被分割开来。这导致最佳解决方案:
BaseFont bf = BaseFont.createFont("c:/windows/fonts/arial.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font f = new Font(bf, 12);
p = new Paragraph("Items can't be split if they don't fit at the end: ", f);
for (String item: ITEMS) {
p.add(new Phrase("\u2022\u00a0" + item.replace(' ', '\u00a0') + " ", f));
}
我们没有使用知道如何绘制项目符号的字体 (Zapfdingbats) 和不知道如何绘制项目符号的字体 (Helvetica),而是使用可以绘制两者的字体 (Arial)。在我的例子中,arial.ttf
可以在我的 c:/windows/fonts
目录中找到。
我仍然使用\u0060
来避免项目被拆分,但我也引入了\u2022
,这是存储在Arial中的项目符号的UNICODE值。
有关完整的源代码,请参阅 Bullets. For the resulting PDF, see bullets.pdf
import com.lowagie.text.*;
import com.lowagie.text.pdf.PdfWriter
import javax.swing.text.Document
public static void main(String[] args){
String[] ITEMS = ["Insurance system", "Agent", "Agency", "Agent Enrollment", "Agent Settings",
"Appointment", "Continuing Education", "Hierarchy", "Recruiting", "Contract",
"Message", "Correspondence", "Licensing", "Party"];
com.lowagie.text.Document document = new com.lowagie.text.Document();
PdfWriter.getInstance(document,new FileOutputStream("List1.pdf"));
Font zapfdingbats = new Font();
Font font = new Font();
Chunk bullet = new Chunk("\u2022", zapfdingbats);
document.open();
Paragraph p = new Paragraph("Items can be split if they don't fit at the end: ", font);
for (String item: ITEMS) {
p.add(bullet);
p.add(new Phrase(" " + item + " ", font));
}
document.add(p);
document.close();
}