iText:一个Document对象的PdfTemplate可以用在另一个Document对象中吗?

时间:2015-12-17 10:48:52

标签: templates itext document

我正在使用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 覆盖。

这不可能吗?这应该如何理想地工作?

提前致谢。

1 个答案:

答案 0 :(得分:1)

当您创建第一个PdfTemplate实例(template)时,您会对第一个PdfWriter创建依赖关系。

PdfContentByte contentByte = writer.getDirectContent();
PdfTemplate template = contentByte.createTemplate(...);

这种依赖关系是必要的,因为您要向需要资源的template对象添加内容。这些资源会随时写入writer对象。

只要您关闭第一个Document实例(document.close();),writer也会关闭。隐式释放template(您没有明确地执行此操作)并且您已完成。

然后,您创建第二个PdfTemplate实例(template1),并在第二个PdfWriterwriter1)上创建依赖关系。您再次向PdfTemplate添加内容,并再次将资源写入PdfWriter。添加到writer1的内容时,这些资源都会被正确引用。

但是:您还尝试将template添加到writer1的内容中。常识应该告诉你他无法工作:template所需的资源被写入writer。它们不在writer1中。如果没有写入writer的资源,您就永远无法正确地将template添加到writer1

解决此问题的最佳方法是使用您要重用的资源创建一个小的单页内存中PDF文件。使用PdfImportedPage对象重用该小单页。