一部の swf ファイルからすべてのテキストを抽出する必要があります。この言語で開発されたモジュールがたくさんあるので、私は Java を使用しています。そこで、SWF ファイルの処理専用の無料の Java ライブラリをすべて Web で検索しました。最後に、StuartMacKayによって開発されたライブラリを見つけました。transform-swfという名前のライブラリは、ここをクリックして GitHub で見つけることができます。
問題は、から esを抽出したら、グリプを文字に変換するにはどうすればよいかということです。GlyphIndex
TextSpan
完全に機能し、テストされた例を提供してください。理論的な答えも、「できない」「できない」などの答えも受け入れられません。
私が知っていることと私GlyphIndex
がしたことes は、オブジェクトTextTable
によって提供されるフォント サイズとフォントの説明を表す整数を繰り返すことによって構築される を使用して構築される
ことを知っていました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;
}
}
残念ながら、からの進歩のリストDefineFont2
は空ReverseTableText
ですArrayIndexOutOfBoundException
。