Я пытаюсь добавить пользовательские шрифты в PDF.PDF создается из строки, представляющей HTML.
Вот пример строки HTML:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="styles/style.css" />
</head>
<body>
<div>
<span class="test-style">TEST text</span>
</div>
</body>
</html>
Вот мой CSS-файл
@font-face {
font-family: 'Montserrat';
src: url('../fonts/Montserrat-Light.ttf') format('truetype');
}
@font-face {
font-family: 'SourceSansPro';
src: url('../fonts/SourceSansPro-Regular.ttf') format('truetype'),
url('../fonts/SourceSansPro-SemiBold.ttf') format('truetype');
}
.test-style {
width: 973px;
height: 1684px;
background-color: white;
margin: 100px 108px 0 108px;
font-family: Montserrat;
}
Последний шаг - мой метод генерации pdf:
public void GeneratePdf(string htmlPdf)
{
//var pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 10f);
var pdfDoc = new Document(PageSize.A4);
List<string> cssFileList = new List<string>();
cssFileList.Add(@"/styles/style.css");
using (var memoryStream = new MemoryStream())
{
var writer = PdfWriter.GetInstance(pdfDoc, memoryStream);
writer.CloseStream = false;
pdfDoc.Open();
FontFactory.Register(@"C:\Programy\ResultsPdfGenerator\ResultsPdfGenerator\fonts\Montserrat-Light.ttf");
var montserrat = FontFactory.GetFont("Montserrat", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
writer.DirectContent.SetFontAndSize(montserrat.BaseFont, 24f);
FontFactory.Register(@"C:\Programy\ResultsPdfGenerator\ResultsPdfGenerator\fonts\SourceSansPro-Regular.ttf");
var sourceSansPro = FontFactory.GetFont("SourceSansPro-Regular", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
writer.DirectContent.SetFontAndSize(sourceSansPro.BaseFont, 24f);
FontFactory.Register(@"C:\Programy\ResultsPdfGenerator\ResultsPdfGenerator\fonts\SourceSansPro-SemiBold.ttf");
var sourceSansProSemiBold = FontFactory.GetFont("SourceSansPro-SemiBold", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
writer.DirectContent.SetFontAndSize(sourceSansProSemiBold.BaseFont, 24f);
HtmlPipelineContext htmlContext = new HtmlPipelineContext(null);
htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());
ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
cssFileList.ForEach(i=> cssResolver.AddCssFile(@"C:\\Programy\\ResultsPdfGenerator\\ResultsPdfGenerator\\styles\\style.css", true));
IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(pdfDoc, writer)));
XMLWorker worker = new XMLWorker(pipeline, true);
XMLParser xmlParser = new XMLParser(worker);
xmlParser.Parse(new MemoryStream(Encoding.UTF8.GetBytes(htmlPdf)));
pdfDoc.Close();
//var htmlparser = new HTMLWorker(pdfDoc);
//htmlparser.Parse(new StringReader(htmlPdf));
pdfDoc.Close();
byte[] bytes = memoryStream.GetBuffer();
File.WriteAllBytes(@"C:\file.pdf", bytes);
memoryStream.Close();
}
}
В сгенерированном pdf я вижу все добавленные шрифты (в свойстве pdf), но они не используются.Тем не менее, мой PDF уродлив ... Есть предложения?