自己用C#尝试了一天多也没有实现往现有的PDF中添加一张新的图片而不覆盖掉原有的文件。
主要是想实现往现有的PDF文件中添加新的图片。看了很多方法都是新建PDF文档并且添加新的图片到新的PDF中,这种很容易实现。
我写了一部分代码可供参考,希望各位大神帮忙指点迷津:
string imagePath = directory + "\\save.jpg"; //要插入的图片
PdfReader reader = new PdfReader(@"C:\Users\Desktop\PDF.pdf"); //读取现有的PDF文档
int n = reader.NumberOfPages; //获取页码
iTextSharp.text.Rectangle psize = reader.GetPageSize(1); //获取第一页
float width = psize.Width;
float height = psize.Height;
Document document = new Document(psize, 50, 50, 50, 50); //设置位置
PdfWriter writer = PdfWriter.GetInstance(document,new FileStream(filename, FileMode.Append));
document.Open();
iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(imagePath); //插入图片
img.SetAbsolutePosition(440, 800);
writer.DirectContent.AddImage(img); //添加图片
document.Close();
希望各位大神能够给出一段完整的C#代码实现添加图片到已经存在的PDF中。
小弟在这里先感谢各位了
using (Stream inputPdfStream = new FileStream(Server.MapPath("~") + "/pdfimage/ceshi1.pdf", FileMode.Open, FileAccess.Read, FileShare.Read)) using (Stream inputImageStream = new FileStream(Server.MapPath("~") + "/pdfimage/4addaddf-f8ed-464c-987a-4f5155793fcb1.jpg", FileMode.Open, FileAccess.Read, FileShare.Read)) using (Stream outputPdfStream = new FileStream(Server.MapPath("~") + "/pdfimage/ceshi2.pdf", FileMode.Create, FileAccess.Write, FileShare.None)) { var reader = new PdfReader(inputPdfStream); var stamper = new PdfStamper(reader, outputPdfStream); var pdfContentByte = stamper.GetOverContent(1); it.Image image = it.Image.GetInstance(inputImageStream); //插入图片 image.SetAbsolutePosition(100, 100); pdfContentByte.AddImage(image); stamper.Close(); } return File(Server.MapPath("~") + "/pdfimage/ceshi2.pdf", "application/pdf", "TableDemo.pdf");
http://stackoverflow.com/questions/583629/how-can-i-insert-an-image-with-itextsharp-in-an-existing-pdf
有没有在WindowsForms中实现的方法,这个看着不像是windowsForms中实现的,等抽时间尝试一下。
@回望天涯: 去了最后一句和其他的路径不就行了,你该返回什么就返回什么
@羽商宫: 增加图片后还是新生成了PDF。没办法做到在原文件操作?
最后没办法,换了个dll文件,实现起来比较方便,主要是添加了
using Spire.License;
using Spire.Pdf;
using Spire.Pdf.Graphics;
Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
Nullable<bool> result = dlg.ShowDialog();
if (result == true)
{
try
{
string filePath = dlg.FileName;
//Create a pdf document
PdfDocument doc = new PdfDocument();
doc.LoadFromFile(filePath);
//get the page
PdfPageBase page = doc.Pages[0];
//get the image
PdfImage image = PdfImage.FromFile(directory + "\\save.jpg");
float width = image.Width * 0.75f;
float height = image.Height * 0.75f;
//insert image
page.Canvas.DrawImage(image, 500, 10, width, height);
//save pdf file
doc.SaveToFile(filePath);
doc.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
http://stackoverflow.com/questions/583629/how-can-i-insert-an-image-with-itextsharp-in-an-existing-pdf
正解
https://developers.itextpdf.com/question/how-update-pdf-without-creating-new-pdf
官网解答。
如果要不生成新的pdf,只能先将原文件读取为byte[]并释放资源后,用stamper 将输出流指向原文件