gpt4 book ai didi

itext - 如何在 ColumnText 中添加章节标题?

转载 作者:太空宇宙 更新时间:2023-11-04 12:18:26 28 4
gpt4 key购买 nike

请问如何在 ColumnText 中添加章节标题?我需要像这样制作PDF:

    |    ColumnText column1   |    ColumnText column2   |
| PdfPTable with content | PdfPTable with content |
| | Chapter 2 title |
| Chapter 1 title | |

然后将TOC添加到该文档中。我用 ColumnText 和其中的表格制作文档。但无法在表中添加章节。我只能将章节添加到文档正文中,但在本例中,章节标题不在 ColumnText 中。

Image of one page of the result document here

最佳答案

您的问题不清楚,因为您没有告诉我们您是否想要这样的目录:

enter image description here

如果是这种情况,则您使用了错误的术语,因为您在“书签”面板中看到的内容可能被称为“大纲”或“书签”。

如果你说你想要一个目录,你想要这样的东西:

enter image description here

我提到了两者,因为你谈论了Chapter(一个你不应该再使用的类),并且该类创建书签/大纲,而不是目录。

我创建了一个 PDF 文件,其中包含书签和目录:columns_with_toc.pdf 。请查看CreateTOCinColumn示例来了解它是如何完成的。

就像您一样,我创建了一个包含标题和表格的 ColumnText 对象:

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()));

结果如下所示:

enter image description here

尽管有在 StackOverflow 上发布问题的规则,但您没有发布代码示例,但您的代码和我的代码之间至少有一个区别:

c.setGenericTag(title);

在这一行中,我们声明一个通用标签。此标记由 TOCEntry 类使用,如下所示:

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);

如果您想要目录,可以将StringPdfAction存储在List中:

TOCEntry entry = new TOCEntry();
entry.action = PdfAction.gotoLocalPage(writer.getPageNumber(), dest, writer);
entry.title = text;
toc.add(entry);

现在我们了解了 TOCCreation 类,我们来看看如何使用它:

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
TOCCreation event = new TOCCreation();
writer.setPageEvent(event);
document.open();
event.setRoot(writer.getRootOutline())

我们创建一个event对象,将其传递给writer,打开文档后,我们将大纲树的根传递给事件。书签将自动创建,目录不会。如果你想添加目录,你需要这样的东西:

document.newPage();
for (TOCEntry entry : event.getToc()) {
Chunk c = new Chunk(entry.title);
c.setAction(entry.action);
document.add(new Paragraph(c));
}

您现在有一个标题列表,您可以单击该列表跳转到相应的表格。

关于itext - 如何在 ColumnText 中添加章节标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39124441/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com