2010-10-18 8 views
12

Ho una lista di byte [] che mi piacerebbe concatenare in un byte [] che sarà il PDf finale.iTextSharp creazione di un pdf da un elenco di matrici di byte

sulla pagina "= copy.GetImportedPage (new PdfReader (p), i);" Sto diventando un "riferimento oggetto non impostato su un'istanza di un errore

Non ho idea di ciò che è. in corso, ho già controllato ogni oggetto e non c'è nulla

tutte le idee su questo o un altro pezzo di codice che potrebbe fare la trucco ?!

io ho questo metodo:.

EDIT

 public static byte[] concatAndAddContent(List<byte[]> pdf) 
    { 
     byte [] todos; 

     using(MemoryStream ms = new MemoryStream()) 
     { 
      Document doc = new Document(); 
      doc.Open(); 

      PdfCopy copy = new PdfCopy(doc, ms); 
      PdfCopyFields copy2 = new PdfCopyFields(ms); 


      PdfReader reader; 
      foreach (byte[] p in pdf) 
      { 
       reader = new PdfReader(p); 
       int pages = reader.NumberOfPages; 

       // loop over document pages 
       for (int i = 1; i < pages; i++) 
       { 
        PdfImportedPage page = copy.GetImportedPage(reader, i); 
        PdfCopy.PageStamp stamp = copy.CreatePageStamp(page); 
        PdfContentByte cb = stamp.GetUnderContent(); 
        cb.SaveState(); 
        stamp.AlterContents(); 
        copy.AddPage(page); 
       } 
      } 

      doc.Close(); 
      todos = ms.GetBuffer(); 
      ms.Flush(); 
      ms.Dispose(); 
     } 

     return todos; 
    } 

dello stack:

