如何在iText中获取新页面 [英] How to get new page in iText

查看:642
本文介绍了如何在iText中获取新页面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用 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();


//步骤2 ==设计并设置位置


//在Helvetica中测量字符串
字体font = new字体(FontFamily.TIMES_ROMAN,10);
BaseFont romanFont = font.getCalculatedBaseFont(false);


//绘制线条以查看文本的添加位置
PdfContentByte canvas = writer.getDirectContent();
canvas.saveState();




canvas.stroke();
canvas.restoreState();
//使用PdfContentByte.showTextAligned()添加文本
canvas.beginText();
canvas.setFontAndSize(romanFont,10);

// ===================从xml获取数据并输入pdf
createPDF(xmlDoc,canvas);



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

static int flotX = 50;
static int flotY = 800;

如何生成新页面?任何建议。

解决方案

关于使用 writer.setPageEmpty



您使用

  writer.setPageEmpty(true); 

你应该使用

  writer.setPageEmpty(假); 

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



手动向多个页面添加内容



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



在新页面启动时, writer.getDirectContent 返回的PdfContentByte 会自动切换。



因此,对于跨页面的内容,您必须准确地调用 itextDocument.newPage ,然后再进入下一页,然后再次开始填充裁剪框。 / p>

沿着示例代码行:

 文档itextDocument =新文件(PageSize.A4,50,5 0,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);

//第一页内容
canvas.setFontAndSize(romanFont,10);
canvas.beginText();
canvas.showTextAligned(Element.ALIGN_LEFT,第1页第1行,50,800,0);
canvas.showTextAligned(Element.ALIGN_LEFT,第1页第2行,50,785,0);
canvas.showTextAligned(Element.ALIGN_LEFT,第1页第3行,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();

//第一页内容
canvas.setFontAndSize(romanFont,10);
canvas.beginText();
canvas.showTextAligned(Element.ALIGN_LEFT,第2页第1行,50,800,0);
canvas.showTextAligned(Element.ALIGN_LEFT,第2页第2行,50,785,0);
canvas.showTextAligned(Element.ALIGN_LEFT,第2页第3行,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();

这会生成以下两页:





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

 文档文档=新文档(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());

//在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,3.3333f,PageSize.A4.getWidth()/ 3,0);
document.close();


Its bit problmatic to go for new page with pdfContentByte.I'm using below code to put data after first page to next page but unfortunately iText is not generating new page.

//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;

how can I generate new page? Any suggestion.

解决方案

On the use of writer.setPageEmpty

You use

writer.setPageEmpty(true);

You should use

writer.setPageEmpty(false);

instead to indicate that the current page shall not be considered empty. As long as it is considered empty, newPage won't change anything.

Adding content to multiple pages manually

If you really want to create PDF content using low level methods (i.e. directly positioning text on a PdfContentByte canvas instead of leaving the layouting to iText), you have to realize that each page has its own content canvas of which a rectangle (the crop box defaulting to the media box) is displayed while the rest remains hidden.

The PdfContentByte returned by writer.getDirectContent is automatically switched when a new page is started.

Thus, for content spread across pages, you have to call itextDocument.newPage exactly when you want to get to the next page, and then start filling the crop box again.

Along the lines of your sample code lines:

    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();

This produces these two pages:

Alternatively you could also create an independent, larger PdfTemplate (derived from PdfContentByte), draw all your content on it, and then show sections of it on different pages:

    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();

这篇关于如何在iText中获取新页面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