我需要从一些 swf 文件中提取所有文本。我正在使用 Java,因为我有很多用这种语言开发的模块。因此,我在网上搜索了所有专门用于处理 SWF 文件的免费 Java 库。最后,我找到了StuartMacKay开发的库。该库名为transform-swf,可通过单击此处在 GitHub 上找到。
问题是:一旦我GlyphIndex
从 a 中提取 es TextSpan
,我如何转换字符中的 glyp?
请提供一个完整的工作和测试示例。不会接受任何理论答案,也不会接受诸如“无法完成”、“不可能”等答案。
我所知道的和我所做
的我知道GlyphIndex
es 是通过使用 aTextTable
构建的,它是通过循环到表示字体大小和DefineFont2
对象提供的字体描述的整数来构造的,但是当我解码所有 DefineFont2 时,都有零长度提前。
以下是我所做的。
//Creating a Movie object from an swf file.
Movie movie = new Movie();
movie.decodeFromFile(new File(out));
//Saving all the decoded DefineFont2 objects.
Map<Integer,DefineFont2> fonts = new HashMap<>();
for (MovieTag object : list) {
if (object instanceof DefineFont2) {
DefineFont2 df2 = (DefineFont2) object;
fonts.put(df2.getIdentifier(), df2);
}
}
//Now I retrieve all the texts
for (MovieTag object : list) {
if (object instanceof DefineText2) {
DefineText2 dt2 = (DefineText2) object;
for (TextSpan ts : dt2.getSpans()) {
Integer fontIdentifier = ts.getIdentifier();
if (fontIdentifier != null) {
int fontSize = ts.getHeight();
// Here I try to create an object that should
// reverse the process done by a TextTable
ReverseTextTable rtt =
new ReverseTextTable(fonts.get(fontIdentifier), fontSize);
System.out.println(rtt.charactersForText(ts.getCharacters()));
}
}
}
}
课程ReverseTextTable
如下:
public final class ReverseTextTable {
private final transient Map<Character, GlyphIndex> characters;
private final transient Map<GlyphIndex, Character> glyphs;
public ReverseTextTable(final DefineFont2 font, final int fontSize) {
characters = new LinkedHashMap<>();
glyphs = new LinkedHashMap<>();
final List<Integer> codes = font.getCodes();
final List<Integer> advances = font.getAdvances();
final float scale = fontSize / EMSQUARE;
final int count = codes.size();
for (int i = 0; i < count; i++) {
characters.put((char) codes.get(i).intValue(), new GlyphIndex(i,
(int) (advances.get(i) * scale)));
glyphs.put(new GlyphIndex(i,
(int) (advances.get(i) * scale)), (char) codes.get(i).intValue());
}
}
//This method should reverse from a list of GlyphIndexes to a String
public String charactersForText(final List<GlyphIndex> list) {
String text="";
for(GlyphIndex gi: list){
text+=glyphs.get(gi);
}
return text;
}
}
不幸的是,advanced from 的列表DefineFont2
是空的,然后是ReverseTableText
get an的构造函数ArrayIndexOutOfBoundException
。