Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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字符串C的iTextSharp PDF标题#_C#_Itextsharp - Fatal编程技术网

C# 带有HTML字符串C的iTextSharp PDF标题#

C# 带有HTML字符串C的iTextSharp PDF标题#,c#,itextsharp,C#,Itextsharp,我正在尝试使用iTextSharp生成带有客户信息、页眉和页脚等的PDF报告。所有这些报告都已使用EVO API生成。作为迁移过程的一部分,我们计划使用iTextSharp API生成这些报告 我需要知道是否有可能向iTextSharp PDF头提供一个准备好呈现的HTML字符串(现有EVO设计接受HTML字符串并构建PDF),而不是使用PageEvents来设计PDFPTable和PDFPCell(因为报告数量巨大,避免返工)我不确定是否正确理解了你的问题 如果您询问如何使用iTextShar

我正在尝试使用iTextSharp生成带有客户信息、页眉和页脚等的PDF报告。所有这些报告都已使用EVO API生成。作为迁移过程的一部分,我们计划使用iTextSharp API生成这些报告


我需要知道是否有可能向iTextSharp PDF头提供一个准备好呈现的HTML字符串(现有EVO设计接受HTML字符串并构建PDF),而不是使用PageEvents来设计PDFPTable和PDFPCell(因为报告数量巨大,避免返工)我不确定是否正确理解了你的问题

如果您询问如何使用iTextSharp将HTML解析为PDF,那么以下是我在一段时间前找到的解决方案:

        using (Document document = new Document(size))
        {
            var writer = PdfWriter.GetInstance(document, stream);

            document.Open();
            document.NewPage();
            document.Add(new Chunk(""));

            var tagProcessors = (DefaultTagProcessorFactory)Tags.GetHtmlTagProcessorFactory();
            tagProcessors.RemoveProcessor(HTML.Tag.IMG);
            tagProcessors.AddProcessor(HTML.Tag.IMG, new CustomImageTagProcessor());

            var charset = Encoding.UTF8;

            CssFilesImpl cssFiles = new CssFilesImpl();
            cssFiles.Add(XMLWorkerHelper.GetInstance().GetDefaultCSS());
            var cssResolver = new StyleAttrCSSResolver(cssFiles);
            cssResolver.AddCss(srcCssData, "utf-8", true);

            var hpc = new HtmlPipelineContext(new CssAppliersImpl(new XMLWorkerFontProvider()));
            hpc.SetAcceptUnknown(true).AutoBookmark(true).SetTagFactory(tagProcessors);
            var htmlPipeline = new HtmlPipeline(hpc, new PdfWriterPipeline(document, writer));
            var pipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
            var worker = new XMLWorker(pipeline, true);
            var xmlParser = new XMLParser(true, worker, charset);

            xmlParser.Parse(new StringReader(srcFileData));

            document.Close();
        }
要使其正常工作,您需要在为上述converte函数提供的HTML中向内联图像添加自定义图像处理器:

public class CustomImageTagProcessor : iTextSharp.tool.xml.html.Image
{
    public override IList<IElement> End(IWorkerContext ctx, Tag tag, IList<IElement> currentContent)
    {
        IDictionary<string, string> attributes = tag.Attributes;
        string src;
        if (!attributes.TryGetValue(HTML.Attribute.SRC, out src))
            return new List<IElement>(1);

        if (string.IsNullOrEmpty(src))
            return new List<IElement>(1);

        if (src.StartsWith("data:image/", StringComparison.InvariantCultureIgnoreCase))
        {
            // data:[<MIME-type>][;charset=<encoding>][;base64],<data>
            var base64Data = src.Substring(src.IndexOf(",") + 1);
            var imagedata = Convert.FromBase64String(base64Data);
            var image = iTextSharp.text.Image.GetInstance(imagedata);

            var list = new List<IElement>();
            var htmlPipelineContext = GetHtmlPipelineContext(ctx);
            list.Add(GetCssAppliers().Apply(new Chunk((iTextSharp.text.Image)GetCssAppliers().Apply(image, tag, htmlPipelineContext), 0, 0, true), tag, htmlPipelineContext));
            return list;
        }
        else
        {
            return base.End(ctx, tag, currentContent);
        }
    }
}
公共类CustomImageTagProcessor:iTextSharp.tool.xml.html.Image
{
公共覆盖IList端(IWorkerContext ctx、标记标记、IList currentContent)
{
IDictionary attributes=tag.attributes;
字符串src;
如果(!attributes.TryGetValue(HTML.Attribute.SRC,out SRC))
返回新列表(1);
if(string.IsNullOrEmpty(src))
返回新列表(1);
if(src.StartsWith(“data:image/”,StringComparison.InvariantCultureIgnoreCase))
{
//数据:[;字符集=][;base64],
var base64Data=src.Substring(src.IndexOf(“,”)+1);
var imagedata=Convert.FromBase64String(base64Data);
var image=iTextSharp.text.image.GetInstance(imagedata);
var list=新列表();
var htmlPipelineContext=GetHtmlPipelineContext(ctx);
添加(GetCssAppliers().Apply(新块((iTextSharp.text.Image)GetCssAppliers().Apply(图像,标记,htmlPipelineContext),0,0,true),标记,htmlPipelineContext));
退货清单;
}
其他的
{
返回base.End(ctx、tag、currentContent);
}
}
}

