我正在使用iTextSharp创建一个包含6张图像(每页1张图像)的PDF文档。
我需要在第6个图像之后的最后一页添加HTML页面。
我已经尝试过以下方法,但是HTML并未添加到新页面上,而是直接附加在第五张图片下方。
请咨询如何将html添加到最后一页。
参考代码:
string ImagePath = HttpContext.Current.Server.MapPath("~/Images/");
string[] fileNames = System.IO.Directory.GetFiles(ImagePath);
string outputFileNames = "Test.pdf";
string outputFilePath = System.Web.Hosting.HostingEnvironment.MapPath("~/Pdf/" + outputFileNames);
Document doc = new Document(PageSize.A4, 20, 20, 20, 20);
System.IO.Stream st = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write);
PdfWriter writer = PdfWriter.GetInstance(doc, st);
doc.Open();
writer.PageEvent = new Footer();
for (int i = 0; i < fileNames.Length; i++)
{
string fname = fileNames[i];
if (System.IO.File.Exists(fname) && Path.GetExtension(fname) == ".png")
{
iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(fname);
img.Border = iTextSharp.text.Rectangle.BOX;
img.BorderColor = iTextSharp.text.BaseColor.BLACK;
doc.Add(img);
}
}
byte[] pdf; // result will be here
var cssText = File.ReadAllText(MapPath("~/Style1.css"));
var html = File.ReadAllText(MapPath("~/HtmlPage1.html"));
using ( var memoryStream = new MemoryStream())
{
using (var cssMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(cssText)))
{
using (var htmlMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(html)))
{
XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, htmlMemoryStream, cssMemoryStream);
}
}
pdf = memoryStream.ToArray();
//document.Add(new Paragraph(Encoding.UTF8.GetString(pdf)));
}
doc.NewPage();
doc.Add(new Paragraph(Encoding.UTF8.GetString(pdf)));
doc.Close();
writer.Close();
我需要在第6个图像之后的最后一页添加HTML页面。
感谢您的任何帮助
与您根据代码注释所假定的相反,pdf
是not结果所在的位置。它保持为空:
byte[] pdf; // result will be here
...
using ( var memoryStream = new MemoryStream())
{
... code not accessing memoryStream ...
pdf = memoryStream.ToArray();
//document.Add(new Paragraph(Encoding.UTF8.GetString(pdf)));
}
doc.NewPage();
doc.Add(new Paragraph(Encoding.UTF8.GetString(pdf)));
因此,在将转换后的html已添加到文档中之后,您需要在添加空白段落之前添加新页面。
实际上是在添加期间
XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, htmlMemoryStream, cssMemoryStream);
所以您必须在此之前添加新页面。因此,以下替换byte[] pdf;
中的所有内容都可以完成此工作:
var cssText = File.ReadAllText(MapPath("~/Style1.css"));
var html = File.ReadAllText(MapPath("~/HtmlPage1.html"));
using (var cssMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(cssText)))
{
using (var htmlMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(html)))
{
doc.NewPage();
XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, htmlMemoryStream, cssMemoryStream);
}
}
doc.Close();
顺便说一句,请勿关闭writer
!当doc
关闭时,它隐式关闭。再次关闭它最多没有任何作用,否则会造成损坏。
在您声明的评论中
但是这也不能解决问题...在图像后仍会添加pdf内容,然后在新页面上继续。
所以我测试了建议的更改。显然,我没有您的环境,也没有您的图像,html和css文件。因此,我使用了自己的屏幕截图和一个"<html><body><h1>Test</h1><p>This is a test piece of html</p></body></html>"
。
有了您的代码,我得到:
通过如上所述更改代码,我得到了
我的印象是,提议的代码更改确实解决了问题。 html内容将添加到新页面上。
因此,您显然是错误地应用了建议的更改,或者您执行了旧代码,或者检查了一些旧结果。