我正在使用iText2.1.2,我的要求是使用从Document1对象创建的模板到Document2对象。
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.PdfWriter;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestITextTemplate {
public TestITextTemplate() {
super();
}
public static final String DEST = "D:\\Doc1.pdf";
public static final String DEST1 = "D:\\Doc2.pdf";
public static void main(String[] args) throws IOException, DocumentException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new TestITextTemplate().createPdf();
}
public void createPdf() {
try {
//1st Document Object.
Document document = new Document();
FileOutputStream fos = new FileOutputStream(DEST);
PdfWriter writer = PdfWriter.getInstance(document, fos);
document.open();
PdfContentByte contentByte = writer.getDirectContent();
PdfTemplate template =
contentByte.createTemplate(document.getPageSize().getWidth(), document.getPageSize().getHeight());
Graphics2D g2 =
template.createGraphicsShapes(document.getPageSize().getWidth(), document.getPageSize().getHeight());
template.setLineWidth(Float.parseFloat(2 + "") * 0.72f);
g2.drawString("Test String", 100, 120);
g2.dispose();
contentByte.addTemplate(template, 0, 0);
writer.releaseTemplate(template);
document.close();
//2nd Document Object.
Document document1 = new Document();
FileOutputStream fos1 = new FileOutputStream(DEST1);
PdfWriter writer1 = PdfWriter.getInstance(document1, fos1);
document1.open();
PdfContentByte contentByte1 = writer1.getDirectContent();
PdfTemplate template1 =
contentByte1.createTemplate(document1.getPageSize().getWidth(), document1.getPageSize().getHeight());
Graphics2D g21 =
template1.createGraphicsShapes(document1.getPageSize().getWidth(), document1.getPageSize().getHeight());
template1.setLineWidth(Float.parseFloat(1 + "") * 0.72f);
g21.draw(new Line2D.Double(0, 120, 400, 120));
g21.dispose();
contentByte1.addTemplate(template, 0, 0);//Adding template of 1st Document object to 2nd Document object.
contentByte1.addTemplate(template1, 50, 50);
writer1.releaseTemplate(template);
writer1.releaseTemplate(template1);
document1.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
在 contentByte1 中添加模板后添加 template1 的内容时,模板的内容>正被 template1 覆盖。
这不可能吗?这应该如何理想地工作?
提前致谢。
答案 0 :(得分:1)
当您创建第一个PdfTemplate
实例(template
)时,您会对第一个PdfWriter
创建依赖关系。
PdfContentByte contentByte = writer.getDirectContent();
PdfTemplate template = contentByte.createTemplate(...);
这种依赖关系是必要的,因为您要向需要资源的template
对象添加内容。这些资源会随时写入writer
对象。
只要您关闭第一个Document
实例(document.close();
),writer
也会关闭。隐式释放template
(您没有明确地执行此操作)并且您已完成。
然后,您创建第二个PdfTemplate
实例(template1
),并在第二个PdfWriter
(writer1
)上创建依赖关系。您再次向PdfTemplate
添加内容,并再次将资源写入PdfWriter
。添加到writer1
的内容时,这些资源都会被正确引用。
但是:您还尝试将template
添加到writer1
的内容中。常识应该告诉你他无法工作:template
所需的资源被写入writer
。它们不在writer1
中。如果没有写入writer
的资源,您就永远无法正确地将template
添加到writer1
。
解决此问题的最佳方法是使用您要重用的资源创建一个小的单页内存中PDF文件。使用PdfImportedPage
对象重用该小单页。