itextsharp - добавляет пользовательские шрифты в pdf, сгенерированные из строки html c # - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь добавить пользовательские шрифты в 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 уродлив ... Есть предложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...