Java 使用Itext合并PDF

Java 使用Itext合并PDF,java,itext,Java,Itext,我在合并由IText生成的两个PDF时遇到了一个问题 PDF创建的代码片段: 文档配置如下: iText_xls_2_pdf = new Document(PageSize.A4.rotate(),10,0,30,0); 使用此配置可以创建2个PDF 创建这些pdf后,需要将它们合并为单个pdf 以下代码用于合并PDF: Document document = new Document(PageSize.A4.rotate(),10,0,30,0); try { List<Inp

我在合并由IText生成的两个PDF时遇到了一个问题

PDF创建的代码片段:

文档配置如下:

iText_xls_2_pdf = new Document(PageSize.A4.rotate(),10,0,30,0);
使用此配置可以创建2个PDF

创建这些pdf后,需要将它们合并为单个pdf

以下代码用于合并PDF:

Document document = new Document(PageSize.A4.rotate(),10,0,30,0);
try {
    List<InputStream> pdfs = streamOfPDFFiles;
    List<PdfReader> readers = new ArrayList<PdfReader>();
    int totalPages = 0;
    Iterator<InputStream> iteratorPDFs = pdfs.iterator();
    // Create Readers for the pdfs.
    while (iteratorPDFs.hasNext()) {
        InputStream pdf = iteratorPDFs.next();
        PdfReader pdfReader = new PdfReader(pdf);
        readers.add(pdfReader);
        totalPages += pdfReader.getNumberOfPages();
    }
    // Create a writer for the outputstream
    PdfWriter writer = PdfWriter.getInstance(document, outputStream);
    document.open();
    BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA,
            BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
    PdfContentByte cb = writer.getDirectContent(); // Holds the PDF
    // data
    PdfImportedPage page;
    int currentPageNumber = 0;
    int pageOfCurrentReaderPDF = 0;
    Iterator<PdfReader> iteratorPDFReader = readers.iterator();
    // Loop through the PDF files and add to the output.
    while (iteratorPDFReader.hasNext()) {
        PdfReader pdfReader = iteratorPDFReader.next();
        // Create a new page in the target for each source page.
        while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) {
            document.newPage();
            pageOfCurrentReaderPDF++;
            currentPageNumber++;
            page = writer.getImportedPage(pdfReader,
                    pageOfCurrentReaderPDF);
            cb.addTemplate(page, 0, 0);
            // Code for pagination.
            if (paginate) {
                cb.beginText();
                cb.setFontAndSize(bf, 9);
                cb.showTextAligned(PdfContentByte.ALIGN_CENTER, ""
                        + currentPageNumber + " of " + totalPages, 520,
                        5, 0);
                cb.endText();
            }
        }
        pageOfCurrentReaderPDF = 0;
    }
    outputStream.flush();
    document.close();
    outputStream.close();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (document.isOpen())
        document.close();
    try {
        if (outputStream != null)
            outputStream.close();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}
Document Document=新文档(PageSize.A4.rotate(),10,0,30,0);
试一试{
列出PDF=StreamofPDF文件;
列表读取器=新的ArrayList();
int totalPages=0;
迭代器迭代器DFS=pdfs.Iterator();
//为PDF创建读卡器。
while(iteratorPDFs.hasNext()){
InputStream pdf=iteratorPDFs.next();
PdfReader PdfReader=新PdfReader(pdf);
readers.add(pdfReader);
totalPages+=pdfReader.getNumberOfPages();
}
//为outputstream创建写入程序
PdfWriter writer=PdfWriter.getInstance(文档,outputStream);
document.open();
BaseFont bf=BaseFont.createFont(BaseFont.HELVETICA,
BaseFont.CP1252,BaseFont.NOT_EMBEDDED);
PdfContentByte cb=writer.getDirectContent();//保存PDF文件
//资料
PDF导入页面;
int currentPageNumber=0;
int pageOfCurrentReaderPDF=0;
Iterator IteratorPDReader=readers.Iterator();
//循环浏览PDF文件并添加到输出中。
while(iteratorPDReader.hasNext()){
PdfReader PdfReader=iteratorpdfreeader.next();
//在目标中为每个源页面创建一个新页面。
而(pageOfCurrentReaderPDF

这将创建合并的PDF。但因为我在文档配置中使用了.rotate,所以合并的pdf是横向格式的。如何避免这种情况。

请查看中的表6.1,您将发现使用
PdfWriter
合并文档并没有完成。如果要合并文档,需要使用
PdfCopy

例如,请参见以下问题:

(如你所见,这个问题以前已经回答过很多次了……)

例如:

PdfReader reader1 = new PdfReader(file1);
PdfReader reader2 = new PdfReader(file2);
Document document = new Document();
FileOutputStream fos = new FileOutputStream();
PdfCopy copy = new PdfCopy(document, fs);
document.open();
PdfImportedPage page;
PdfCopy.PageStamp stamp;
Phrase phrase;
BaseFont bf = BaseFont.createFont();
Font font = new Font(bf, 9);
int n = reader1.getNumberOfPages();
for (int i = 1; i <= reader1.getNumberOfPages(); i++) {
    page = copy.getImportedPage(reader1, i);
    stamp = copy.createPageStamp(page);
    phrase = new Phrase("page " + i, font);
    ColumnText.showTextAligned(stamp.getOverContent(), Element.ALIGN_CENTER, phrase, 520, 5, 0);
    stamp.alterContents();
    copy.addPage(page);
}
for (int i = 1; i <= reader2.getNumberOfPages(); i++) {
    page = copy.getImportedPage(reader2, i);
    stamp = copy.createPageStamp(page);
    phrase = new Phrase("page " + (n + i), font);
    ColumnText.showTextAligned(stamp.getOverContent(), Element.ALIGN_CENTER, phrase, 520, 5, 0);
    stamp.alterContents();
    copy.addPage(page);
}
document.close();
reader1.close();
reader2.close();
PdfReader reader1=新的PdfReader(文件1);
PdfReader reader2=新PdfReader(文件2);
文档=新文档();
FileOutputStream fos=新的FileOutputStream();
PdfCopy副本=新的PdfCopy(文件,fs);
document.open();
PDF导入页面;
PdfCopy.PageStamp;
短语;
BaseFont bf=BaseFont.createFont();
Font Font=新字体(bf,9);
int n=reader1.getNumberOfPages();

对于(int i=1;i您做得都不对,因为您没有阅读文档,或者,如果您阅读了文档,您就听从了错误的人的建议。不要使用
PdfWriter
合并文档!使用
PdfCopy
PdfSmartCopy
!谢谢您,先生。这解决了我的问题。我不确定您是否可以接受一个问题的答案已经结束的问题。你能试一试吗?是的,我试过了。我现在没有足够的分数可以投票。我得到足够的分数后会投票吗接受和投票不一样。接受是检查投票下面的V标记。谢谢主席先生提供的信息。我试过投票,但不能这样做