首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >某些超文本标记语言和CSS样式在使用iText创建PDF文档时不适用

某些超文本标记语言和CSS样式在使用iText创建PDF文档时不适用
EN

Stack Overflow用户
提问于 2018-06-19 23:28:56
回答 1查看 2.9K关注 0票数 2

当从超文本标记语言生成iText时,我遇到了一个问题。我正在传递来自Locize的"import information section“,它包含粗体标记和列表项目符号

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

pdf文件是在Confirmation.cs中生成的。从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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-21 22:53:20

我通过阅读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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50932038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档