gpt4 book ai didi

java - 使用 StuartMacKay 的 transform-swf 库从 swf 读取文本

转载 作者:行者123 更新时间:2023-12-01 14:12:02 27 4
gpt4 key购买 nike

我需要从一些 swf 文件中提取所有文本。我使用 Java 是因为我有很多用这种语言开发的模块。因此,我在 Web 上搜索了所有专门用于处理 SWF 文件的免费 Java 库。最后,我找到了StuartMacKay开发的库。该库名为 transform-swf,可以通过单击 here 在 GitHub 上找到。 .

问题是:一旦我从 TextSpan 中提取 GlyphIndexes,如何将字形转换为字符?

请提供完整的工作和测试示例。任何理论上的答案都不会被接受,也不会接受诸如“这是不可能的”、“这是不可能的”之类的答案。

我所知道的和我所做的我知道 GlyphIndexes 是通过使用 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

最佳答案

老实说,我不知道如何在 Java 中做到这一点。我并不是说这是不可能的,我也相信有办法做到这一点。然而,你说有很多图书馆都这样做。您还建议了一个库,即 swftools 。因此,我建议再次访问该库以从 Flash 文件中提取文本。为此,您可以使用 Runtime.exec()只需执行命令行来运行该库。

就我个人而言,我更喜欢 Apache Commons exec而不是随JDK一起发布的标准库。好吧,让我告诉你应该怎么做。您应该使用的可执行文件是“swfstrings.exe”。假设它放在“C:\”中。假设在同一个文件夹中您可以找到一个 flash 文件,例如page.swf。然后,我尝试了以下代码(它工作正常):

    Path pathToSwfFile = Paths.get("C:\" + File.separator + "page.swf");
CommandLine commandLine = CommandLine.parse("C:\" + File.separator + "swfstrings.exe");
commandLine.addArgument("\"" + swfFile.toString() + "\"");
DefaultExecutor executor = new DefaultExecutor();
executor.setExitValues(new int[]{0, 1}); //Notice that swfstrings.exe returns 1 for success,
//0 for file not found, -1 for error

ByteArrayOutputStream stdout = new ByteArrayOutputStream();
PumpStreamHandler psh = new PumpStreamHandler(stdout);
executor.setStreamHandler(psh);
int exitValue;
try{
exitValue = executor.execute(commandLine);
}catch(org.apache.commons.exec.ExecuteException ex){
psh.stop();
}
if(!executor.isFailure(exitValue)){
String out = stdout.toString("UTF-8"); // here you have the extracted text
}

我知道,这并不完全是您所要求的答案,但效果很好。

关于java - 使用 StuartMacKay 的 transform-swf 库从 swf 读取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18442478/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com