2017-07-15 3 views
0

Depuis une semaine ou deux, cette exception me cause un mal de tête, je ne peux pas pour le résoudre. J'utilise iTextSharp pour fusionner des fichiers PDF et ajouter un filigrane sur eux si l'utilisateur choisit de le faire.System.ObjectDisposedException: 'Impossible d'accéder à un fichier fermé.'

Voici le code pour la fusion:

private void CreateMergedPdf(object sender, DoWorkEventArgs e) 
{ 
     using (FileStream stream = new FileStream(pdfname, FileMode.Create)) { 

      Document pdfDoc = new Document(PageSize.A4); 
      PdfCopy pdf = new PdfCopy(pdfDoc, stream); 

      pdfDoc.Open(); 
      int i = 0; 


      foreach (File_class newpdf in AddedPDFs) 
      { 
       (sender as BackgroundWorker).ReportProgress(i++); 

       if (newpdf.toMerge) 
       { 
        PdfReader reader = new PdfReader(newpdf.file_path); 
        pdf.AddDocument(reader); //<!> Exception here 

        this.Dispatcher.Invoke(() => progBtxt.Text = "Merging file #" + newpdf.file_id + "..."); //Dispatcher.Invoke since UI is on seperate thread 

        if (add_wtrmk)//This is called for every FILE 
        { 
         AddWatermark(reader, stream); 
        } 
       } 


      } 
    } 
} 

Et voici le code pour le filigrane:

private void AddWatermark(PdfReader reader, FileStream stream) 
    { 
     using (PdfStamper pdfStamper = new PdfStamper(reader, stream))//This is called for every PAGE of the file 
     { 

      for (int pgIndex = 1; pgIndex <= reader.NumberOfPages; pgIndex++) 
      { 
       Rectangle pageRectangle = reader.GetPageSizeWithRotation(pgIndex); 
       PdfContentByte pdfData; //Contains graphics and text content of page returned by pdfstamper 


       if (this.Dispatcher.Invoke(() => dropdown.Text == "Under Content")) 
       { 
        pdfData = pdfStamper.GetUnderContent(pgIndex); 
       } 
       else if (this.Dispatcher.Invoke(() => dropdown.Text == "Over Content")) 
       { 
        pdfData = pdfStamper.GetOverContent(pgIndex); 
       } 
       else//Just in case 

       { 
        MessageBox.Show("Something went wrong when adding the watermark"); 
        return; 
       } 

       //Set font 
       pdfData.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 40); 

       //Create new graphics state and assign opacity 
       PdfGState graphicsState = new PdfGState(); 
       graphicsState.FillOpacity = 0.25F; 

       //Set graphics state to pdfcontentbyte 
       pdfData.SetGState(graphicsState); 

       //Color of watermark 
       pdfData.SetColorFill(BaseColor.GRAY); 

       pdfData.BeginText(); 

       //Show text as per position and rotation 
       this.Dispatcher.Invoke(() => pdfData.ShowTextAligned(Element.ALIGN_CENTER, WtrmkTextbox.Text, pageRectangle.Width/2, pageRectangle.Height/2, 45)); 

       pdfData.EndText(); 

      } 
     } 
    } 

L'erreur apparaît sur le code de la fusion, en particulier la ligne "pdf .AddDocument (lecteur); " MAIS Je reçois cette erreur uniquement si j'essaie d'ajouter des filigranes sur plusieurs fichiers (avec un seul fichier, cela fonctionne parfaitement).

Je pense que je soit quelque chose me fermais trop tôt, ou addWatermark() Est-ce que - je l'ai essayé de changer nos les utilisant statemets en vain. Il me manque quelque chose

+0

Je pense que 'PdfStamper' est la fermeture du flux lorsque vous jetez dans' AddWatermark'. Il n'échoue pas lorsque vous ajoutez la première page à droite? Juste la deuxième fois après avoir ajouté un filigrane? –

+0

Oui c'est correct –

+0

Ok, je suggère de supprimer l'instruction 'PdfStamper' en utilisant juste pour tester la théorie. Si cela résout le problème, il s'agit simplement de restructurer le code de sorte que la disposition interne ne soit pas appelée avant que le flux entier ne soit terminé. –

Répondre

1

D'accord, il semble que PdfStamper ait été le coupable, j'ai passé les arguments nécessaires à AddWatermark() et ajouté une simple instruction if. Maintenant tout fonctionne parfaitement.

BIG grâce à Mark Rucker