【问题标题】:itextpdf / PdfContentByte / Font - How to combine 2 or more of BOLD, ITALICS AND UNDERLINEitextpdf / PdfContentByte / 字体 - 如何组合 2 个或多个粗体、斜体和下划线
【发布时间】:2020-10-19 23:25:50
【问题描述】:

作为我正在进行的项目的一部分,我需要使用数据库中的内容、位置、文本样式来创建 PDF 文件。我正在使用PdfContentByte 向文档中添加文本。内容、位置和文本大小都可以正常工作,但我无法理解如何合并可能是粗体、斜体和下划线中的一种或多种组合的文本样式。我查看了有关 SOF 的许多其他问题,但无法使其正常工作。
我尝试做的是使用数据库中的文本样式创建一个Font,然后使用Font.getBaseFont() 获取一个BaseFont,如下所示。

Font custFont = FontFactory.getFont("/fonts/arial.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 0.8f, Font.BOLDITALIC, BaseColor.BLACK); 
// "/fonts/arial.ttf", Font.BOLDITALIC, BaseColor.BLACK ETC BASED ON THE FONT STYLE FROM DB
BaseFont baseFont = custFont.getBaseFont();
pdfContentByte.setFontAndSize(baseFont, fontSizeFromDB);
pdfContentByte.showTextAligned(Element.ALIGN_LEFT, "Text From DB", xPosFromDB, yPosFromDB, 0);

这不起作用。只有字体系列被复制到baseFont 对象中。

但是,当我在下面的段落中使用字体时,字体样式可以正常工作。 (但我不能使用它,因为我需要将内容插入到需要使用PdfContentByte 的特定位置)

Font custFontTimes = new Font(Font.FontFamily.TIMES_ROMAN, 18, Font.BOLD | Font.UNDERLINE);  
Paragraph paragraphCusTime = new Paragraph("Paragraph text in custFontTimes", custFontTimes);
document.add(paragraphCusTime);

【问题讨论】:

    标签: java fonts itext


    【解决方案1】:

    您可以通过使用组合的BoldItalic 样式修饰符创建基本字体来做到这一点。使用pdfContentByte.setFontAndSize 的限制是您只能使用14 种内置类型中的一种,而TIMES_BOLDITALIC 是唯一符合您条件的类型。

    您似乎使用的是 iText 2.1.7,我没有副本来测试它是否有效,但使用内置字体的简单解决方案可能如下所示:

    BaseFont baseFont = BaseFont.createFont(BaseFont.TIMES_BOLDITALIC, BaseFont.CP1257, BaseFont.EMBEDDED);
    

    或者您可以尝试使用带有样式修饰符的 TrueType 字体。您需要使用它来找到一种同时具有粗体和斜体的字体,但是当您找到一种字体时,它可能看起来像这样:

    BaseFont baseFont = BaseFont.createFont("Arial-CE-Bold-Italic", BaseFont.CP1257, BaseFont.EMBEDDED);
    

    请注意,嵌入字体可能行为不端,您可能需要尝试将嵌入设置为 false。

    我已经很久没有使用 iText 2.1.7 了,但它确实有很多这样的限制,我强烈建议使用最新版本的 iText,特别是考虑到很难找到示例旧版本。

    API 参考: https://coderanch.com/how-to/javadoc/itext-2.1.7/com/lowagie/text/pdf/BaseFont.html#createFont(java.lang.String,%20java.lang.String,%20boolean)

    API 报价:

    BaseFont createFont(java.lang.String name, java.lang.String 编码, 布尔嵌入, 布尔力读取) 抛出 DocumentException, java.io.IOException

    创建一个新字体。此字体可以是 14 种内置类型之一, AFM 或 PFM 文件引用的 Type1 字体,TrueType 字体(简单 或集合)或 Adob​​e Asian Font Pack 中的 CJK 字体。真型 字体和 CJK 字体可以附加一个可选的样式修饰符 名字。这些修饰符是:粗体、斜体和粗体斜体。一个例子 将是“STSong-Light,Bold”。

    【讨论】:

    • 非常感谢...我使用的是 iText 5 并移至 7,它有很多更好的选择并且更易于使用
    猜你喜欢
    • 2010-11-25
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2013-11-06
    • 2020-01-25
    • 2021-08-02
    相关资源
    最近更新 更多