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席。如果您可以与您共享联系人,那么我们可以详细讨论。