我试图将部分表单的图片添加到PDF中,因此我使用的是PDFsharp,但我遇到的一个问题是我无法删除图片后已将其添加到PDF文件中。
这是我使用的代码:
private void button12_Click(object sender, EventArgs e)
{
string path = @"c:\\Temp.jpeg";
Bitmap bmp = new Bitmap(314, this.Height);
this.DrawToBitmap(bmp, new Rectangle(Point.Empty, bmp.Size));
bmp.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg);
GeneratePDF("test.pdf",path);
var filestream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite);
filestream.Close();
if (File.Exists(path))
{
File.Delete(path);
}
}
private void GeneratePDF(string filename, string imageLoc)
{
PdfDocument document = new PdfDocument();
// Create an empty page or load existing
PdfPage page = document.AddPage();
// Get an XGraphics object for drawing
XGraphics gfx = XGraphics.FromPdfPage(page);
DrawImage(gfx, imageLoc, 50, 50, 250, 250);
// Save and start View
document.Save(filename);
Process.Start(filename);
}
void DrawImage(XGraphics gfx, string jpegSamplePath, int x, int y, int width, int height)
{
XImage image = XImage.FromFile(jpegSamplePath);
gfx.DrawImage(image, x, y, width, height);
}
FileStream
就在那里,因为我试图确保它已关闭,如果那是问题。
这是我获得用于将图片写入PDF overlay-image-onto-pdf-using-pdfsharp的代码的地方,这是我获取代码以生成capture-a-form-to-image
我是否错过了一些明显的东西? 或者有更好的方法吗?
答案 0 :(得分:1)
如果您阅读System.IO.IOException
的详细信息,则会告诉您
无法访问该文件,因为它被另一个进程使用。
仍在使用你的图像的过程是这个不错的对象:
XImage image = XImage.FromFile(jpegSamplePath);
解决方案是在将图像绘制到PDF后处理图像:
void DrawImage(XGraphics gfx, string jpegSamplePath, int x, int y, int width, int height)
{
XImage image = XImage.FromFile(jpegSamplePath);
gfx.DrawImage(image, x, y, width, height);
image.Dispose();
}
现在,Exception消失得无影无踪......你的档案也是......
修改强>
更优雅的解决方案是使用using
块,这将确保在您完成文件后调用Dispose()
:
void DrawImage(XGraphics gfx, string jpegSamplePath, int x, int y, int width, int height)
{
using (XImage image = XImage.FromFile(jpegSamplePath))
{
gfx.DrawImage(image, x, y, width, height);
}
}
答案 1 :(得分:0)
回答第二个问题“或者有更好的方法吗?”
使用MemoryStream而不是文件可解决此问题。它会提高性能。解决方法很糟糕,但性能改进很好。
可以将MemoryStream作为参数传递。这比拥有固定文件名更清晰。是否在程序中传递文件名或MemoryStream没有实际区别。