2017-07-15 208 views
0

过去一周左右,这个例外令我头痛,我不能为了我的生活而修复它。如果用户选择这样做,我正在使用iTextSharp合并PDF文件并在其上添加水印。System.ObjectDisposedException:'无法访问已关闭的文件。'

下面是合并代码:

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


      } 
    } 
} 

而这里的水印代码:

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(); 

      } 
     } 
    } 

对合并的代码出现错误,特别是线“PDF .AddDocument(读取器);” 但是只有当我尝试在多个文件上添加水印时(只有一个文件完美工作),我才会收到此错误。

我想无论是已经关东西太早,或addWatermark()做 - 我试着改变我们的使用 statemets无济于事。我一定错过了一些东西

+0

我的猜测是'PdfStamper'正在关闭时,你'AddWatermark'处理它的流。当你添加第一页时,它不会失败吗?就在您添加了水印之后的第二次? –

+0

是的,这是正确的 –

+0

好吧,我建议删除'PdfStamper'使用语句只是为了测试理论。如果解决了这个问题,那么只需要重构代码,以便在整个流完成之前不调用内部配置。 –

回答

1

好吧,似乎PdfStamper是罪魁祸首,我通过必要的论证AddWatermark()并添加了一个简单的if语句。现在一切正常。

非常感谢Mark Rucker

相关问题