以下是我从网上搜索过的代码。这段代码在下一行打印每个列表项,但我不想这样。
以下是我想用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"));
预期产出:
答案 0 :(得分:4)
您真的不需要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);
然后"好"示例如下所示:
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
,我循环遍历所有项目,并且我将段落,空格字符,项目和空格字符添加到段落中的次数与项目一样多。
正如您所看到的,"代理商注册"可能存在问题。由于" Agent"之间的空间特征。和"注册",项目分为两部分。这对你来说是可以接受的,但我们假设它不是。
这使我们找到了更好的解决方案:
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);
我们现在引入不间断空格(/u00a0
),而不是普通空格。这已经更好了,因为带有空格的项目,例如"代理注册"不再分裂。不幸的是,我们正在处理子弹和物品的不同块,因此无论如何都可能发生子弹及其物品的分裂。这导致了最佳解决方案:
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。有关生成的PDF,请参阅bullets.pdf
答案 1 :(得分:-1)
@Autowired