我的任务是替换pdf中的字符串。 不幸的是,该字符串是使用Identity-H编码的TrueType CID字体。
这是cos词典:
(COSName{Font}:COSDictionary{(COSName{F1}:COSDictionary{(COSName{DescendantFonts}:COSArray{[COSObject{32, 0}]})COSName{BaseFont}:COSName{RVJLXS+ArialUnicodeMS})(COSName{Type}:COSName{Font}) (COSName{Encoding}:COSName{Identity-H})COSName{Subtype}:COSName{Type0})COSName{ToUnicode}:COSDictionary{(COSName{Length}:COSInt{647})(COSName{Filter}:COSName{FlateDecode}) }) })
实际上,当我提取字符串的令牌时,它会出现如下的ascii字符:“$ O H V V D Q G U R” 要解码它,我使用以下代码:
COSString previous = (COSString) tokens.get(j - 1);
byte[] String_byte = previous.getString().getBytes();
String_byte = previous.getString().getBytes();
codeLength = 1;
for (int in = 0; in < String_byte.length; in += codeLength) {
// Decode the value to a
// Unicode
// character
codeLength = 1;
String c = Font_Type.encode(String_byte, in, codeLength);
int[] codePoints = null;
if (c == null && in + 1 < String_byte.length) {
// maybe a multibyte
// encoding
codeLength++;
c = Font_Type.encode(String_byte, in, codeLength);
codePoints = new int[] { Font_Type.getCodeFromArray(String_byte,in, codeLength) };
}
工作正常。在解码之后,我替换了获得的字符串,但我无法再次对其进行编码,以便获得正确的ascii序列,如前一个($ O H V V D Q G U R),替换或附加到原始字符串中。
previous.append(newstring.getBytes());
我希望一切都清楚。 在此先感谢您的帮助。 麦酒
答案 0 :(得分:0)
考虑到方法参数和返回类型,您似乎正在使用1.8'版本的PDFBox。我怀疑你会找到现成的方法来做Unicode - &gt;那里的CID转换因为那些版本甚至没有从头开始使用多字节编码来绘制文本的方法。 (实际上它们只支持WinAnsiEncoding,甚至不正确。)它们只支持文本提取的多字节编码,即另一个方向。
因此,使用您假定的PDFBox版本,您必须使用低级方法自行解析这些字体信息
从版本2.0.0起,PDFBox确实支持使用包括字体子集创建在内的多字节编码的文本绘图。因此,如果您可以切换到PDFBox版本2,那么您可能会更幸运。
特别是此PDFont.encode
重载(现在是唯一的公共过载)看起来适合您的任务:
/**
* Encodes the given string for use in a PDF content stream.
*
* @param text Any Unicode text.
* @return Array of PDF content stream bytes.
* @throws IOException If the text could not be encoded.
*/
public final byte[] encode(String text) throws IOException
我不确定这种方法是否适用于从PDF读取的字体,其主要用途是与外部资源生成的字体结合使用。
(显然,如果字体仅作为PDF中的子集嵌入并且不包含替换字符的字形,则该方法无法帮助。)