Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在iText中获取新页面_Java_Itextsharp_Itext - Fatal编程技术网

Java 如何在iText中获取新页面

Java 如何在iText中获取新页面,java,itextsharp,itext,Java,Itextsharp,Itext,使用pdfContentByte查找新页面有点问题。我使用下面的代码将第一页之后的数据放到下一页,但不幸的是iText没有生成新页面 //step1 itextDocument = new com.itextpdf.text.Document(PageSize.A4, 50, 50, 30, 65); writer = PdfWriter.getInstance(itextDocument, new FileOutputStream(RESULT)); itextDocu

使用
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;
//步骤1
itextDocument=new com.itextpdf.text.Document(PageSize.A4,50,50,30,65);
writer=PdfWriter.getInstance(itextDocument,新文件输出流(结果));
itextDocument.open();
writer.setPageEmpty(true);
itextDocument.newPage();
//第2步==设计并设置位置
//在Helvetica中测量弦
Font Font=新字体(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,画布){
对于(int i=0;离子)writer.setPageEmpty的使用
你用

writer.setPageEmpty(true);
你应该使用

writer.setPageEmpty(false);
而是指示当前页面不应被视为空。只要它被视为空,newPage就不会更改任何内容

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

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

因此,对于跨页面传播的内容,您必须在想要进入下一页时准确地调用
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();
这将生成以下两个页面:

或者,您也可以创建一个独立的、更大的
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();

您不应该使用writer.setPageEmpty(false);而应该使用吗?请回答@mkl;-)是的,我在itextDocument.newPage()之前使用了writer.setPageEmpty(true),但仍然不走运。您可以看到代码。您需要使用true-但是false。但是false创建的是空白页,而不是包含超出数据的新页。请建议使用panel.addNotify();panel.validate();请建议使用panel.addNotify();panel.validate()很抱歉,这是一个复制和粘贴错误:原始示例我从一个旋转面板中复制了填充的
tp
中的代码。嗨,mkl:当我试图打印此pdf时,这显示信息“此页面上存在错误。Acrobat可能无法正确显示页面。请与创建pdf文档的人联系…”。我没有插入错误我也在使用自定义字体,比如微软的Arial。你知道如何摆脱这个问题吗…真的陷入了这个问题。请提供建议。当我试图打印这个pdf时-这个pdf是哪一个?我的回答提供了两种可选的方法。此外,我只是用上面的代码再次执行测试例程,然后重试d打印它们…没有问题。因此,您做了一些不同的事情。请解释您做了哪些不同的事情以及如何做。我在我的代码中设置了总拷贝数2,默认情况下预览打印2份pdf,但当我转到打印->属性->纸张/整理->纸张源->纸盘->纸盘1时,总拷贝数从2设置为1。是当我们在iTXT中从预览中选择托盘时,是否可以设置副本值2?我使用Adobe Reader席。如果您可以与您共享联系人,那么我们可以详细讨论。