2012-07-25 13 views
5

Come si aggiunge correttamente la pagina o le pagine da un file PDF su disco esistente a un documento PDF in memoria generato attualmente?Aggiungere un PDF esistente da file a un documento non scritto utilizzando iTextSharp

Abbiamo una classe che produce un documento PDF utilizzando iTextSharp. Funziona bene Al momento aggiungere Termini & condizioni come immagine all'ultima pagina:

this.nettPriceListDocument.NewPage(); 
this.currentPage++; 
Image logo = Image.GetInstance("/inetpub/Applications/Trade/Reps/images/TermsAndConditions.gif"); 
logo.SetAbsolutePosition(0, 0); 
logo.ScaleToFit(this.nettPriceListDocument.PageSize.Width, this.nettPriceListDocument.PageSize.Height); 
this.nettPriceListDocument.Add(logo); 

Ho questa immagine come documento PDF e preferirei aggiungerlo. Se riesco a capirlo, sarebbe possibile aggiungere altri documenti PDF di cui potremmo aver bisogno per quello che sto generando.

ho provato:

string tcfile = "/inetpub/Applications/Trade/Reps/images/TermsAndConditions.pdf"; 
PdfReader reader = new PdfReader(tcfile); 
PdfWriter writer = PdfWriter.GetInstance(this.nettPriceListDocument, this.nettPriceListMemoryStream); 
PdfContentByte content = writer.DirectContentUnder; 
for (int pageno = 1; pageno < reader.NumberOfPages + 1; pageno++) 
{ 
    this.nettPriceListDocument.NewPage(); 
    this.currentPage++; 
    PdfImportedPage newpage = writer.GetImportedPage(reader, pageno); 
    content.AddTemplate(newpage, 1f, 1f); 
} 

che si traduce in un "documento non aprire" eccezione alla writer.DirectContentUnder

Ho anche provato:

string tcfile = "/inetpub/Applications/Trade/Reps/images/TermsAndConditions.pdf"; 
PdfReader reader = new PdfReader(tcfile); 
PdfConcatenate concat = new PdfConcatenate(this.nettPriceListMemoryStream); 
concat.AddPages(reader); 

che si traduce in inserimento di un pagina vuota, di dimensioni strane rispetto alla solita prima pagina del documento.

Ho anche provato:

string tcfile = "/inetpub/Applications/Trade/Reps/images/TermsAndConditions.pdf"; 
PdfReader reader = new PdfReader(tcfile); 
PdfCopy copier = new PdfCopy(nettPriceListDocument, nettPriceListMemoryStream); 
for (int pageno = 1; pageno < reader.NumberOfPages + 1; pageno++) 
{ 
    this.currentPage++; 
    PdfImportedPage newpage = copier.GetImportedPage(reader, pageno); 
    copier.AddPage(newpage); 
} 
copier.Close(); 
reader.Close(); 

che si traduce in un NullReferenceException a copier.AddPage(newpage).

Ho anche provato:

string tcfile = "/inetpub/Applications/Trade/Reps/images/TermsAndConditions.pdf"; 
PdfReader reader = new PdfReader(tcfile); 
PdfCopyFields copier = new PdfCopyFields(nettPriceListMemoryStream); 
copier.AddDocument(reader); 

Questo si traduce anche in un NullReferenceException a copier.AddDocument(reader).

Ho la maggior parte di queste idee da varie domande e risposte StackOverflow. Una cosa che nessuno sembrava affrontare, è l'aggiunta di nuove pagine da un file PDF esistente, a un documento esistente in memoria che non è stato ancora scritto su un file PDF sul disco. Questo documento è già stato aperto e contiene pagine di dati scritte. Se lascio questa procedura Condizioni & Condizioni, o semplicemente scrivo è un'immagine (come in origine), il PDF risultante esce proprio bene.

Per finire come ho iniziato: come faccio ad aggiungere correttamente le pagine da un file PDF su disco esistente a un documento PDF in memoria attualmente generato?

Grazie e apprezzamento in anticipo per le vostre riflessioni su questo. Per favore fatemi sapere se posso fornire ulteriori informazioni.

risposta

7

Ecco un semplice metodo di unione che copia i file PDF in un unico PDF. Uso questo metodo abbastanza spesso quando unisco i pdf. L'ho usato per unire pagine di dimensioni diverse senza problemi. Spero che sia d'aiuto.

public MemoryStream MergePdfForms(List<byte[]> files) 
{ 
    if (files.Count > 1) 
    { 
     PdfReader pdfFile; 
     Document doc; 
     PdfWriter pCopy; 
     MemoryStream msOutput = new MemoryStream(); 

     pdfFile = new PdfReader(files[0]); 

     doc = new Document(); 
     pCopy = new PdfSmartCopy(doc, msOutput); 

     doc.Open(); 

     for (int k = 0; k < files.Count; k++) 
     { 
      pdfFile = new PdfReader(files[k]); 
      for (int i = 1; i < pdfFile.NumberOfPages + 1; i++) 
      { 
       ((PdfSmartCopy)pCopy).AddPage(pCopy.GetImportedPage(pdfFile, i)); 
      } 
      pCopy.FreeReader(pdfFile); 
     } 

     pdfFile.Close(); 
     pCopy.Close(); 
     doc.Close(); 

     return msOutput; 
    } 
    else if (files.Count == 1) 
    { 
     return new MemoryStream(files[0]); 
    } 

    return null; 
} 
+0

Grazie @ Jonathan, che cosa se non posso chiamare 'Document.Open()' perché il documento era già aperto e ha avuto un sacco di elementi già aggiunto ad esso? – Troy

+0

@Nevyn Dovresti essere in grado di chiudere il documento e riaprirlo tramite il processo di unione. Tutto quello che devi fare è chiudere il documento e passare le matrici di byte dei tuoi documenti al metodo di fusione che restituirà un memorandum del tuo nuovo documento unito. – Jonathan

Problemi correlati