首页 文章

Itext - 如何使用acrofields克隆页面?

提问于
浏览
8

我正在用Java编写一个打印宾果卡PDF文件的程序 . 每页都是一张卡片 . 为了方便我,我创建了一个带有acrofields的模板PDF文件,这样程序只需要创建这个模板的副本,用数字填充acrofields然后压平它 . 截至目前,我可以制作1张宾果卡 . 我想在一个PDF文件中有多个页面(因此,多个卡片) . 但我不知道如何做到这一点 . 我读到的是PDFStamper与一个且只有一个PDFReader对象相关联 . 有没有办法我可以做到这一点,而不是诉诸创建多个PDF文件并将它们合二为一(我上次这样做,我发现真的很慢)提前谢谢!

2 回答

  • 2

    我花了一段时间才弄明白这一点 . 这不是最有效的编码方式,但这里基本上是它的作用:

    • 创建一个文档

    • 对于每个具有acrofield的页面:

    • 复制模板

    • 填写表格

    • 压扁表格

    • 添加页面

    这是我的实现,您可以尝试和修改以满足您的需求:

    private void createPdf() throws Exception {
        Document doc = new Document();
        PdfSmartCopy copy = new PdfSmartCopy(doc, new FileOutputStream("result.pdf"));
        doc.open();
    
        PdfReader reader;
        PdfStamper stamper;
        AcroFields form;
        ByteArrayOutputStream baos;
    
        for(int i = 0; i < getTotalPages(); i++) {
            copyPdf(i);
    
            reader = new PdfReader(String.format("%d%s", i, "template.pdf"));
            baos = new ByteArrayOutputStream();
            stamper = new PdfStamper(reader, baos);
            form = stamper.getAcroFields();
    
            //methods to fill forms
    
            stamper.setFormFlattening(true);
            stamper.close();
    
            reader = new PdfReader(baos.toByteArray());
            copy.addPage(copy.getImportedPage(reader, 1));
        }
    
        doc.close();
    }
    
    private void copyPdf(int currentPage) throws Exception {
        PdfReader reader = new PdfReader("timesheet.pdf");
        Document doc = new Document();
        File file = new File(String.format("%d%s", currentPage, "template.pdf"));
        file.deleteOnExit();
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(file));
        stamper.close();
    }
    

    copyPdf() 方法创建临时文件,用于允许填写表单而不影响整个文档 . 如果您找到更有效的方法,请告诉我 .

    此外,我发现在基于Intel的Mac和Windows计算机上,Mac可以更快地完成此任务 .

    如果你不反对获得iText的参考书,我会推荐Bruno Lowagie的“iText in Action,Second Edition” . 这是一本很棒的书,非常有帮助 .

  • 14

    所以,这里的代码没有使用Zach的“copyPdf”方法,正如Mark Storer和MaxArt建议的那样:

    private void createPdf() throws Exception {
        Document doc = new Document();
        PdfSmartCopy copy = new PdfSmartCopy(doc, new FileOutputStream("result.pdf"));
        doc.open();
    
        PdfReader mainReader = new PdfReader("timesheet.pdf");
    
        PdfReader reader;
        PdfStamper stamper;
        AcroFields form;
        ByteArrayOutputStream baos;
    
        for(int i = 0; i < getTotalPages(); i++) {
    
            reader = new PdfReader(mainReader);
            baos = new ByteArrayOutputStream();
            stamper = new PdfStamper(reader, baos);
            AcroFields form = stamper.getAcroFields();
    
            //methods to fill forms
    
            stamper.setFormFlattening(true);
            stamper.close();
    
            reader = new PdfReader(baos.toByteArray());
            copy.addPage(copy.getImportedPage(reader, 1));
        }
    
        doc.close();
    }
    

相关问题