在Java中使用Itext创建多页可点击索引

在Java中使用Itext创建多页可点击索引,java,pdf,indexing,itext,Java,Pdf,Indexing,Itext,我有一个创建索引的要求,它应该在第一页,我的索引文件可能包含多个页面 现在,我的索引是以pdf格式创建的,只有一页,其余的页面不显示 你能给我一些参考,如何在我的代码(Java)中进行更改吗 提前谢谢 public void createPdf(String filename, Map<KeyDTO, PdfReader> map, String language) throws IOException, DocumentException { logger.info("c

我有一个创建索引的要求,它应该在第一页,我的索引文件可能包含多个页面

现在,我的索引是以pdf格式创建的,只有一页,其余的页面不显示

你能给我一些参考,如何在我的代码(Java)中进行更改吗

提前谢谢

public void createPdf(String filename, Map<KeyDTO, PdfReader> map, String language) throws IOException, DocumentException {
logger.info("createPdf() in Index");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Map<Integer, String> toc = new TreeMap<>();

float left = 30;
float right = 30;
float top = 60;
float bottom = 0;
Document document = new Document(PageSize.A4, left, right, top, bottom);

PdfCopy copy = new PdfCopy(document, baos);
PageStamp stamp;
document.open();
int n;
int pageNo = 0;
PdfImportedPage page;
Chunk chunk;

String category = null;
String newLine = System.getProperty("line.separator");

for (Map.Entry<KeyDTO, PdfReader> entry : map.entrySet()) {

    n = entry.getValue().getNumberOfPages();
    KeyDTO key = entry.getKey();

    if (ObjectUtils.isEmpty(category) || !category.equalsIgnoreCase(key.category)) {
        String combination = newLine.concat(key.category).concat(newLine).concat("  " + key.themeGroup);
        toc.put(pageNo + 1, combination);
    } else {
        toc.put(pageNo + 1, "  " + key.themeGroup);
    }
    category = key.category;
    for (int i = 0; i < n; ) {
        pageNo++;
        page = copy.getImportedPage(entry.getValue(), ++i);
        stamp = copy.createPageStamp(page);
        chunk = new Chunk(String.format("Page %d", pageNo));
        Font font = new Font();
        font.setSize(5.0f);
        chunk.setFont(font);
        if (i == 1)
            chunk.setLocalDestination("p" + pageNo);
        ColumnText.showTextAligned(stamp.getUnderContent(),
                Element.ALIGN_RIGHT, new Phrase(chunk),
                300, 5, 0);
        stamp.alterContents();
        copy.addPage(page);
    }
}

try (PDDocument documentpd = new PDDocument()) {
    documentpd.addPage(new PDPage());
    documentpd.save(PRNCommonConstants.CatalogPdfCode.EMPTYINDEXDFILE);
}

PdfReader reader = new PdfReader(PRNCommonConstants.CatalogPdfCode.EMPTYINDEXDFILE);
page = copy.getImportedPage(reader, 1);
stamp = copy.createPageStamp(page);
Paragraph p;
PdfAction action;
PdfAnnotation link;
float y = 770;
ColumnText ct = new ColumnText(stamp.getOverContent());
ct.setSimpleColumn(36, 36, 559, y);
p = new Paragraph("Index".concat(newLine));
ct.addElement(p);
for (Map.Entry<Integer, String> entry : toc.entrySet()) {
    p = new Paragraph(entry.getValue());
    p.add(new Chunk(new DottedLineSeparator()));
    p.add(String.valueOf(entry.getKey()));
    ct.addElement(p);
    ct.go();
    action = PdfAction.gotoLocalPage("p" + entry.getKey(), false);
    link = new PdfAnnotation(copy, 36, ct.getYLine(), 559, y, action);
    stamp.addAnnotation(link);
    y = ct.getYLine();
}
 ct.go();

stamp.alterContents();
copy.addPage(page);
document.close();
for (PdfReader r : map.values()) {
    r.close();
}
reader.close();

reader = new PdfReader(baos.toByteArray());
n = reader.getNumberOfPages();
reader.selectPages(String.format("%d, 1-%d", n, n - 1));
PdfStamper stamper = new PdfStamper(reader, new             FileOutputStream(filename));
stamper.close();
public void createPdf(字符串文件名、映射映射、字符串语言)抛出IOException、DocumentException{
info(“索引中的createPdf());
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
Map toc=newtreemap();
左浮动=30;
右浮动=30;
浮顶=60;
浮底=0;
文档=新文档(PageSize.A4、左、右、上、下);
PdfCopy副本=新的PdfCopy(文件,BAS);
页戳;
document.open();
int n;
int pageNo=0;
PDF导入页面;
语块;
字符串类别=空;
字符串newLine=System.getProperty(“line.separator”);
对于(Map.Entry:Map.entrySet()){
n=entry.getValue().getNumberOfPages();
KeyDTO key=entry.getKey();
if(ObjectUtils.isEmpty(category)| |!category.equalsIgnoreCase(key.category)){
字符串组合=newLine.concat(key.category).concat(newLine.concat)(“+key.themeGroup”);
toc.put(页码+1,组合);
}否则{
toc.put(页码+1,“+键组合);
}
category=key.category;
对于(int i=0;i
}