当前位置: 首页 > 知识库问答 >
问题:

PDFBox 2.0.9-创建具有多个页面的TOC

许寒
2023-03-14

我正在开发PDF Toc。它会生成第一页,但当我有更多元素时,我会逻辑地为TOC创建一个新页面。我正在使用PDF Box和那个PDPageContentStream。我必须创建一个函数来计算我需要多少页面。然后我在列表中创建确切数量的页面,并在我启动PDPageContentStream之前将它们添加到PDF文档中。该流处于循环中,它只生成第一页。其他页面是空白的。我不知道到底出了什么问题。这是代码:

PDDocument pdf = new PDDocument();
int numberOfTocPages = calculateTocPages(50, tocStyle, _height, currentYPosition, leading);

    List<PDPage> tocPages = new ArrayList<PDPage>();
    for (int i = 0; i < numberOfTocPages; i++) {
        PDPage toc = new PDPage(new PDRectangle(_width, _height));
        tocPages.add(toc);
    }

    float numberingXPosition = _width - (contentMarginLeft + contentMarginRight) - 100;
    int j = 0;
    
    PDDocument temp = new PDDocument();
    
    
    for (int i = 0; i < numberOfTocPages; i++) {
        PDPage toc = tocPages.get(i);
        pdf.addPage(toc);
        try {
            PDPageContentStream contentStream = new PDPageContentStream(pdf, toc, PDPageContentStream.AppendMode.APPEND, true, false);
            contentStream.beginText();
            if (i == 0) {
                contentStream.setFont(font, fontSize);
                contentStream.setNonStrokingColor(tocStyle.getHeaderFontColor());
                contentStream.newLineAtOffset(headerMarginLeft, currentYPosition);
                contentStream.showText(StylingEnums.TABLE_OF_CONTENTS);
            }
            
            fontSize = tocStyle.getContentFontSize();
            leading = 1.5f * fontSize;
            contentStream.setFont(PDType1Font.HELVETICA, fontSize);
            contentStream.setNonStrokingColor(tocStyle.getContentFontColor());
            contentStream.newLineAtOffset(contentMarginLeft, -leading);
            currentYPosition -= leading;
            contentStream.setLeading(leading);
            // List<TocContentData> tocItems = _tocData.getTocItems();
            while (j < 50) {
                if (currentYPosition >= 2 * tocStyle.getContentMarginBottom()) {
                    // TocContentData item = tocItems.get(i);
                    contentStream.showText("Item " + j);
                    contentStream.newLineAtOffset(numberingXPosition, 0);
                    int pageNumber = j;
                    contentStream.showText(Integer.toString(pageNumber + 1));
                    contentStream.newLineAtOffset(-numberingXPosition, 0);
                    contentStream.newLine();
                    currentYPosition -= leading;
                    j++;
                } else {
                    System.out.println("New page!!!");
                    currentYPosition = initialPosition;
                    break;
                }
                
            }
            
            contentStream.endText();
            contentStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }

    FileOutputStream out;
    try {
        out = new FileOutputStream(fileName + ".pdf");
        pdf.save(out);
        out.close();
        
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

共有1个答案

盛嘉
2023-03-14

第2页使用此代码设置Y偏移,因为当i

contentStream.newLineAtOffset(contentMarginLeft, -leading);

所以你的第一个Y偏移值是负数。

 类似资料:
  • 我看到过许多开发人员发布的问题(Android Studio将2.AAR合并为一个或其他),但我还没有看到一个明确的答复,使我能够创建一个包含一个或多个AAR或jar的AAR(我可以使用jar,因为我不需要共享任何资源;只需要共享类)。以下是我的图书馆项目的应用程序分级: 我读过关于传递依赖的文章,但我找不到一个可以帮助解决我的情况的示例实现。

  • 这看起来是最简单的事情,但我无法让它工作。 我需要添加文本到多页pdf的第一页(可以是任何页数) 在两页pdf上使用此代码(没有for循环,只使用$pdf- 文档链接 TCPDF类http://www.tcpdf.org/doc/code/classTCPDF.html#a5171e20b366b74523709d84c349c1ced FPDI类http://www.setasign.de/su

  • 我有0编码知识,但希望你们可以协助修改我在网上找到的代码,以创建多个按钮来执行不同的bat文件。我会将其保存为hta文件,以便在win shell环境中运行。谢谢!!!

  • 问题内容: 我正在尝试创建一个,但是在方法中添加一些错误。 请帮助我如何添加参数以及如何将其传递给在其中声明a和的另一个函数。 我的另一个功能是insertData(…) 我正在尝试创建一个并将其传递给函数。但是,当我在第一个函数中调用方法时,它将引发错误。 错误是 你调用的对象是空的 问题答案: 如果不调用其构造函数(新),则不能使用任何变量(例如,参考对象),但是不能使用新变量直接对其进行初始

  • 我的问题是--如何创建自定义列表视图,而不仅仅是重复一个自定义视图,而是像在Instagram或其他应用程序中,列表包括其他视图,这看起来就像滚动视图和列表视图android其他视图一样,但Roman Guy说“在滚动视图中的列表视图是一种非常糟糕的方式”,我同意这一点,不要相信谷歌使用这种方式... 使用ListView或Recolyer View实现此功能的最佳方法是什么

  • 如何创建具有整数和字符串输入类型的?如果我创建一个: 这将是一个类型。如果我将其创建为: 这将是类型。我如何创建一个,它可以接受整数和字符串输入类型?谢谢。