gpt4 book ai didi

java - 如何使用 Java 和 itext 从图形对象创建具有多个页面的 PDF

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:45:50 25 4
gpt4 key购买 nike

我有一个带有抽象方法 draw(Graphics2D g2) 和方法 print()、showPreview()、printPDF() 的抽象类。对于我的 Java 程序中的每个文档,我都实现了 draw(),因此我可以打印、显示预览并为每个文档创建一个 PDF 文件。我的问题是如何从该 Graphics 对象创建包含多个页面的 PDF。我通过为每一页创建一个 PDF 文件来解决它,然后将这些文件合并到一个新文件中。但必须有更好的方法。我有以下代码来创建一页 PDF:

public void printPDF1(){
JFileChooser dialog = new JFileChooser();
String filePath = "";
int dialogResult = dialog.showSaveDialog(null);
if (dialogResult==JFileChooser.APPROVE_OPTION){
filePath = dialog.getSelectedFile().getPath();
}
else return;
try {
Document document = new Document(new Rectangle(_pageWidth, _pageHeight));
PdfWriter writer = PdfWriter.getInstance(document,
new FileOutputStream(filePath));
document.open();

PdfContentByte cb = writer.getDirectContent();
g2 = cb.createGraphics(_pageWidth, _height);
g2.translate(0, (_numberOfPages - _pageNumber) * _pageHeight);
draw(g2);
g2.dispose();
document.close();
}
catch (Exception e2) {
System.out.println(e2.getMessage());
}
}

最佳答案

    document.open();

// the same contentByte is returned, it's just flushed & reset during
// new page events.
PdfContentByte cb = writer.getDirectContent();

for (int _pageNumber = 0; _pageNumber < _numberofPages; ++_numberOfPages) {
/*******************/
//harmless in first pass, *necessary* in others
document.newPage();
/*******************/

g2 = cb.createGraphics(_pageWidth, _height);
g2.translate(0, (_numberOfPages - _pageNumber) * _pageHeight);
draw(g2);
g2.dispose();
}

document.close();

因此,您将整个界面渲染 N 次,并且只在不同位置显示页面大小的一部分。这在打印界 IIRC 中称为“ strip 化”。聪明,但它在 PDF 中可能更有效。

将整个界面渲染到一个巨大的 PdfTemplate(使用 g2d)中,一次。然后将该模板绘制到您的所有页面中,以便您想要的部分在当前页面的边距(“媒体框”)内可见。

PdfContentByte cb = writer.getDirectContent();
float entireHeight = _numberOfPages * _pageHeight;
PdfTemplate hugeTempl = cb.createTemplate( 0, -entireHeight, pageWidth, _pageHeight );
g2 = hugeTempl.createGraphics(0, -entireHeight, _pageWidth, _pageHeight );
draw(g2);
g2.dispose();

for (int curPg = 0; curPg < _numberOfPages; ++curPg) {
cb.addTemplateSimple( hugeTempl, 0, -_pageHeight * curPg );

document.newPage();
}

PDF 的坐标空间在左下角设置 0,0,并且这些值随着您向上和向右增加而增加。 PdfGraphis2D 做了相当多的魔法来隐藏你的差异,但我们仍然需要在这里处理它......因此边界框和绘图位置中的负坐标。

这都是“餐巾纸背面”编码,我完全有可能在其中犯了一两个错误……但就是这个想法。

关于java - 如何使用 Java 和 itext 从图形对象创建具有多个页面的 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5290269/

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