java - 如何使用 PDFBOX 生成动态页数

标签 java pdf pdf-generation pdfbox

我必须根据某些输入生成一个pdf文件。每次运行代码时,输​​入长度可能会有所不同,那么如何根据我的输入内容动态地将页面添加到文档中。

public class pdfproject
     {
      static int lineno=768;
      public static void main (String[] args) throws Exception 
       {
        PDDocument doc= new PDDocument();
        PDPage page = new PDPage();
        doc.addPage(page);
        PDPageContentStream cos = new PDPageContentStream(doc, page);
        for(int i=0;i<2000;i++)
         {           
           renderText("hello"+i,cos,60);
         }
        cos.close();
        doc.save("test.pdf");
        doc.close();
     }

       static void renderText(String Info,PDPageContentStream cos,int marginwidth) throws Exception
    {
         lineno-=12;    
         System.out.print("lineno="+lineno);
         PDFont fontPlain = PDType1Font.HELVETICA;
         cos.beginText();
         cos.setFont(fontPlain, 10);
         cos.moveTextPositionByAmount(marginwidth,lineno);
         cos.drawString(Info);
         cos.endText();
     }
     }

当当前页面没有空间时,如何确保通过动态添加新页面来在下一页上呈现内容?

最佳答案

Pdfbox 不包含任何自动布局支持。因此,您必须跟踪页面的填充程度,并且必须关闭当前页面、创建新页面、重置填充指示器等

这显然不应该在某些项目类的静态成员中完成,而应该在一些专用类及其实例成员中完成。例如

public class PdfRenderingSimple implements AutoCloseable
{
    //
    // rendering
    //
    public void renderText(String Info, int marginwidth) throws IOException
    {
        if (content == null || textRenderingLineY < 12)
            newPage();

        textRenderingLineY-=12;    
        System.out.print("lineno=" + textRenderingLineY);
        PDFont fontPlain = PDType1Font.HELVETICA;
        content.beginText();
        content.setFont(fontPlain, 10);
        content.moveTextPositionByAmount(marginwidth, textRenderingLineY);
        content.drawString(Info);
        content.endText();
    }

    //
    // constructor
    //
    public PdfRenderingSimple(PDDocument doc)
    {
        this.doc = doc;
    }

    //
    // AutoCloseable implementation
    //
    /**
     * Closes the current page
     */
    @Override
    public void close() throws IOException
    {
        if (content != null)
        {
            content.close();
            content = null;
        }
    }

    //
    // helper methods
    //
    void newPage() throws IOException
    {
        close();

        PDPage page = new PDPage();
        doc.addPage(page);
        content = new PDPageContentStream(doc, page);
        content.setNonStrokingColor(Color.BLACK);

        textRenderingLineY = 768;
    }

    //
    // members
    //
    final PDDocument doc;

    private PDPageContentStream content = null;
    private int textRenderingLineY = 0;
}

(PdfRenderingSimple.java)

你可以像这样使用它

PDDocument doc = new PDDocument();

PdfRenderingSimple renderer = new PdfRenderingSimple(doc);
for (int i = 0; i < 2000; i++)
{
    renderer.renderText("hello" + i, 60);
}
renderer.close();

doc.save(new File("renderSimple.pdf"));
doc.close();

(RenderSimple.java)

为了获得更专业的渲染支持,您将实现改进的渲染类,例如PdfRenderingEndorsementAlternative.java来自this answer .

关于java - 如何使用 PDFBOX 生成动态页数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30882927/

相关文章:

css - 以编程方式从网页创建PDF

c# - 使用 iText 7 : how to move a table that prints across pages 将 HTML 模板转换为 PDF

java - 从 Django 在服务器上运行 Java

java - 即使没有必要,if 子句是否也会遍历其所有语句?

java - Vaadin - 如何从单个按钮打开 BrowserWindowOpener

java - PDF框2.0 : Get color information in TextStripper

Flutter:使用自定义函数保存从预览页面生成的 PDF

pdf-generation - 代码签名证书和文档签名证书之间的区别

java - 从 Java 进行数据处理的工具

java - Android 服务或 Activity 可以知道哪个 Intent 打开了它吗?