Летающая тарелка (xhtmlrenderer) не жирным шрифтом? - PullRequest
4 голосов
/ 23 июля 2010

Я использую пользовательский шрифт TrueType в PDF, сгенерированном летающей тарелкой xhtmlrenderer.

ITextRenderer renderer = new ITextRenderer();
renderer.getFontResolver().addFont("myfont.ttf", BaseFont.CP1252, BaseFont.EMBEDDED);
renderer.setDocument(XMLResource.load(in).getDocument(), url);
renderer.layout();
renderer.createPDF(out);

и в отображаемом html у меня есть следующее (например)

<html>
<head>
<style type="text/css">
*{font-family:myfont;} /* <-- this works, trust me */
</style>
</head>
<body>
<p>some plain text<b>some bold text</b> <span style="font-weight:bold;">more bold</span></p>
</body>
</html>

, но даже с <b> и font-weight:bold я не могу получить текст, выделенный жирным шрифтом.

Теперь я знаю, что это должно работать, потому что у меня есть аналогичный (унаследованный) проект, которыйиспользует тот же шрифт и обычный старый itext (т.е. без xhtmlrenderer), и он создает PDF-файлы с жирным текстом через:

myFont = BaseFont.createFont("myfont.ttf", BaseFont.CP1252, BaseFont.EMBEDDED);
Font boldFont = new Font(myFont);
boldFont.setStyle(Font.BOLD);

com.lowagie.text.Document document = ...;
document.add(new Paragraph("plain", myFont));
document.add(new Paragraph("bold", boldFont));

Может кто-нибудь объяснить, почему я не могу использовать жирный шрифт с xhtmlrenderer, и, возможно, способчтобы решить эту проблему?

спасибо, стр.

Ответы [ 2 ]

4 голосов
/ 27 июля 2010

Я не эксперт, но если ваш шрифт не выделен жирным шрифтом, то Flying Saucer может просто «не сделать его жирным».Когда вы программно делаете шрифт жирным, вы используете класс шрифта, который мог бы (за кадром) сделать шрифт «более смелым» сам по себе, используя какой-то внутренний механизм.Хорошим примером этого в реальном мире является Photoshop: если у вас есть шрифт, который не имеет жирного разнообразия, вы не можете сделать его жирным, но у Photoshop есть опция «имитация жирного шрифта», которая будет увеличиваться и увеличиваться.символы без реального использования «истинного» жирного шрифта.

Хороший способ диагностировать это наверняка - поменять шрифт, который вы используете в Flying Saucer, но сохранить тот же документ.Если новый шрифт также не выделен жирным шрифтом, то проблема менее актуальна.Если оно становится жирным, значит, шрифта нет.

Надеюсь, это поможет.

2 голосов
/ 27 июля 2010

Если ваш устаревший код iText может создавать жирный шрифт, то, вероятно, файл TTF на самом деле содержит жирный вариант, даже если Flying Saucer его не использует.Возможно, вы сможете использовать жирный вариант в Flying Saucer, если в своей таблице стилей CSS укажите точное имя жирного варианта.

Например:

<style type="text/css"> 
* {font-family:myfont;}
b {font-family:"myfont bold";}
</style> 

Вы сможете найти точное имя шрифта, открыв PDF-файл, созданный с помощью устаревшего кода в Adobe Reader.Перейдите в Файл -> Свойства ... -> Шрифты, чтобы увидеть список всех шрифтов в документе.Вероятно, будет запись «myfont», а также запись «myfont bold» или аналогичная.Используйте последнее в вашей таблице стилей.

...