2010-10-06 2 views
2

Пример кода:Почему iTextSharp переопределяет мои документы вместо их слияния?

using System; 
using System.IO; 
using System.Collections.Generic; 
using System.Text; 
using iTextSharp.text; 
using iTextSharp.text.pdf; 

namespace MergePDFs 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      try 
      { 
       int f = 1; 
       // we create a reader for a certain document 
       PdfReader reader = new PdfReader(args[f]); 
       // we retrieve the total number of pagse 
       int n = reader.NumberOfPages; 
       Console.WriteLine("There are " + n + " pages in the original file."); 
       // step 1: creation of a document-object 
       Document document = new Document(reader.GetPageSizeWithRotation(1)); 
       Console.WriteLine("PS: " + reader.GetPageSizeWithRotation(1)); 
       // step 2: we create a writer that listens to the document 
       String destinationFile = args[0];//The first argument is the destination 
       PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(destinationFile, FileMode.Create)); 
       // step 3: we open the document 
       document.Open(); 
       PdfContentByte cb = writer.DirectContent; 
       PdfImportedPage page; 
       int rotation; 
       // step 4: we add content 
       while (f < args.Length) 
       { 
        int i = 0; 
        while (i < n) 
        { 
         i++; 
         //document.SetPageSize(reader.GetPageSizeWithRotation(i)); 
         document.NewPage(); 
         page = writer.GetImportedPage(reader, i); 
         rotation = reader.GetPageRotation(i); 
         if (rotation == 90 || rotation == 270) 
         { 
          cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(i).Height); 
         } 
         else 
         { 
          cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0); 
         } 
         Console.WriteLine("Processed page " + i); 
        } 
        f++; 
        if (f < args.Length) 
        { 
         reader = new PdfReader(args[f]); 
         // we retrieve the total number of pages 
         n = reader.NumberOfPages; 
         Console.WriteLine("There are " + n + " pages in the original file."); 
        } 
       } 
       // step 5: we close the document 
       document.Close(); 
      } 
      catch (Exception e) 
      { 
       Console.Error.WriteLine(e.Message); 
       Console.Error.WriteLine(e.StackTrace); 
      } 
     } 
    } 
} 

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

ответ

1

Вполне возможно, что исходные файлы PDF имеют обрез коробку в дополнении к своим медиа коробкам.

Если вы действительно хотите скопировать страницы из файлов A & B в файл C, используйте PdfCopy.

От http://itextpdf.com/examples/iia.php?id=123

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)); 
     } 
    } 
    // step 5 
    document.close(); 

Этот метод будет сохранять аннотации (в то числе полей, хотя вы действительно должны использовать PdfCopyFields, если вы хотите переместить поля вокруг ПРАВИЛЬНО), но не закладки. Я не уверен в слоях ... Я так думаю.

О, и вы, вероятно, захотите добавить copy.freeReader(reader) после того, как вы закончите с каждым ... особенно если вы планируете перебирать много из них.