2015-10-06 61 views
0

创建一个新的PDF我的用例是我正在生成pdf。另外我有一个PDF单页。我想在现有的pdf页面之前/之前连接新生成的PDF。从现有的PDF和(HTML + CSS)

我已经能够生成与HTML PDF(这可能会导致2-3页)Pdf from HTML with CSS

我尝试在一个例子其中之一是连接查找现有的PDF文件每页Working with existing PDFs - Concatenate

+0

生成PDF?为什么不用pdfbox https://pdfbox.apache.org/ –

+0

我的HTML内容有CSS。在这种情况下,PDFBox可能不是最好的解决方案 – Acewin

+0

必须是个笑话:D。我正在通过iText pdf库生成PDF,它是java API – Acewin

回答

0

尝试这个例子:

import java.io.File; 
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.Document; 
import com.itextpdf.text.pdf.BaseFont; 
import com.itextpdf.text.pdf.PdfContentByte; 
import com.itextpdf.text.pdf.PdfImportedPage; 
import com.itextpdf.text.pdf.PdfReader; 
import com.itextpdf.text.pdf.PdfWriter; 

public class UtilPDF { 

    public static void main(String[] args) { 
    try { 
     List<InputStream> pdfs = new ArrayList<InputStream>(); 

     File pdfDir = new File("C:\\PDF"); 

     boolean pdfDirectoryExists = true; 
     if (!pdfDir.exists()) { 
      pdfDirectoryExists = pdfDir.mkdir(); 
     } 

     if (pdfDirectoryExists) { 
      pdfs.add(new FileInputStream("C:\\PDF\\Document1.pdf")); 
      pdfs.add(new FileInputStream("C:\\PDF\\Document2.pdf")); 
      OutputStream output = new FileOutputStream("C:\\Projects\\FinalDocument_1_2.pdf"); 
      UtilPDF.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. 
     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(); 
     } 
    } 
} 
} 
+0

有趣和感谢@Franklin Neves的回应。试图理解解决方案。也许你只是有一个示例代码,然后发布。不过,我想确认这是BaseFont。你在文档中添加的内容我认为这不是必需的。 – Acewin

+0

再次看着解决方案@Franklin你简单地连接已经生成的PDF页面。文件系统上存在哪些文件。 PDF我从HTML生成我不想写入文件系统,只有级联的PDF – Acewin