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无济于事。我一定错过了一些东西
我的猜测是'PdfStamper'正在关闭时,你'AddWatermark'处理它的流。当你添加第一页时,它不会失败吗?就在您添加了水印之后的第二次? –
是的,这是正确的 –
好吧,我建议删除'PdfStamper'使用语句只是为了测试理论。如果解决了这个问题,那么只需要重构代码,以便在整个流完成之前不调用内部配置。 –