Java 如何在不丢失页面大小和元信息的情况下将pdf复制到另一个pdf?

Java 如何在不丢失页面大小和元信息的情况下将pdf复制到另一个pdf?,java,itext,Java,Itext,我的目标是取出pdf的第二页,并将另一个pdf的内容放入其中 我查看了其他答案,并编写了删除模板页面(第2页)的代码。然而,当我将其他页面复制到一本新书的第一集时,我得到了各种疯狂的裁剪。结果不对。我试图使用setpagesize选项,但它似乎仍然不起作用 我是不是走错方向了 package com.protocase.itexthelper; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentExcepti

我的目标是取出pdf的第二页,并将另一个pdf的内容放入其中

我查看了其他答案,并编写了删除模板页面(第2页)的代码。然而,当我将其他页面复制到一本新书的第一集时,我得到了各种疯狂的裁剪。结果不对。我试图使用setpagesize选项,但它似乎仍然不起作用

我是不是走错方向了

package com.protocase.itexthelper;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author davidh
 */
public class ITextHelper {

    public static void deletePage(String fileToPrune, int pageToDelete, String newFilePath) {

        PdfReader pdfReader = null;
        try {
            pdfReader = new PdfReader(fileToPrune);
        } catch (IOException ex) {
            Logger.getLogger(ITextHelper.class.getName()).log(Level.SEVERE, null, ex);
        }

        if (pdfReader != null) {
            List<Integer> pagesToKeep = new ArrayList<Integer>();

            //pdfReader.getPages
            for (int i = 1; i <= pdfReader.getNumberOfPages(); i++) {
                if (i != pageToDelete) {
                    pagesToKeep.add(i);
                }
            }
            pdfReader.selectPages(pagesToKeep);
        }

        PdfStamper pdfStamper = null;
        try {
            pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(newFilePath));

        } catch (FileNotFoundException ex) {
            Logger.getLogger(ITextHelper.class.getName()).log(Level.SEVERE, null, ex);
        } catch (DocumentException | IOException ex) {
            Logger.getLogger(ITextHelper.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (pdfStamper != null) {
                try {
                    pdfStamper.close();
                } catch (DocumentException | IOException ex) {
                    Logger.getLogger(ITextHelper.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            if (pdfReader != null) {
                pdfReader.close();
            }
        }
    }


    // -- begin-
    public static void main(String[] args) {
        String fileToAddTo = "src/com/protocase/itexthelper/examplepdf/BUILD_SHEETS_O4_4USS Rev5.pdf";
        String fileWithPageRemoved = "src/com/protocase/itexthelper/examplepdf/BUILD_SHEETS_O4_4USS Rev5-no page 2.pdf";
        String fileToAppend = "src/com/protocase/itexthelper/examplepdf/example_component_list.pdf";
        String testFile = "src/com/protocase/itexthelper/examplepdf/testfile.pdf";
        deletePage(fileToAddTo, 2, testFile);
        addPDFToPDF(fileWithPageRemoved, fileToAppend, testFile, 2);
    }

    /**
     * @param originalFilePath Merge multiple pdf into one pdf
     * @param fileToInsertPath
     *
     * @param list of pdf input stream
     * @param location where you want to insert the page
     * @param outputLocation output stream
     * @throws DocumentException
     * @throws IOException
     */
    public static void addPDFToPDF(String originalFilePath, String fileToInsertPath, String outputLocation, int location) {
        OutputStream out = null;
        try {
            out = new FileOutputStream(new File(outputLocation));
        } catch (FileNotFoundException ex) {
            System.out.println("ITextHelper.addPDFToPDF(): can't find output file location: "+ex);
        }
        Document document = new Document();
        PdfWriter writer = null;
        try {
            writer = PdfWriter.getInstance(document, out);
        } catch (DocumentException ex) {
            System.out.println("ITextHelper.addPDFToPDF(): issue getting writer: "+ex);
        }

        document.open();
        if (writer != null) {

            PdfContentByte cb = writer.getDirectContent();

            PdfReader originalFileReader = null;
            try {
                originalFileReader = new PdfReader(originalFilePath);
            } catch (IOException ex) {
                System.out.println("ITextHelper.addPDFToPDF(): can't read original file: " + ex);
            }
            PdfReader fileToAddReader = null;
            try {
                fileToAddReader = new PdfReader(fileToInsertPath);
            } catch (IOException ex) {
                System.out.println("ITextHelper.addPDFToPDF(): can't read fileToInsert: " + ex);
            }

            if (fileToAddReader != null && originalFileReader != null) {
                for (int i = 1; i <= originalFileReader.getNumberOfPages(); i++) {
                    if (i == location) {
                        for (int j = 1; j <= fileToAddReader.getNumberOfPages(); j++) {
                            document.newPage();

                            document.setPageSize(fileToAddReader.getPageSize(j));
                            //import the page from source pdf
                            PdfImportedPage page = writer.getImportedPage(fileToAddReader, j);
                            //add the page to the destination pdf
                            cb.addTemplate(page, 0, 0);
                        }
                    }
                    document.newPage();
                    document.setPageSize(originalFileReader.getPageSize(i));
                    PdfImportedPage page = writer.getImportedPage(originalFileReader, i);
                    cb.addTemplate(page, 0, 0);
                }
            }
        }
        closeOutputStream(out, document);
    }
    // -- end

    private static void closeOutputStream(OutputStream out, Document document) {
        if (out != null) {
            try {
                out.flush();
            } catch (IOException ex) {
                System.out.println("ITextHelper.closeOutputStream(): can't flush outstream: " + ex);
            }
            document.close();
            try {
                out.close();
            } catch (IOException ex) {
                System.out.println("can't close outstream: " + ex);
            }
        }
    }

}
package com.protocase.itexthelper;
导入com.itextpdf.text.Document;
导入com.itextpdf.text.DocumentException;
导入com.itextpdf.text.pdf.PdfContentByte;
导入com.itextpdf.text.pdf.pdf导入页面;
导入com.itextpdf.text.pdf.PdfReader;
导入com.itextpdf.text.pdf.PdfStamper;
导入com.itextpdf.text.pdf.PdfWriter;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.OutputStream;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.logging.Level;
导入java.util.logging.Logger;
/**
*
*@author davidh
*/
公共类ITextHelper{
公共静态void deletePage(字符串fileToPrune、int pageToDelete、字符串newFilePath){
PdfReader PdfReader=null;
试一试{
pdfReader=新的pdfReader(fileToPrune);
}捕获(IOEX异常){
Logger.getLogger(ITextHelper.class.getName()).log(Level.SEVERE,null,ex);
}
如果(pdfReader!=null){
List pagestokep=new ArrayList();
//pdfReader.getPages

对于(inti=1;i所以,我看了Bruno Lowagie的书,得出了这段代码。实际上,这段代码非常完美

    /**
     * @param originalFilePath PDF to append to
     * @param fileToInsertPath PDF to append
     * @param outputFile Where to save to
     * @param location where you want to insert the page
     */
    public static void mergePDFs(String originalFilePath, String fileToInsertPath, String outputFile, int location) {

        PdfReader originalFileReader = null;
        try {
            originalFileReader = new PdfReader(originalFilePath);
        } catch (IOException ex) {
            System.out.println("ITextHelper.addPDFToPDF(): can't read original file: " + ex);
        }
        PdfReader fileToAddReader = null;
        try {
            fileToAddReader = new PdfReader(fileToInsertPath);
        } catch (IOException ex) {
            System.out.println("ITextHelper.addPDFToPDF(): can't read fileToInsert: " + ex);
        }

        if (originalFileReader != null && fileToAddReader != null) {

            // -- Copy
            int numberOfOriginalPages = originalFileReader.getNumberOfPages();
            Document document = new Document();
            PdfCopy copy = null;
            try {
                copy = new PdfCopy(document, new FileOutputStream(outputFile));
                document.open();

                for (int i = 1; i <= numberOfOriginalPages; i++) {
                    if (i == location) {
                        for (int j = 1; j <= fileToAddReader.getNumberOfPages(); j++) {
                            copy.addPage(copy.getImportedPage(fileToAddReader, j));
                        }
                    }
                    copy.addPage(copy.getImportedPage(originalFileReader, i));

                }
                document.close();
            } catch (DocumentException | FileNotFoundException ex) {
                System.out.println("ITextHelper.addPDFToPDF(): can't read output location: " + ex);
            } catch (IOException ex) {
                Logger.getLogger(ITextHelper.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
/**
*@param originalFilePath要附加到的PDF
*@param fileToInsertPath要追加的PDF
*@param outputFile要保存到的位置
*@param要插入页面的位置
*/
公共静态void mergePDF(字符串原始文件路径、字符串文件到插入路径、字符串输出文件、int位置){
PdfReader originalFileReader=null;
试一试{
originalFileReader=新PDF阅读器(originalFilePath);
}捕获(IOEX异常){
System.out.println(“ITextHelper.addPDFToPDF():无法读取原始文件:”+ex);
}
PdfReader fileToAddReader=null;
试一试{
fileToAddReader=newpdfReader(fileToInsertPath);
}捕获(IOEX异常){
System.out.println(“ITextHelper.addPDFToPDF():无法读取fileToInsert:”+ex);
}
if(originalFileReader!=null&&fileToAddReader!=null){
//--抄袭
int numberoforiginalpage=originalFileReader.getNumberOfPages();
文档=新文档();
PdfCopy copy=null;
试一试{
复制=新的PdfCopy(文档,新文件输出流(输出文件));
document.open();

对于(int i=1;i)虽然您的“deletePage”看起来很合理,但您的“addPDFToPDF”使用了“PdfWriter”,这对于此类任务通常是一个不好的选择,因为它会丢失大量信息。可能是的副本。请阅读官方文档: