C# 添加HTML页面作为PDF文档的最后一页
我正在使用iTextSharp创建一个PDF文档,包含6个图像,1个图像,1个页面 我需要添加一个HTML页面作为第6张图片后的最后一页 我已经尝试了下面的方法,但是HTML并没有添加到新页面上,而是直接附加到第5张图片下面 请建议如何将html添加到最后一页 参考代码:C# 添加HTML页面作为PDF文档的最后一页,c#,html,asp.net,pdf,itext,C#,Html,Asp.net,Pdf,Itext,我正在使用iTextSharp创建一个PDF文档,包含6个图像,1个图像,1个页面 我需要添加一个HTML页面作为第6张图片后的最后一页 我已经尝试了下面的方法,但是HTML并没有添加到新页面上,而是直接附加到第5张图片下面 请建议如何将html添加到最后一页 参考代码: string ImagePath = HttpContext.Current.Server.MapPath("~/Images/"); string[] fileNames = System.IO.Directory.GetF
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();
我需要添加一个HTML页面作为第6张图片后的最后一页
感谢您提供的任何帮助与您根据代码注释所做的假设相反,pdf不是结果所在。它仍然是空的:
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();
作为旁白,不要关闭作者!单据关闭时隐式关闭。再次关闭它充其量也不会造成任何损害
在你声称的评论中
但这也不能解决问题。。。pdf内容仍然会添加到图像之后,然后继续添加到新页面上
所以我测试了提议的变更。显然,我没有您的环境,也没有您的图像、html和css文件。因此,我使用了自己的,一个小屏幕截图和测试这是一个html的测试
通过您的代码,我得到:
根据上面描述的代码更改,我得到
我的印象是,拟议的代码更改确实解决了这个问题。html内容将添加到新页面上
因此,很明显,您可能错误地应用了建议的更改,或者您执行了旧代码,或者您检查了一些旧结果。请参见我的回答:@VDWWD:谢谢您的回复。我尝试了你的建议,但没有帮助。谢谢你的回复,但这也不能解决问题。。。pdf内容仍然会添加到图像之后,然后继续添加到新页面上。任何其他增强或改进…@Mufaddal我测试了提议的代码更改,它确实解决了问题,html内容被添加到新页面上,请参见我编辑的答案中的屏幕截图。因此,很明显,您要么错误地应用了建议的更改,要么执行了旧代码,要么检查了一些旧结果;其中,在中添加了两次{doc.NewPage;},因此HTML部分现在可以在新页面上正确呈现。感谢您的指导。但是,使用此技术创建的HTML不支持所有CSS属性,即字体、文本阴影、边框半径、框阴影等。因此,为了克服这一问题,我使用sejda.com上的onlineTool创建了HTML PDF,该工具具有所有CSS属性并合并了两个PDF。希望这对某人有帮助。谢谢。在哪里添加了两次{doc.NewPage;}这很奇怪。正如我在回答中提到的,我对它进行了测试,它只需要一个NewPage调用就可以工作。您使用哪种iTextSharp版本?我假设是最新的5.5.x版本。可能您使用的是旧版本,并且曾经有一个bug在当前版本中得到修复?关于支持的CSS属性,我不知道iText 5支持哪些属性。据说,在iText 7 HTML到PDF实用程序中,CSS支持得到了改进。