2010-10-19 21 views
0

c'est le problème:PageStamp.AlterContents() NullReferenceException

j'ai ce morceau de code ...

Il garde en jetant un NullReferenceException au stamp.AlterContents(); ligne.

Je n'ai aucune idée de ce qui se passe. Toute aide appréciée!

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; 
    } 

j'ai la version 5.0.4 iTextSharp en VisualStudio 2010

+0

Copie possible de [Qu'est-ce qu'une exception NullReferenceException et comment la réparer?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix- il) – Nasreddine

Répondre

0

S'il vous plaît poster votre trace de pile d'exception.

Bien que je ne sache pas ce qui cause l'exception, je peux vous dire qu'appeler cb.saveState() sans cb.restoreState() correspondant est une mauvaise chose. Dans la version Java, ceci va lancer une exception IllegalPdfSyntaxException. En C#, cela peut avoir été converti en NPE, mais cela semble un peu exagéré.

Sauvegarder et restaurer l'état est utilisé lorsque vous voulez faire quelque chose et ensuite "revenir en arrière". Par exemple

Draw some stuff 
save the state 
create a clipping region 
    draw some clipped stuff 
restore the state 
draw some unclipped stuff. 

Ce genre de chose se produit BEAUCOUP au format PDF. Voulez-vous dessiner une image? Vous devez changer la matrice de transformation actuelle (CTM) pour mettre l'image où vous voulez à la taille que vous voulez. Si vous ne voulez pas que tout ce qui vient après soit transformé (et vous ne le fassiez jamais), vous devez envelopper le changement de matrice et le dessin d'image dans un bloc de sauvegarde/restauration. iText gère cela pour vous lorsque vous appelez cb.addImage (...), mais cela se passe toujours dans les coulisses.