如何使用 itext jar 在 pdf 中编写项目符号列表但项目不应在下一行

Muk*_*ngh -4 itext

下面是我从网上搜索的代码。这段代码在下一行打印每个列表项,但我不想那样。

以下是我想用 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"));
Run Code Online (Sandbox Code Playgroud)

预期输出:

图片

Bru*_*gie 5

您实际上并不需要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"
};
Run Code Online (Sandbox Code Playgroud)

而且我有以下字体和块:

Font zapfdingbats = new Font(FontFamily.ZAPFDINGBATS, 8);
Font font = new Font();
Chunk bullet = new Chunk(String.valueOf((char) 108), zapfdingbats);
Run Code Online (Sandbox Code Playgroud)

那么“好”的例子是这样的:

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);
Run Code Online (Sandbox Code Playgroud)

我创建了一个Paragraph,我遍历了所有项目,然后在段落中添加一个项目符号、一个空格字符、项目和一个空格字符,次数与项目一样多。

如您所见,“代理注册”可能存在问题。由于“Agent”和“Enrollment”之间的空格字符,该项目被一分为二。这对您来说可能是可以接受的,但让我们假设它不是。

这引导我们找到更好的解决方案:

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);
Run Code Online (Sandbox Code Playgroud)

代替普通空格,我们现在引入不间断空格( /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));
}
Run Code Online (Sandbox Code Playgroud)

我们没有使用知道如何绘制项目符号的字体 (Zapfdingbats) 和不知道如何绘制项目符号的字体 (Helvetica),而是使用可以同时绘制两者的字体 (Arial)。就我而言,arial.ttf可以在我的c:/windows/fonts目录中找到。

我仍然使用\u0060避免项目被拆分,但我也介绍\u2022了存储在Arial中的项目符号的UNICODE值。

有关完整的源代码,请参阅Bullets。对于生成的 PDF,请参阅bullets.pdf