我不确定是否正确理解您的问题

如果您询问如何使用iTextSharp将HTML解析为PDF,那么以下是我在一段时间前找到的解决方案:

        using (Document document = new Document(size))
        {
            var writer = PdfWriter.GetInstance(document, stream);

            document.Open();
            document.NewPage();
            document.Add(new Chunk(""));

            var tagProcessors = (DefaultTagProcessorFactory)Tags.GetHtmlTagProcessorFactory();
            tagProcessors.RemoveProcessor(HTML.Tag.IMG);
            tagProcessors.AddProcessor(HTML.Tag.IMG, new CustomImageTagProcessor());

            var charset = Encoding.UTF8;

            CssFilesImpl cssFiles = new CssFilesImpl();
            cssFiles.Add(XMLWorkerHelper.GetInstance().GetDefaultCSS());
            var cssResolver = new StyleAttrCSSResolver(cssFiles);
            cssResolver.AddCss(srcCssData, "utf-8", true);

            var hpc = new HtmlPipelineContext(new CssAppliersImpl(new XMLWorkerFontProvider()));
            hpc.SetAcceptUnknown(true).AutoBookmark(true).SetTagFactory(tagProcessors);
            var htmlPipeline = new HtmlPipeline(hpc, new PdfWriterPipeline(document, writer));
            var pipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
            var worker = new XMLWorker(pipeline, true);
            var xmlParser = new XMLParser(true, worker, charset);

            xmlParser.Parse(new StringReader(srcFileData));

            document.Close();
        }
要使其正常工作,您需要在为上述converte函数提供的HTML中向内联图像添加自定义图像处理器:

public class CustomImageTagProcessor : iTextSharp.tool.xml.html.Image
{
    public override IList<IElement> End(IWorkerContext ctx, Tag tag, IList<IElement> currentContent)
    {
        IDictionary<string, string> attributes = tag.Attributes;
        string src;
        if (!attributes.TryGetValue(HTML.Attribute.SRC, out src))
            return new List<IElement>(1);

        if (string.IsNullOrEmpty(src))
            return new List<IElement>(1);

        if (src.StartsWith("data:image/", StringComparison.InvariantCultureIgnoreCase))
        {
            // data:[<MIME-type>][;charset=<encoding>][;base64],<data>
            var base64Data = src.Substring(src.IndexOf(",") + 1);
            var imagedata = Convert.FromBase64String(base64Data);
            var image = iTextSharp.text.Image.GetInstance(imagedata);

            var list = new List<IElement>();
            var htmlPipelineContext = GetHtmlPipelineContext(ctx);
            list.Add(GetCssAppliers().Apply(new Chunk((iTextSharp.text.Image)GetCssAppliers().Apply(image, tag, htmlPipelineContext), 0, 0, true), tag, htmlPipelineContext));
            return list;
        }
        else
        {
            return base.End(ctx, tag, currentContent);
        }
    }
}
公共类CustomImageTagProcessor:iTextSharp.tool.xml.html.Image
{
公共覆盖IList端(IWorkerContext ctx、标记标记、IList currentContent)
{
IDictionary attributes=tag.attributes;
字符串src;
如果(!attributes.TryGetValue(HTML.Attribute.SRC,out SRC))
返回新列表(1);
if(string.IsNullOrEmpty(src))
返回新列表(1);
if(src.StartsWith(“data:image/”,StringComparison.InvariantCultureIgnoreCase))
{
//数据:[;字符集=][;base64],
var base64Data=src.Substring(src.IndexOf(“,”)+1);
var imagedata=Convert.FromBase64String(base64Data);
var image=iTextSharp.text.image.GetInstance(imagedata);
var list=新列表();
var htmlPipelineContext=GetHtmlPipelineContext(ctx);
添加(GetCssAppliers().Apply(新块((iTextSharp.text.Image)GetCssAppliers().Apply(图像,标记,htmlPipelineContext),0,0,true),标记,htmlPipelineContext));
退货清单;
}
其他的
{
返回base.End(ctx、tag、currentContent);
}
}
}
我需要知道是否有可能向iTextSharp PDF头提供一个准备好呈现的HTML字符串(现有的EVO设计接受HTML字符串并构建PDF),而不是使用PageEvents来设计PDFPTable和PDFPCell

