当前位置: 首页 > 知识库问答 >
问题:

IText7 PDFHtml生成器,带页眉和页脚,用于C#

南门欣怡
2023-03-14

我正在尝试从预定义的HTML内容生成PDF。我设法生成了内容,但没有所需的HTML页眉、HTML页脚和阿拉伯语也不受支持。

我的要求:

>

  • 阿拉伯语支持。
  • 生成超过10页的能力。
  • 页脚可能因页而异。

    有一个Web应用程序向WCF服务发送请求,该服务返回一个包含PDF的字节数组。

    所以,我一直在寻找一个好的工具,我发现SelectPdf,它是完美的,除了它不是免费的,所以唯一的解决方案是IText7 PDFHtml。问题是这个库有很好的JAVA文档,我很难遵循C#示例并从JAVA API转换为C#代码。以前有人用c#做过类似的事情吗?

  • 共有1个答案

    方寒
    2023-03-14

    经过长时间的搜索和尝试,我已经让它工作并实现了以下功能:

    >

  • 标题中的图像。

    Base64图像在页脚中,除了在页脚的另一侧写一些文本的能力。

    之前的所有功能都是免费的,但是,支持阿拉伯语需要许可证,所以我必须付费:)

    请在下面找到我的C#代码,如果有任何改进,请发布。

    public class Pdfgenerator
    {
        public const string FONT = "Fonts/NotoNaskhArabic-Regular2.ttf";
        public static string HEADER_TEXT = "<table width=\"100%\" border=\"0\"><tr><td>Header</td><td align=\"right\">Some title</td></tr></table>";
        public static string FOOTER_TEXT = "<table width=\"100%\" border=\"0\"><tr><td>Footer</td><td align=\"right\">Some title</td></tr></table>";
        public MemoryStream createPdf()
        {
            string apPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
            MemoryStream file = new MemoryStream();
            PdfDocument pdfDocument = null;
            PdfDocument pdfDoc = null;
            PdfDocument pdfDocument1 = null;
            try
            {
    
                using (file)
                {
                    PdfFont f = PdfFontFactory.CreateFont(apPath + FONT, PdfEncodings.IDENTITY_H);
                    string header = "pdfHtml Header and footer example using page-events";
                    Header headerHandler = new Header(header);
                    Footer footerHandler = new Footer();
                    ConverterProperties converterProperties = new ConverterProperties();
                    PdfWriter writer1 = new PdfWriter(apPath + "test1.pdf");
                    pdfDocument1 = new PdfDocument(writer1);
                    pdfDocument1.AddEventHandler(PdfDocumentEvent.START_PAGE, headerHandler);
                    pdfDocument1.AddEventHandler(PdfDocumentEvent.END_PAGE, footerHandler);
                    converterProperties = new ConverterProperties().SetBaseUri(apPath);
    
                    HtmlConverter.ConvertToDocument(File.ReadAllText(apPath + "content.html"), pdfDocument1, converterProperties);
                    footerHandler.lastPage = pdfDocument1.GetLastPage();
    
                    pdfDocument1.Close();
                }
            }
            catch (Exception ex)
            {
    
            }
            finally
            {
                file.Dispose();
            }
    
            return new MemoryStream();
        }
    }
    

    生成标题:

    class Header : IEventHandler
    {
        private string header;
        private Image image;
        public Header(string header)
        {
            string apPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
            this.header = header;
            image = new Image(ImageDataFactory.Create(apPath + "Images/RANDOM_PHOTO.jpg"));
    
        }
    
        public void HandleEvent(Event @event)
        {
            PdfDocumentEvent docEvent = (PdfDocumentEvent)@event;
            PdfDocument pdf = docEvent.GetDocument();
            PdfPage page = docEvent.GetPage();
            Rectangle pageSize = page.GetPageSize();
    
            Canvas canvas = new Canvas(new PdfCanvas(page), pdf, pageSize);
            canvas.SetFontSize(18);
    
    
            // Write text at position
            canvas.Add(image);
            canvas.Close();
        }
    }
    

    生成页脚:

    class Footer : IEventHandler
    {
        public PdfPage lastPage = null;
        protected PdfFormXObject placeholder;
        protected float side = 20;
        protected float x = 300;
        protected float y = 25;
        protected float space = 4.5f;
        protected float descent = 3;
    
        public Footer()
        {
            placeholder = new PdfFormXObject(new Rectangle(0, 0, side, side));
        }
    
        public void HandleEvent(Event @event)
        {
            PdfDocumentEvent docEvent = (PdfDocumentEvent)@event;
            PdfDocument pdf = docEvent.GetDocument();
            PdfPage page = docEvent.GetPage();
            int pageNumber = pdf.GetPageNumber(page);
            Rectangle pageSize = page.GetPageSize();
            // Creates drawing canvas
            PdfCanvas pdfCanvas = new PdfCanvas(page);
            Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);
    
            IList<iText.Layout.Element.IElement> elements = HtmlConverter.ConvertToElements("<table border=\"0\"><tr><td><img src=\"data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==\" alt=\"Italian Trulli\"></td></tr></table>");
            Paragraph p = new Paragraph();
    
            foreach (iText.Layout.Element.IElement e in elements)
            {
                if (e is IBlockElement) {
                    p.Add((IBlockElement)e);
                }
            }
            if (lastPage == docEvent.GetPage()) {
    
            }
            else
            {
                canvas.ShowTextAligned(p, 25, 75, TextAlignment.LEFT);
            }
    
            canvas.Close();
    
            // Create placeholder object to write number of pages
            pdfCanvas.AddXObject(placeholder, x + space, y - descent);
            pdfCanvas.Release();
        }
    
        public void writeTotal(PdfDocument pdf)
        {
            Canvas canvas = new Canvas(placeholder, pdf);
            canvas.ShowTextAligned(pdf.GetNumberOfPages().ToString(),
                    0, descent, TextAlignment.LEFT);
            canvas.Close();
        }
    }
    

    我试图得到一个流作为输出,所以如果你也想要,你可以在你的主要服务中使用以下内容:

    public byte[] GetData()
        {
            MemoryStream stream = new Pdfgenerator().createPdf();
            byte[] arr = stream.ToArray();
            return stream.ToArray();
        }
    

  •  类似资料:
    • 问题内容: 我意识到之前曾有人问过这个问题(我查看了所有解决方案并尝试了所有解决方案),但我仍在尝试生成一个PDF文件,该文件的页眉和页脚在每个页面上都重复出现。 我在使用R8时尝试了许多不同的方法来使其正常工作,但到目前为止没有任何效果。我测试过的一些方法是https://gist.github.com/626264,使用运行元素和边距框 http://pigeonholdings.com/pr

    • 也许以前有人问过这个问题,但我似乎找不到一个准确的答案或解决办法。我开始使用RecycerView,并使用LinearLayoutManager实现了它。现在,我想添加自定义的页眉和页脚项,这些项不同于RecycerView中的其他项。页眉和页脚不应该粘,我希望他们滚动与其余的项目。有人能指出一些例子如何做到这一点或只是分享想法。我会非常感激的。THX

    • 问题内容: 如何在我的PDF页面中添加 页眉 和 页脚 ?我想要一个表,表头中有3列,其他表中,页脚中有3列。我的页面可能是A3或A4,并且是横向或纵向。 谁能帮我?我在互联网上找不到很好的例子。 谢谢! mas正 问题答案: 创建一个MyPageEventListener类,该类扩展了 PdfPageEventHelper 将页面事件侦听器添加到PdfWriter对象 在MyPageEventL

    • 问题内容: 我真的不喜欢在每个控制器中编写代码: 是否可以这样做,将自动包含页眉和页脚,如果需要更改它,我们也可以这样做吗?你怎么处理?还是您认为这不是问题?谢谢。 问题答案: 这是我的工作: 对于CI 3.x: 然后,在您的控制器中,这就是您要做的一切:

    • 问题内容: 静态HTML /XHTML是否有一种不错的方法来创建要显示在网站的每个页面上的通用页眉/页脚文件?我知道您显然可以使用PHP或服务器端指令来执行此操作,但是有没有办法完全不依赖服务器将所有内容拼接在一起呢? 编辑:所有非常好的答案,这是我所期望的。HTML是静态的。没有运行服务器端或客户端的东西,没有真正的方法来改变它。我发现Server Side Includes似乎是我最好的选择,

    • 我在jasper报告中使用了这个表。当我把表放在详细信息部分时,它重复了这个表,所以我把它放在摘要带上。我也想在我的报告中添加页脚。 我怎么做这个jasper报告5.5?