如何在iText中获取新页面

Sai*_*eek 1 java itext itextsharp

它有点用于寻找新页面的问题.我pdfContentByte使用下面的代码将第一页之后的数据放到下一页但不幸的iText是没有生成新的页面.

//step1
    itextDocument = new com.itextpdf.text.Document(PageSize.A4, 50, 50, 30, 65);
    writer = PdfWriter.getInstance(itextDocument, new FileOutputStream(RESULT));
    itextDocument.open();
    writer.setPageEmpty(true);
    itextDocument.newPage();


    // step 2 == design and set the postions


    // Measuring a String in Helvetica
    Font font = new Font(FontFamily.TIMES_ROMAN, 10);
    BaseFont romanFont = font.getCalculatedBaseFont(false);


    // Drawing lines to see where the text is added
    PdfContentByte canvas = writer.getDirectContent();
    canvas.saveState();




     canvas.stroke();
        canvas.restoreState();
        // Adding text with PdfContentByte.showTextAligned()
        canvas.beginText();
        canvas.setFontAndSize(romanFont, 10);

        //===================  get data from xml and put in pdf 
        createPDF(xmlDoc, canvas);



        createPDF(xmlDoc, canvas){
             for(int i=0;i<300;i++){
                contentByte.showTextAligned(Element.ALIGN_LEFT, "sample value", flotX, flotY, 0); 
             }
         }

    static int flotX = 50;
    static int flotY = 800;
Run Code Online (Sandbox Code Playgroud)

我该如何生成新页面?任何建议.

mkl*_*mkl 5

关于使用writer.setPageEmpty

你用

writer.setPageEmpty(true);
Run Code Online (Sandbox Code Playgroud)

你应该用

writer.setPageEmpty(false);
Run Code Online (Sandbox Code Playgroud)

而是表示当前页面不应被视为空.只要它被认为是空的,newPage就不会改变任何东西.

手动将内容添加到多个页面

如果你真的想用低级方法创建PDF内容(即直接在PdfContentByte画布上定位文本而不是将布局留给iText),你必须意识到每个页面都有自己的内容画布,其中有一个矩形(裁剪框默认)显示到媒体框),其余部分保持隐藏状态.

PdfContentByte通过返回writer.getDirectContent时,一个新的页面开始自动切换.

因此,对于跨页面传播的内容,您必须itextDocument.newPage在要到达下一页时准确调用,然后再次开始填充裁剪框.

沿着示例代码行的方向:

    Document itextDocument = new Document(PageSize.A4, 50, 50, 30, 65);
    PdfWriter writer = PdfWriter.getInstance(itextDocument, new FileOutputStream(RESULT));
    itextDocument.open();

    PdfContentByte canvas = writer.getDirectContent();
    BaseFont romanFont = BaseFont.createFont(BaseFont.TIMES_ROMAN, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);

    // first page content
    canvas.setFontAndSize(romanFont, 10);
    canvas.beginText();
    canvas.showTextAligned(Element.ALIGN_LEFT, "Line 1 on page 1", 50, 800, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "Line 2 on page 1", 50, 785, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "Line 3 on page 1", 50, 770, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "................", 50, 755, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "................", 50, 740, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "................", 50, 725, 0);
    canvas.setFontAndSize(romanFont, 800);
    canvas.showTextAligned(Element.ALIGN_LEFT, "1", 0, 100, 0); 
    canvas.endText();

    itextDocument.newPage();

    // first page content
    canvas.setFontAndSize(romanFont, 10);
    canvas.beginText();
    canvas.showTextAligned(Element.ALIGN_LEFT, "Line 1 on page 2", 50, 800, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "Line 2 on page 2", 50, 785, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "Line 3 on page 2", 50, 770, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "................", 50, 755, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "................", 50, 740, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "................", 50, 725, 0); 
    canvas.setFontAndSize(romanFont, 800);
    canvas.showTextAligned(Element.ALIGN_LEFT, "2", 0, 100, 0); 
    canvas.endText();

    itextDocument.close();
Run Code Online (Sandbox Code Playgroud)

这产生了这两个页面:

在此输入图像描述

或者,您也可以创建一个独立的,更大的PdfTemplate(派生自PdfContentByte),在其上绘制所有内容,然后在不同的页面上显示它的部分:

    Document document = new Document(PageSize.A4);

    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("big-panel.pdf"));
    document.open();
    PdfContentByte cb = writer.getDirectContent();
    PdfTemplate tp = cb.createTemplate(PageSize.A4.getWidth(), 3 * PageSize.A4.getHeight());

    // draw all your content on tp

    cb.addTemplate(tp, 0, -2 * PageSize.A4.getHeight());
    document.newPage();
    cb.addTemplate(tp, 0, -PageSize.A4.getHeight());
    document.newPage();
    cb.addTemplate(tp, 0, 0);
    document.newPage();
    cb.addTemplate(tp, 0.3333f, 0, 0, 0.3333f, PageSize.A4.getWidth() / 3, 0);
    document.close();
Run Code Online (Sandbox Code Playgroud)