将HTML页面作为最后一页添加到PDF文档中

问题描述 投票:0回答:1

我正在使用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页面。

感谢您的任何帮助

c# html asp.net pdf itext
1个回答
0
投票

与您根据代码注释所假定的相反,pdfnot结果所在的位置。它保持为空:

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>"

有了您的代码,我得到:

HtmlLikeMufaddal

通过如上所述更改代码,我得到了

HtmlLikeMufaddalImproved

我的印象是,提议的代码更改确实解决了问题。 html内容将添加到新页面上。

因此,您显然是错误地应用了建议的更改,或者您执行了旧代码,或者检查了一些旧结果。

© www.soinside.com 2019 - 2024. All rights reserved.