从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;
}
}
答案 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);