Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 添加HTML页面作为PDF文档的最后一页_C#_Html_Asp.net_Pdf_Itext - Fatal编程技术网

C# 添加HTML页面作为PDF文档的最后一页

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

我正在使用iTextSharp创建一个PDF文档,包含6个图像,1个图像,1个页面

我需要添加一个HTML页面作为第6张图片后的最后一页

我已经尝试了下面的方法,但是HTML并没有添加到新页面上,而是直接附加到第5张图片下面

请建议如何将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();
我需要添加一个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支持得到了改进。