如何同时进行pdf编写和复制? [英] How to do pdf writing and copying at once?

查看:74
本文介绍了如何同时进行pdf编写和复制?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下要求:

首先,我想动态创建PDF. 然后,我想选择上传PDF文件. 最后,在点击打印按钮后,必须将动态创建的文件和上传的文件合并.

First I want to create a PDF dynamically. Then I want the option to upload PDF files. Finally, upon clicking a print button, both the dynamically created and the uploaded files must be merged.

单击打印"按钮时,应使用一种方法创建PDF并将其与上载的PDF合并.

When the print button is clicked, a single method should should create the PDF and combine it with the uploaded PDFs.

到目前为止,这是我的代码.

This is my code so far.

package com.sumit.program;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfCopy.PageStamp;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfSmartCopy;

public class CopyOfMergePdf {

    public static void main(String[] args) {
        try {
            List<InputStream> pdfs = new ArrayList<InputStream>();
            pdfs.add(new FileInputStream("C:\\Documents and Settings\\Sumit\\Desktop\\NewEcnProject\\Landscape.pdf"));
            pdfs.add(new FileInputStream("C:\\Documents and Settings\\Sumit\\Desktop\\client\\CoverSheet.pdf"));
            pdfs.add(new FileInputStream("C:\\Documents and Settings\\Sumit\\Desktop\\client\\ECNPRINTTEST_BP.pdf"));
            pdfs.add(new FileInputStream("C:\\Documents and Settings\\Sumit\\Desktop\\NewEcnProject\\Landscape.pdf"));
            pdfs.add(new FileInputStream("C:\\Documents and Settings\\Sumit\\Desktop\\NewEcnProject\\Document1.pdf"));
            pdfs.add(new FileInputStream("C:\\Documents and Settings\\Sumit\\Desktop\\NewEcnProject\\Landscape.pdf"));
            pdfs.add(new FileInputStream("C:\\Documents and Settings\\Sumit\\Desktop\\NewEcnProject\\Portrait.pdf"));
            OutputStream output = new FileOutputStream("C:\\Documents and Settings\\Sumit\\Desktop\\NewEcnProject\\merge1.pdf");
            CopyOfMergePdf.concatPDFs(pdfs, output, true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void concatPDFs(List<InputStream> streamOfPDFFiles,
            OutputStream outputStream, boolean paginate) {

        Document document = new Document();      
        try {
            List<InputStream> pdfs = streamOfPDFFiles;
            List<PdfReader> readers = new ArrayList<PdfReader>();
            int totalPages = 0;
            Iterator<InputStream> iteratorPDFs = pdfs.iterator(); 
            // Create Readers for the pdfs.
            int i=1;
            while (iteratorPDFs.hasNext()) {
                InputStream pdf = iteratorPDFs.next();
                PdfReader pdfReader = new PdfReader(pdf);
                System.out.println("Page size is "+pdfReader.getPageSize(1));
                readers.add(pdfReader);
                totalPages += pdfReader.getNumberOfPages();
                i++;
            }

            int j=0;
            System.out.println("Total pages are "+totalPages);
            // Create a writer for the outputstream
            PdfCopy copy = new PdfSmartCopy(document, outputStream);
            document.open();    

            PdfImportedPage page;
            PageStamp stamp;
            Chunk chunk;
            BaseFont baseFont = BaseFont.createFont("arial.ttf", BaseFont.CP1252,BaseFont.EMBEDDED);
            Iterator<PdfReader> iteratorPDFReader = readers.iterator();            
            // Loop through the PDF files and add to the output.
           i=0;
           PdfContentByte under;
            while (iteratorPDFReader.hasNext()) {
                PdfReader pdfReader = iteratorPDFReader.next();           
                // loop over the pages in that document                   
                page=copy.getImportedPage(pdfReader,pdfReader.getNumberOfPages());              
                i=i+1;
                stamp = copy.createPageStamp(page);
                chunk = new Chunk(String.format("Page %d",i));               
                chunk.setFont(new Font(baseFont));
                ColumnText.showTextAligned(stamp.getUnderContent(),
                        Element.ALIGN_CENTER, new Phrase(chunk),
                        document.getPageSize().getWidth()/2, 15, 0);

                if(i==2){


                }
                Image watermark_image = Image.getInstance("C:\\Documents and Settings\\Sumit\\Desktop\\ecn_in_pro.png");
                watermark_image.setAbsolutePosition(0,0);           
                under = stamp.getUnderContent();                
                under.addImage(watermark_image);
                stamp.alterContents();
                copy.addPage(page);
                copy.freeReader(pdfReader);
                pdfReader.close();               
            }

            outputStream.flush();
            document.close();
            outputStream.close();
            System.out.println("Merging of Pdfs is done.......");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (document.isOpen())
                document.close();
            try {
                if (outputStream != null)
                    outputStream.close();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
    }
}

它仅将所有现有的PDF文件复制到一个新文件中.如何将动态创建的文档添加到PdfCopy进程中?

It only copies all of the existing PDF files into one new file. How do I add the dynamically created document to the PdfCopy process?

推荐答案

如果要在PdfCopy进程中插入空白页,则应使用

If you want to insert an empty page in the PdfCopy process, you should use the addPage() method that takes a Rectangle and a rotation (int) as parameter.

如果要插入包含PdfCopy进程中内容的即时"页面,则需要在内存中创建文档,向该页面添加内容,并以与您相同的方式处理该页面.处理您从磁盘读取的文档.

If you want to insert an "on-the-fly" page that has content in the PdfCopy process, you need to create a document in memory, add content to that page and treat that page the same way as you treat the documents you read from disk.

类似这样的东西:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
Document document = new Document();
PdfWriter.getInstance(document, baos);
document.open();
document.add(new Paragraph("This page is empty on purpose"));
document.close();
PdfReader reader = new PdfReader(boas.toByteArray());

例如,如果要添加封面,则还需要先在内存中创建一个文档,例如列出要合并的所有文档.

If, for instance, you want to add a cover page, you'd also create a document in memory first, for instance listing all the documents that are being merged.

这篇关于如何同时进行pdf编写和复制?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