2014-09-01 2 views
5

У меня возникла проблема при слиянии документов различной ширины с использованием iText.Объединить документы PDF различной ширины с помощью iText

Ниже приведен код, который я использую для слияния.

 public static void doMerge(List<InputStream> list, OutputStream outputStream) throws Exception { 

      Rectangle pagesize = new Rectangle(1700f, 20f); 


      com.itextpdf.text.Document document = new com.itextpdf.text.Document(pagesize); 

      PdfWriter writer = PdfWriter.getInstance(document, outputStream); 
      document.open(); 
      document.setPageSize(pagesize); 
      com.itextpdf.text.pdf.PdfContentByte cb = writer.getDirectContent(); 

      for (InputStream in : list){ 
       PdfReader reader = new PdfReader(in); 
       for (int i = 1; i <= reader.getNumberOfPages(); i++){ 
        document.newPage(); 
        //import the page from source pdf 
        com.itextpdf.text.pdf.PdfImportedPage page = writer.getImportedPage(reader, i); 

        //calculate the y for merging it from top 
        float y = document.getPageSize().getHeight() - page.getHeight(); 
        //add the page to the destination pdf 

        cb.addTemplate(page, 0, y); 

       } 
       reader.close(); 
       in.close(); 
      } 

      outputStream.flush(); 
      document.close(); 
      outputStream.close(); 
     } 

Первая страница pdf будет иметь ширину 14 дюймов и 13 дюймов высоты. Все остальные страницы документа всегда будут меньше.

Я хочу объединить все документы в одном документе.

Я не знаю, как установить ширину и высоту одного объединенного документа.

Я думаю, что Rectangle pagesize = new Rectangle(1700f, 20f); должен это сделать, но это не значит, что это означает, если вы измените его на Rectangle pagesize = new Rectangle(1700f, 200f);, документ не имеет никакого эффекта.

Прошу вас, пожалуйста, проинструктировать меня.

+0

ли Вы хотите сохранить размеры исходных файлов PDF? В этом случае вы должны использовать 'PdfCopy' вместо этого. – mkl

ответ

18

Использование PdfWriter класса для объединения документов идет вразрез со всеми рекомендациями, приведенных в документации официального, хотя есть неофициальные примеров, которые, возможно, заманили вас в письменном виде плохой кода. Я надеюсь, что вы поймете, что я нахожу эти плохие примеры еще более раздражающими, чем вы.

См. Таблицу 6.1 в chapter 6 of my book. Он дает вам обзор, когда следует использовать класс. В этом случае, вы должны использовать PdfCopy:

String[] files = { MovieLinks1.RESULT, MovieHistory.RESULT }; 
// step 1 
Document document = new Document(); 
// step 2 
PdfCopy copy = new PdfCopy(document, new FileOutputStream(RESULT)); 
// step 3 
document.open(); 
// step 4 
PdfReader reader; 
int n; 
// loop over the documents you want to concatenate 
for (int i = 0; i < files.length; i++) { 
    reader = new PdfReader(files[i]); 
    // loop over the pages in that document 
    n = reader.getNumberOfPages(); 
    for (int page = 0; page < n;) { 
     copy.addPage(copy.getImportedPage(reader, ++page)); 
    } 
    copy.freeReader(reader); 
    reader.close(); 
} 
// step 5 
document.close(); 

Если вы используете последнюю версию IText, вы можете даже использовать addDocument() метод в этом случае вам не нужно перебрать все страницы. Вы также должны проявлять особую осторожность, если участвуют формы. Существует несколько примеров, демонстрирующих новую функциональность (начиная с момента написания книги) в Sandbox.

3

с IText версии 5.5 можно объединить PDF более Исли с помощью метода PdfCopy.addDocument:

  package tn.com.sf.za.rd.controller; 

      import java.io.FileOutputStream; 
      import java.io.IOException; 

      import com.itextpdf.text.Document; 
      import com.itextpdf.text.DocumentException; 
      import com.itextpdf.text.pdf.PdfCopy; 
      import com.itextpdf.text.pdf.PdfReader; 

      public class ReportMerging { 

       public static void main(String[] args) throws DocumentException, IOException { 

        String DOC_ONE_PATH = "D:/s.zaghdoudi/tmp/one.pdf"; 
        String DOC_TWO_PATH = "D:/s.zaghdoudi/tmp/two.pdf"; 
        String DOC_THREE_PATH = "D:/s.zaghdoudi/tmp/three.pdf"; 
        Document document = new Document(); 
        PdfCopy copy = new PdfCopy(document, new FileOutputStream(DOC_THREE_PATH)); 
        document.open(); 
        PdfReader readerOne = new PdfReader(DOC_ONE_PATH); 
        PdfReader readerTwo = new PdfReader(DOC_TWO_PATH); 
        copy.addDocument(readerOne); 
        copy.addDocument(readerTwo); 
        document.close(); 
       } 

      } 
+0

Это правильно. В более поздних версиях iText вы можете сразу добавить полный документ. –

Смежные вопросы