为什么你说你的代码示例不起作用?我已将您的 iText 和 Android 示例合并为一个新示例:ColoredLetters
我写了一个和你类似的方法:
private Chunk returnCorrectColor(char letter) {
if (letter == 'b'){
return B;
}
else if(letter == 'g'){
return G;
}
return new Chunk(String.valueOf(letter), RED_NORMAL);
}
请注意,我使用了一些常量:
public static final Font RED_NORMAL = new Font(FontFamily.HELVETICA, 12, Font.NORMAL, BaseColor.RED);
public static final Font BLUE_BOLD = new Font(FontFamily.HELVETICA, 12, Font.BOLD, BaseColor.BLUE);
public static final Font GREEN_ITALIC = new Font(FontFamily.HELVETICA, 12, Font.ITALIC, BaseColor.GREEN);
public static final Chunk B = new Chunk("b", BLUE_BOLD);
public static final Chunk G = new Chunk("g", GREEN_ITALIC);
现在我可以像这样构造一个Paragraph:
Paragraph p = new Paragraph();
String s = "all text is written in red, except the letters b and g; they are written in blue and green.";
for (int i = 0; i < s.length(); i++) {
p.add(returnCorrectColor(s.charAt(i)));
}
结果如下所示:colored_letters.pdf
另一种方法是使用不同的字体,其中 fontB 仅包含字母 b,而 fontG 仅包含字母 g。然后,您可以将这些字体与普通字体一起声明给FontSelector 对象。然后,您可以处理字体。有关使用此替代方法的示例,请阅读我对以下问题的回答:iText changing the font color and size when using fontselector
基于 cmets 中的其他问题的更新
我可以将颜色指定为十六进制吗?例如像BaseColor(#ffcd03); 这样的东西我知道你可以像new BaseColor(0, 0, 255) 这样指定它,但是HEX 会更有用。
实际上,我自己更喜欢 HEX 表示法,因为当它们以 HEX 表示法表示时,我更容易识别某些颜色。这就是为什么我经常在 Java 中使用 HEX 表示法来表示整数:new BaseColor(0xFF, 0xCD, 0x03);
另外,HtmlUtilities 类中有一个decodeColor() 方法可以这样使用:
BaseColor color = HtmlUtilities.decodeColor("#ffcd03");
有没有办法只定义颜色并将字体保留为默认值。像这样: public static final Font RED_NORMAL = new Font(BaseColor.RED);
你可以这样创建字体:
new Font(FontFamily.UNDEFINED, 12, Font.UNDEFINED, BaseColor.RED);
现在,当您将具有此类字体的 Chunk 添加到 Paragraph 时,它应该采用在 Paragraph 级别定义的字体(这就是我第一次编写 iText 时的意图。我应该检查一下如果这仍然是真的)。
我的目标是编写一个程序,在不改变 PDF 结构的情况下为现有 PDF 文件着色。您认为这种方法是否适用于此目的(性能等)?
不,这不起作用。如果您阅读了chapter 6 of the second edition of iText in Action 的介绍,您就会明白 PDF 不是为编辑而创建的格式。屏幕截图中显示的句子的内部语法如下所示:
BT
36 806 Td
0 -16 Td
/F1 12 Tf
1 0 0 rg
(all text is written in red, except the letters ) Tj
0 g
/F2 12 Tf
0 0 1 rg
(b) Tj
0 g
/F1 12 Tf
1 0 0 rg
( and ) Tj
0 g
/F3 12 Tf
0 1 0 rg
(g) Tj
0 g
/F1 12 Tf
1 0 0 rg
(; they are written in ) Tj
0 g
/F2 12 Tf
0 0 1 rg
(b) Tj
0 g
/F1 12 Tf
1 0 0 rg
(lue and ) Tj
0 g
/F3 12 Tf
0 1 0 rg
(g) Tj
0 g
/F1 12 Tf
1 0 0 rg
(reen.) Tj
0 g
0 0 Td
ET
如你所见,Tf 操作符改变了字体:
-
/F1 是常规字体,
-
/F2 是粗体,
-
/F3 是斜体。
这些名称引用页面的/Resources 字典中的字体,您可以在其中找到对实际字体描述符的引用。
rg 运算符更改颜色。当我们使用红色、绿色和蓝色时,您可以识别操作数 1 0 0、0 1 0 和 0 0 1。
这看起来相当简单,因为我们使用了 WINANSI 编码。可以解析内容流,查找所有 PDF 字符串(在( 和) 之间或< 和> 之间),并引入Tf 和rg 运算符。
但是:内容流并不总是像这里那样微不足道。可以使用自定义编码,可以使用 Unicode,... 看看我对以下问题的回答中的第二个屏幕截图:Can't get Czech characters while generating a PDF。您将了解更改现有 PDF 中颜色的计划并非易事。我们过去曾为我们的一位客户做过这样的项目。这是一个耗时数周的项目。