일부 swf 파일에서 모든 텍스트를 추출해야합니다. 나는이 언어로 개발 된 많은 모듈을 가지고 있기 때문에 자바를 사용하고있다. 그래서 웹에서 SWF 파일을 처리하는 데 사용되는 모든 무료 Java 라이브러리를 검색했습니다. 마지막으로, 라이브러리가 StuartMacKay에 의해 개발 된 것을 발견했습니다. 변형 -swf이라는 라이브러리는 here을 클릭하여 GitHub에서 찾을 수 있습니다.StuartMacKay의 transform-swf 라이브러리로 swf에서 텍스트 읽기
질문 : TextSpan
에서 GlyphIndex
을 추출한 후 글자를 문자로 변환하려면 어떻게해야합니까?
완전한 작동 및 테스트를 거친 예제를 제공해주십시오. 이론적 인 대답은 허용되지 않으며 "는 할 수 없습니다"와 같은 대답은, "그것은 불가능하다"것 등
내가 알고 내가 무엇을 않았다 나는 GlyphIndex
ES를 사용하여 구축하는 것을 알고 TextTable
은 DefineFont2
개체가 제공하는 글꼴 크기 및 글꼴 설명을 나타내는 정수로 반복하여 구성되지만 모든 DefineFont2를 디코딩하면 모두 길이가 0입니다.
다음은 내가 한 일입니다.
//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
를 얻을.
이 문제의 해결책을 찾았습니까? 나는 똑같은 문제가있어, 타이 알려줘. – Hamix