在 jasper report 中使用不同的字体时,需要使用font-extensions。
但是,如果字体未正确呈现,是否有一种方法可以测试 pdf 是否支持该字体,以便我了解问题是否与我的字体扩展或.ttf
字体有关?
从 jasper 报告导出到 pdf 时字体渲染不正确是一个常见的问题示例Jasper Reports PDF 不导出西里尔文值,如清单点 1 所示,使用字体扩展并不总是足够的,字体需要也得到支持pdf 生成库并能够渲染实际字符。这就是为什么我决定通过这个 QA 风格的问题,以便将来的用户在点击清单 1 时可以参考如何快速测试字体。
由于 jasper 报告使用 文本 library 测试您的字体是否可以在 pdf 中正确呈现的最简单方法是直接使用 itext 进行测试。
示例程序*,改编自iText:第 11 章:选择正确的字体
import java.io.FileOutputStream; import java.io.IOException; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.Font; import com.lowagie.text.Paragraph; import com.lowagie.text.pdf.BaseFont; import com.lowagie.text.pdf.ColumnText; import com.lowagie.text.pdf.PdfWriter; public class FontTest { /** The resulting PDF file. */ public static final String RESULT = "fontTest.pdf"; /** the text to render. */ public static final String TEST = "Test to render this text with the turkish lira character \u20BA"; public void createPdf(String filename) throws IOException, DocumentException { Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename)); document.open(); BaseFont bf = BaseFont.createFont( "pathToMyFont/myFont.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); Font font = new Font(bf, 20); ColumnText column = new ColumnText(writer.getDirectContent()); column.setSimpleColumn(36, 730, 569, 36); column.addElement(new Paragraph(TEST, font)); column.go(); document.close(); } public static void main(String[] args) throws IOException, DocumentException { new FontTest().createPdf(RESULT); } }
一些注释(见示例):
\u20BA
以避免文件上的编码类型问题。结论:
*最新的 jasper-reports 发行版使用了一个特殊的版本 itext-2.1.7,这个版本中的导入是
com.lowagie.text
,如果你使用的是更高版本的导入,com.itextpdf.text
就像改编的例子一样。