[NullReferenceException: Object reference not set to an instance of an object.] 
    iTextSharp.text.pdf.PdfImportedPage..ctor(PdfReaderInstance readerInstance, PdfWriter writer, Int32 pageNumber) +45 
    iTextSharp.text.pdf.PdfReaderInstance.GetImportedPage(Int32 pageNumber) +175 
    iTextSharp.text.pdf.PdfCopy.GetImportedPage(PdfReader reader, Int32 pageNumber) +256 
    SAM.Web.Classes.UtileriasReportes.concatAndAddContent(List`1 pdf) in \Classes\UtileriasReportes.cs:199 
    SAM.Web.Classes.UtileriasReportes.ObtenReporteOdt(Int32 ordenTrabajoID, Boolean caratula, Boolean juntas, Boolean cortes, Boolean materiales, Boolean resumenMateriales) 

in D:\MIMOSS\Desarrollo\SAM 2.0\Desarrollo\WebSolution\SAM.Web\Classes\UtileriasReportes.cs:168 
    SAM.Web.Produccion.PopupImpresionOdt.btnImprimir_Click(Object sender, EventArgs e) in \PopupImpresionOdt.aspx.cs:44 
    System.Web.UI.WebControls.Button.OnClick(EventArgs e) +118 
    System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +112 
    System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10 
    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 
    System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563 

grazie per il vostro tempo!

+0

è possibile inviare la traccia dello stack –

+0

Ho aggiunto i stacktrace. Grazie per il tuo tempo! – valin077

+0

Solo un'altra piccola cosa da sottolineare. Poiché GetImportedPage non è basato su 0, devi iniziare il tuo valore a 1. Assicurati ora che il valore delle tue pagine (NumberOfPages) ti consenta di ottenere tutti i tuoi dati. In questo momento sembra che manchi la pagina finale di qualsiasi documento PDF. – Crag

risposta

36

ho capito, solo così everbody può avere la soluzione: qui è:

public static byte[] concatAndAddContent(List<byte[]> pdf) 
    { 
     byte [] all; 

     using(MemoryStream ms = new MemoryStream()) 
     { 
      Document doc = new Document(); 

      PdfWriter writer = PdfWriter.GetInstance(doc, ms); 

      doc.SetPageSize(PageSize.LETTER); 
      doc.Open(); 
      PdfContentByte cb = writer.DirectContent; 
      PdfImportedPage page; 

      PdfReader reader; 
      foreach (byte[] p in pdf) 
      { 
       reader = new PdfReader(p); 
       int pages = reader.NumberOfPages; 

       // loop over document pages 
       for (int i = 1; i <= pages; i++) 
       { 
        doc.SetPageSize(PageSize.LETTER); 
        doc.NewPage(); 
        page = writer.GetImportedPage(reader, i); 
        cb.AddTemplate(page, 0, 0); 
       } 
      } 

      doc.Close(); 
      all = ms.GetBuffer(); 
      ms.Flush(); 
      ms.Dispose(); 
     } 

     return all; 
    } 

Speranza che aiuta!

+0

Sei una leggenda! Grazie per essere tornato per condividere questa pepita. –

0

Guardando al codice itextsharp è possibile che non funzioni sempre bene con più lettori sullo stesso contenuto.

vi consiglio di provare

page = copy.GetImportedPage(reader, i); 

piuttosto che creare un nuovo lettore per ogni pagina che stai cercando di leggere.

UPDATE: Non so se l'aiuta, ma

ho copiato e incollato il codice e ottengo un NullReferenceException ma solo su questa linea

stamp.AlterContents(); 

che è strano perché è dopo +

Durante il passaggio di contenuti non validi nell'elenco sono stato in grado di produrre intestazione PDF mancante, Trailer non trovato ecc., quindi non penso che sia una differenza nel contenuto di p

Sto usando la versione 5.0.4 con la versione del codice sorgente costruita in VS 2008. Il client è vs 2010. Forse questi rappresentano la differenza.

+0

Grazie per la tua risposta, ma questo non ha aiutato, ho modificato il codice quindi questo è quello che ho adesso: – valin077

+0

Lettore PdfReader; foreach (byte [] p in pdf) { reader = new PdfReader (p); int pages = reader.NumberOfPages; // loop su pagine documento per (int i = 0; i valin077

+0

mio male, in realtà ho modificato il codice cambiando il nome di byte [] da tutti a tutti, e l'ho perso, ma non è questo il problema. Modificherò il codice e lo lascerò come ho fatto adesso. Grazie per l'aiuto. – valin077

0

Non sicuro se questo lo aggiusterà per te, ma prova a inizializzare GetImportedPage a partire da pagina 1, non zero ma usando int i = 1 nel tuo ciclo for. Come questo:

// loop over document pages 
//was (int i = 0; i < pages; i++) { 
for (int i = 1; i < pages; i++) { 
    page = copy.GetImportedPage(new PdfReader(p), i); 
    stamp = copy.CreatePageStamp(page); 
    PdfContentByte cb = stamp.GetUnderContent(); 
    cb.SaveState(); 
    stamp.AlterContents(); 
    copy.AddPage(page); 
} 
+0

in realtà è corretto, utilizzando GetImportedPage (reader, 0) restituisce un errore, ma l'avvio della pagina in 1 continua a darmi l'eccezione di riferimento null. sono perso qui, non riesco a capire perché. Grazie, apprezzo molto il tuo aiuto! – valin077

0

Inizialmente avevo usato la risposta sopra e il PDF era molto grande .. Ho pensato che sarebbe stato utile tornare indietro e offrire questo collegamento che ha risolto completamente questo problema insieme al problema GRANDE PDF per me.

https://stackoverflow.com/a/6752769

2

Questo funziona:

utilizzato iTextSharp-LGPL 4.1.6:

public static byte[] ConcatenatePdfs(IEnumerable<byte[]> documents) 
    { 
     using (var ms = new MemoryStream()) 
     { 
      var outputDocument = new Document(); 
      var writer = new PdfCopy(outputDocument, ms); 
      outputDocument.Open(); 

      foreach (var doc in documents) 
      { 
       var reader = new PdfReader(doc); 
       for (var i = 1; i <= reader.NumberOfPages; i++) 
       { 
        writer.AddPage(writer.GetImportedPage(reader, i)); 
       } 
       writer.FreeReader(reader); 
       reader.Close(); 
      } 

      writer.Close(); 
      outputDocument.Close(); 
      var allPagesContent = ms.GetBuffer(); 
      ms.Flush(); 

      return allPagesContent; 
     } 
    } 
Problemi correlati