通过iText创建PDF文档时未应用某些HTML和CSS样式

时间:2018-06-19 15:28:56

标签: c# itext pdf-generation itext7 html-to-pdf

从HTML生成PDF时,iText出现问题。我正在传递Locize的“导入信息部分”,其中包含粗体标签和列表项目符号

<li>\n                    
   <b>Toll-free</b> (within Canada and the USA): 
   <b>1.800.xxxxxxx</b>\n                
</li>\n  

在Confirmation.cs中生成pdf文件。下面列出了从Confirmation.cs传递到ImportantInformation.cs的参数“ medSrc”。不知何故,粗体样式和列表项目符号仅不适用于结果pdf文件。

我已经调试了一段时间,但仍然不知道发生了什么。有人知道我错过了吗?

提前谢谢!

Confirmation.cs

    ...
    namespace xxx.Pdf.xxx.xxx
    {
    public partial class Confirmation
    {
        private IApplication application;

        public Confirmation(IApplication application)
        {
            this.application = application;
        }

        public byte[] Create()
        {
            var memoryStream = new MemoryStream();
            var css = Content.Css;

            //Create Document
            PdfDocument pdfDocument = new PdfDocument(new PdfWriter(memoryStream));
            PageSize pageSize = PageSize.LETTER;
            Document document = new Document(pdfDocument, pageSize);

            Header headerHandler = new Header(document);
            PageXofY footerHandler = new PageXofY(pdfDocument);
            document.SetTopMargin(headerHandler.GetTableHeight());

            //Assign event-handlers
            pdfDocument.AddEventHandler(PdfDocumentEvent.START_PAGE, headerHandler);
            pdfDocument.AddEventHandler(PdfDocumentEvent.END_PAGE, footerHandler);

           ...
            // ======>Important Information <=======
            var importantInfo = new ImportantInformation();
            Table impInfoTable = importantInfo.CreateTable(
                HtmlUtility.MergeCssWithHtml(css, Content.ImportantInformationEmergencyMedical),
                HtmlUtility.MergeCssWithHtml(css, Content.ImportantInformationTripCancellation));

            document.Add(impInfoTable).Add(new Paragraph("\n"));

            //set column parameters
            float offset = 36;
            float columnWidth = (pageSize.GetWidth() - offset * 2 + 15) / 2;
            float columnHeight = pageSize.GetHeight() - offset * 2;
            float tableWidth = columnWidth - 10;

            //define column area
            Rectangle[] columns = new Rectangle[]
            {
                new Rectangle(offset , offset, columnWidth, columnHeight),
                new Rectangle(columnWidth + 30, offset, columnWidth, columnHeight)
            };
            document.SetRenderer(new ColumnDocumentRenderer(document, columns));

            document.Add(new AreaBreak(AreaBreakType.LAST_PAGE));

            foreach (Applicant applicant in application.Applicants)
            {
                ApplicantTable applicantTable = new ApplicantTable();
                Table table = applicantTable.CreateTable(applicant, tableWidth);
                //Table another = applicantTable.CreateTable(application.Applicants[1], tableWidth);

                document.Add(table).Add(new Paragraph("\n").SetFontSize(3));
            }

            footerHandler.WriteTotal(pdfDocument);

            document.Close();

            pdfDocument.Close();

            var pdf = memoryStream.ToArray();

            return pdf;
        }
    }
}

ImportantInformation.cs

...
namespace xxx.xxx.xxx.Pdf
{
    public class ImportantInformation
    {
    public Table CreateTable(string medSrc, string tciSrc)
    {
        float[] colWidth = new float[] { 50f, 50f };
        Table table = new Table(UnitValue.CreatePercentArray(colWidth));
        table.SetWidth(new UnitValue(UnitValue.PERCENT, 100));

        PdfFont avenir = FontFactory.CreateAvenirLightStandardMedium();

        Paragraph title = new Paragraph().Add("**IMPORTANT INFORMATION**").SetFontSize(12).SetFont(avenir).SetBold().SetTextAlignment(TextAlignment.CENTER);
        Cell titleCell = new Cell(1, 2).Add(title).SetBorder(Border.NO_BORDER);
        table.AddCell(titleCell);

        Cell medImportantinfo = new Cell()
            .SetBorder(Border.NO_BORDER)
            .Add(new Paragraph("Paragraph A")
            .SetFirstLineIndent(10f)
            .SetBold()
            .SetFontSize(9)
            .SetFont(avenir));
        Cell tciImportantInfo = new Cell()
            .SetBorder(Border.NO_BORDER)
            .Add(new Paragraph("Paragraph B")
            .SetFirstLineIndent(10f)
            .SetBold()
            .SetFontSize(9)
            .SetFont(avenir));

        IList<IElement> medInfo = HtmlToCellFormat.HtmlToElements(medSrc);

        IList<IElement> tciInfo = HtmlToCellFormat.HtmlToElements(tciSrc);

        foreach (IElement e in medInfo)
        {
            medImportantinfo.ElementToCell(e);
        }

        foreach (IElement e in tciInfo)
        {
            tciImportantInfo.ElementToCell(e);
        }

        table.AddCell(medImportantinfo).AddCell(tciImportantInfo);

        return table;
        }
    }
}

medSrc:

<html>
<body>\n    
    <ul style=\"text-align: justify; list-style-type: disc; font-family: avenir, Arial, Helvetica, sans-serif; font-size: 10px\">\n        
        <li>\n            In the event of a medical emergency contact:\n            
            <ul style=\"text-align: justify; list-style-type: circle; font-family: avenir, Arial, Helvetica, sans-serif; font-size: 10px\">\n                
                <li>\n                    
                    <b>Toll-free</b> (within Canada and the USA): 
                    <b>1.800xxxxxx</b>\n                
                </li>\n                
                <li>\n                    
                    <b>Collect</b> (from all other locations): 
                    <b>1.xxxxxx</b>\n                
                </li>\n            
            </ul>\n        
        </li>\n        
        ...
    </body>
</html>

更新: 这是ElementToCell和HtmlToElements功能的定义

public static class HtmlToCellFormat
{
    public static string baseUri = "/";

    public static void ElementToCell(this Cell cell, IElement e)
    {
        var type = e.GetType().ToString();
        if (e.GetType() == typeof(Image))
        {

            cell.Add((Image)e);
        }
        else if (e.GetType() == typeof(Paragraph) || (e.GetType() == typeof(List)))
        {
            cell.Add((IBlockElement)e);
        }
    }

    public static IList<IElement> HtmlToElements(string content)
    {
        ConverterProperties properties = new ConverterProperties();
        properties.SetBaseUri(baseUri);
        FontProvider fontProvider = new DefaultFontProvider(false, false, false);
        FontProgram fontProgram = FontProgramFactory.CreateFont();
        fontProvider.AddFont(fontProgram, "");
        properties.SetFontProvider(fontProvider);
        IList<IElement> elements = HtmlConverter.ConvertToElements(content, properties);
        return elements;
    }
}

1 个答案:

答案 0 :(得分:0)

我通过阅读iText上的文章解决了此问题 https://developers.itextpdf.com/content/itext-7-converting-html-pdf-pdfhtml/chapter-6-using-fonts-pdfhtml

只需更改

FontProvider fontProvider = new DefaultFontProvider(false, false, false); 

FontProvider fontProvider = new DefaultFontProvider(true, true, true);