gpt4 book ai didi

java - 如何使用 PDFBOX 生成动态页数

转载 作者:行者123 更新时间:2023-11-30 03:23:02 27 4
gpt4 key购买 nike

我必须根据某些输入生成一个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();
}
}

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

最佳答案

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

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

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.java来自this answer .

关于java - 如何使用 PDFBOX 生成动态页数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30882927/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com