如何使用PDFBOX生成Dyanamic no of pages

时间:2015-06-17 05:26:30

标签: 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();
     }
     }

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

1 个答案:

答案 0 :(得分:2)

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

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

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.javathis answer