您必须使用页面事件来绘制页眉或页脚,但无需在此处明确使用
PdfPTable
。实际上,您可以在页面事件期间呈现html,例如:

[Test]
public void CreatePdfWithHtmlHeader()
{
    string htmlHeader = "<!DOCTYPE html><html><body><table style=\"width: 100%; border: 1px solid black;\"><tr><td>A</td><td>B</td></tr></table></body></html>";

    using (FileStream output = new FileStream(@"C:\Temp\test-results\content\html-header.pdf", FileMode.Create, FileAccess.Write))
    using (Document document = new Document(PageSize.A4))
    {
        PdfWriter writer = PdfWriter.GetInstance(document, output);
        writer.PageEvent = new HtmlPageEventHelper(htmlHeader);
        document.Open();
        document.Add(new Paragraph("1"));
        document.NewPage();
        document.Add(new Paragraph("2"));
    }
}
对于更复杂的HTML片段,您可能希望用@Skary的答案中所示的自定义解析器调用替换
XMLWorkerHelper.GetInstance().ParseXHtml
调用

ColumnTextElementHandler
是一个
IElementHandler
实现,它向
ColumnText

public class ColumnTextElementHandler : IElementHandler
{
    public ColumnTextElementHandler(ColumnText ct)
    {
        this.ct = ct;
    }

    ColumnText ct = null;

    public void Add(IWritable w)
    {
        if (w is WritableElement)
        {
            foreach (IElement e in ((WritableElement)w).Elements())
            {
                ct.AddElement(e);
            }
        }
    }
}
顺便说一下,上面的测试生成了包含以下内容的PDF:


免责声明:我主要使用Java,以前没有使用过
XmlWorker
。因此,该代码可能具有相当大的改进潜力

我需要知道是否有可能向iTextSharp PDF头提供一个准备好呈现的HTML字符串(现有的EVO设计接受HTML字符串并构建PDF),而不是使用PageEvents来设计PDFPTable和PDFPCell

您必须使用页面事件来绘制页眉或页脚,但无需在此处明确使用
PdfPTable
。实际上,您可以在页面事件期间呈现html,例如:

[Test]
public void CreatePdfWithHtmlHeader()
{
    string htmlHeader = "<!DOCTYPE html><html><body><table style=\"width: 100%; border: 1px solid black;\"><tr><td>A</td><td>B</td></tr></table></body></html>";

    using (FileStream output = new FileStream(@"C:\Temp\test-results\content\html-header.pdf", FileMode.Create, FileAccess.Write))
    using (Document document = new Document(PageSize.A4))
    {
        PdfWriter writer = PdfWriter.GetInstance(document, output);
        writer.PageEvent = new HtmlPageEventHelper(htmlHeader);
        document.Open();
        document.Add(new Paragraph("1"));
        document.NewPage();
        document.Add(new Paragraph("2"));
    }
}
对于更复杂的HTML片段,您可能希望用@Skary的答案中所示的自定义解析器调用替换
XMLWorkerHelper.GetInstance().ParseXHtml
调用

ColumnTextElementHandler
是一个
IElementHandler
实现,它向
ColumnText

public class ColumnTextElementHandler : IElementHandler
{
    public ColumnTextElementHandler(ColumnText ct)
    {
        this.ct = ct;
    }

    ColumnText ct = null;

    public void Add(IWritable w)
    {
        if (w is WritableElement)
        {
            foreach (IElement e in ((WritableElement)w).Elements())
            {
                ct.AddElement(e);
            }
        }
    }
}
顺便说一下,上面的测试生成了包含以下内容的PDF:



免责声明:我主要使用Java,以前没有使用过
XmlWorker
。因此,这段代码可能有相当大的改进潜力。

当前的EVO API接受不同的参数,如header作为HTML字符串,body/content作为HTML字符串,footer作为HTML字符串。最后,使用“PrepareRenderPdfPageEvent”合并并构建一个完整的PDF模板。使用iTextSharp,我使用XMLParser将主体HTML字符串解析为PDF。我