如何在 ColumnText 中添加章节标题?
How can I add titles of chapters in ColumnText?
请问如何在 ColumnText 中添加章节标题?
我需要像这样制作 PDF:
| ColumnText column1 | ColumnText column2 |
| PdfPTable with content | PdfPTable with content |
| | Chapter 2 title |
| Chapter 1 title | |
然后将目录添加到此文档。
我在其中制作了带有 ColumnText 和 table 的文档。但无法在 table 中添加章节。
我只能将章节添加到文档 body,但在本例中,章节标题不在 ColumnText 中。
你的问题不明确,因为你没有告诉我们你是否想要这样的目录:
如果是这种情况,则您使用了错误的术语,因为您在“书签”面板中看到的内容可以称为大纲或书签。
如果你说你想要目录,你想要这样的东西:
我都提到了两者,因为您谈到了 Chapter
(您不应再使用的 class)并且 class 创建了 bookmarks/outlines,而不是目录。
我已经创建了一个包含书签和目录的 PDF 文件:columns_with_toc.pdf. Please take a look at the CreateTOCinColumn 示例以了解它是如何完成的。
就像你一样,我创建了一个 ColumnText
object 标题和 tables:
ColumnText ct = new ColumnText(writer.getDirectContent());
int start;
int end;
for (int i = 0; i <= 20; ) {
start = (i * 10) + 1;
i++;
end = i * 10;
String title = String.format("Numbers from %s to %s", start, end);
Chunk c = new Chunk(title);
c.setGenericTag(title);
ct.addElement(c);
ct.addElement(createTable(start, end));
}
int column = 0;
do {
if (column == 3) {
document.newPage();
column = 0;
}
ct.setSimpleColumn(COLUMNS[column++]);
} while (ColumnText.hasMoreText(ct.go()));
结果如下所示:
尽管 post 在 Whosebug 上提问的规则,您没有 post 代码示例,但您的代码与我的代码之间至少有一处不同:
c.setGenericTag(title);
在这一行中,我们声明了一个通用标签。此标记由 TOCEntry
class 使用,如下所示:
public class TOCCreation extends PdfPageEventHelper {
protected PdfOutline root;
protected List<TOCEntry> toc = new ArrayList<TOCEntry>();
public TOCCreation() {
}
public void setRoot(PdfOutline root) {
this.root = root;
}
public List<TOCEntry> getToc() {
return toc;
}
@Override
public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) {
PdfDestination dest = new PdfDestination(PdfDestination.XYZ, rect.getLeft(), rect.getTop(), 0);
new PdfOutline(root, dest, text);
TOCEntry entry = new TOCEntry();
entry.action = PdfAction.gotoLocalPage(writer.getPageNumber(), dest, writer);
entry.title = text;
toc.add(entry);
}
}
大家可以看到,我们根据标题的位置创建了一个PdfDestination
:
PdfDestination dest = new PdfDestination(PdfDestination.XYZ, rect.getLeft(), rect.getTop(), 0);
如果你想要书签,你可以像这样创建一个PdfOutline
:
new PdfOutline(root, dest, text);
如果您想要目录,可以将 String
和 PdfAction
存储在 List
中:
TOCEntry entry = new TOCEntry();
entry.action = PdfAction.gotoLocalPage(writer.getPageNumber(), dest, writer);
entry.title = text;
toc.add(entry);
既然我们了解了TOCCreation
class,我们来看看如何使用它:
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
TOCCreation event = new TOCCreation();
writer.setPageEvent(event);
document.open();
event.setRoot(writer.getRootOutline())
我们创建一个 event
object,将其传递给 writer
,在打开文档后,我们将大纲树的根传递给事件。书签将自动创建,TOC 不会。如果你想添加目录,你需要这样的东西:
document.newPage();
for (TOCEntry entry : event.getToc()) {
Chunk c = new Chunk(entry.title);
c.setAction(entry.action);
document.add(new Paragraph(c));
}
您现在有一个标题列表,您可以单击它跳转到相应的 table。
请问如何在 ColumnText 中添加章节标题? 我需要像这样制作 PDF:
| ColumnText column1 | ColumnText column2 |
| PdfPTable with content | PdfPTable with content |
| | Chapter 2 title |
| Chapter 1 title | |
然后将目录添加到此文档。 我在其中制作了带有 ColumnText 和 table 的文档。但无法在 table 中添加章节。 我只能将章节添加到文档 body,但在本例中,章节标题不在 ColumnText 中。
你的问题不明确,因为你没有告诉我们你是否想要这样的目录:
如果是这种情况,则您使用了错误的术语,因为您在“书签”面板中看到的内容可以称为大纲或书签。
如果你说你想要目录,你想要这样的东西:
我都提到了两者,因为您谈到了 Chapter
(您不应再使用的 class)并且 class 创建了 bookmarks/outlines,而不是目录。
我已经创建了一个包含书签和目录的 PDF 文件:columns_with_toc.pdf. Please take a look at the CreateTOCinColumn 示例以了解它是如何完成的。
就像你一样,我创建了一个 ColumnText
object 标题和 tables:
ColumnText ct = new ColumnText(writer.getDirectContent());
int start;
int end;
for (int i = 0; i <= 20; ) {
start = (i * 10) + 1;
i++;
end = i * 10;
String title = String.format("Numbers from %s to %s", start, end);
Chunk c = new Chunk(title);
c.setGenericTag(title);
ct.addElement(c);
ct.addElement(createTable(start, end));
}
int column = 0;
do {
if (column == 3) {
document.newPage();
column = 0;
}
ct.setSimpleColumn(COLUMNS[column++]);
} while (ColumnText.hasMoreText(ct.go()));
结果如下所示:
尽管 post 在 Whosebug 上提问的规则,您没有 post 代码示例,但您的代码与我的代码之间至少有一处不同:
c.setGenericTag(title);
在这一行中,我们声明了一个通用标签。此标记由 TOCEntry
class 使用,如下所示:
public class TOCCreation extends PdfPageEventHelper {
protected PdfOutline root;
protected List<TOCEntry> toc = new ArrayList<TOCEntry>();
public TOCCreation() {
}
public void setRoot(PdfOutline root) {
this.root = root;
}
public List<TOCEntry> getToc() {
return toc;
}
@Override
public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) {
PdfDestination dest = new PdfDestination(PdfDestination.XYZ, rect.getLeft(), rect.getTop(), 0);
new PdfOutline(root, dest, text);
TOCEntry entry = new TOCEntry();
entry.action = PdfAction.gotoLocalPage(writer.getPageNumber(), dest, writer);
entry.title = text;
toc.add(entry);
}
}
大家可以看到,我们根据标题的位置创建了一个PdfDestination
:
PdfDestination dest = new PdfDestination(PdfDestination.XYZ, rect.getLeft(), rect.getTop(), 0);
如果你想要书签,你可以像这样创建一个PdfOutline
:
new PdfOutline(root, dest, text);
如果您想要目录,可以将 String
和 PdfAction
存储在 List
中:
TOCEntry entry = new TOCEntry();
entry.action = PdfAction.gotoLocalPage(writer.getPageNumber(), dest, writer);
entry.title = text;
toc.add(entry);
既然我们了解了TOCCreation
class,我们来看看如何使用它:
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
TOCCreation event = new TOCCreation();
writer.setPageEvent(event);
document.open();
event.setRoot(writer.getRootOutline())
我们创建一个 event
object,将其传递给 writer
,在打开文档后,我们将大纲树的根传递给事件。书签将自动创建,TOC 不会。如果你想添加目录,你需要这样的东西:
document.newPage();
for (TOCEntry entry : event.getToc()) {
Chunk c = new Chunk(entry.title);
c.setAction(entry.action);
document.add(new Paragraph(c));
}
您现在有一个标题列表,您可以单击它跳转到相应的 table。