如何使用 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();

}