Mac编译安装swfTools

Stella981
• 阅读 525

Mac编译安装swfTools

  • Mac编译安装swfTools
    • 下载源码
    • 解压源码
    • 安装依赖项
    • ./configure执行配置或者执行如下配置命令:
    • 需要注意这里存在部分代码错误,需要修改解决后执行
      • 一、char * 和 int比较导致的错误, 需要修为文件
      • 二、存在一些变量没有定义的错误
      • 三、存在一些方法参数数量错误 以及 部分函数没有定义问题
    • make编译
    • make install安装
    • 开发注意点
      • 关于pdf2swf转码命令:
      • Java代码调用执行文档转换代码:

下载源码

这里下载安装的是swftools-0.9.2.tar.gz,具体的地址为:http://www.swftools.org/swftools-0.9.2.tar.gz
swftools-0.9.2.ta

解压源码

tar -xzvf swftools-0.9.2.tar.gz

安装依赖项

# Linux/CentOS 安装 这里没有实际测试,需要自己去测试 这里只是一个记录
yum install gcc* automake zlib-devel libjpeg-devel giflib-devel freetype-devel

主要通过brew安装一下四个包:lzlib、giflib、jpeg、freetype

Mac版本安装命令:

# 注意 lzlib 也许是不需要安装的,这里没有去测试
brew install lzlib
brew install giflib
brew install jpeg
brew freetype

./configure执行配置或者执行如下配置命令:

sudo LDFLAGS="-L/usr/local/lib" CPPFLAGS="-I/usr/local/include" ./configure  --prefix=/usr/local/swftools

需要注意这里存在部分代码错误,需要修改解决后执行

一、char * 和 int比较导致的错误, 需要修为文件

错误信息:
Mac编译安装swfTools

swftools-0.9.2/lib/pdf/xpdf/GlobalParams.cc文件中修改

1 插入文件头
#include <stdlib.h>
2 错误处理代码
(具体修改位置可以参考错误提示),原始代码是直接使用变量做比较,这里需要对变量调用atio函数后比较
Mac编译安装swfTools

二、存在一些变量没有定义的错误

错误信息:
Mac编译安装swfTools

文件swftools-0.9.2/lib/jpeg.c中存在部分变量没有定义,这里需要修改
Mac编译安装swfTools
修改后代码:

//修改后代码
#ifdef HAVE_JPEGLIB
#ifndef FALSE 
#define FALSE 0 
#endif
#ifndef TRUE
#define TRUE 1
#endif
#define HAVE_BOOLEAN
#include <jpeglib.h>

三、存在一些方法参数数量错误 以及 部分函数没有定义问题

报错信息:
Mac编译安装swfTools
解决方案:

修改文件swftools-0.9.2/src/gif2swf.c等内容:

1.1 全局搜索DGifOpenFileNameDGifCloseFile调用

1.2 在存在调用上述两个方法的地方,定义变量

c int Error;
并且修改调用为:
c DGifOpenFileName(sname, &Error)
Mac编译安装swfTools

注意:这里修改需要注意,如果上述两个方法在同一个方法中调用,只需定义一次变量即可

1.3 在当前文件中全局搜索PrintGifError();,将这行代码删除或注释掉。

make编译

make install安装

开发注意点

关于pdf2swf转码命令:

pdf2swf  -t "/Users/zhangxiong/project/qware/wbiot/mus/MS-FS-Server/tempFile/5bd8f9d8-185d-4d7b-9be8-1658441f784f.pdf" -o  "/Users/zhangxiong/project/qware/wbiot/mus/MS-FS-Server/tempFile/877a9f8d-dd7e-46a2-b431-cadd0ff36e44.swf" -s flashversion=9 -s languagedir=/Users/zhangxiong/devtools/xpdf/xpdf-chinese-simplified 

注意:如果是在Java的命令行执行转码,文件路径和生成的路径不能加双引号,也就是以为这文件源路径和目标路径不能有空格

Java代码调用执行文档转换代码:

注意:如果是在Java的命令行执行转码,文件路径和生成的路径不能加双引号,也就是以为这文件源路径和目标路径不能有空格

package cn;

import java.io.*;

/**
 * 将pdf转化为swf文件
 *  需要工具 swftools -> pdf2swf
 *
 * @author 
 *
 */
public class Pdf2swfUtil {
    // pdf2swf 执行文件路径
    private static String pdftoswf = "devtools/swftools-0.9.2/src/pdf2swf";
    /** 
     * @param sourcePath  pdf原路径
     * @param destPath    目的路径
     * @param fileName    生成swf的文件名
     */
    public static int convertPDF2SWF(String sourcePath, String destPath, String fileName) throws Exception {  
        //目标路径不存在则建立目标路径  
        File dest = new File(destPath);  
        if (!dest.exists()) dest.mkdirs();  
          
        //源文件不存在则返回  
        File source = new File(sourcePath);  
        if (!source.exists()) return 0;  
          
        //调用pdf2swf命令进行转换
        // 注意 这里的文档输入和文档输出路径不能存在空格, 并且这里的命令中,路径不能使用双引号包住
        String command = pdftoswf + " -o " + destPath + fileName + "  -s flashversion=9 " + sourcePath + "";

        System.out.println(command);
        Process pro = Runtime.getRuntime().exec(command);

        final InputStream is1 = pro.getInputStream();
        new Thread(new Runnable() {
            public void run() {
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(is1));
                StringBuffer sb = new StringBuffer(" ====================>>> \n");
                try {
                    String line = null;
                    while ((line = br.readLine()) != null) {
                        sb.append(line);
                    }
                    sb.append(" <<<<<<<========================================");
                    System.out.println(sb.toString());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start(); // 启动单独的线程来清空process.getInputStream()的缓冲区

        final InputStream is2 = pro.getErrorStream();
        new Thread(new Runnable() {
            public void run() {
                BufferedReader br = new BufferedReader(
                        new InputStreamReader(is2));
                StringBuffer sb = new StringBuffer(" ====================>>> \n");
                try {
                    String line = null;
                    while ((line = br.readLine()) != null) {
                        sb.append(line);
                    }
                    sb.append(" <<<<<<<========================================");
                    System.out.println(sb.toString());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start(); // 启动单独的线程来清空process.getInputStream()的缓冲区
        try {  
            pro.waitFor();  
        } catch (InterruptedException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
          
        return pro.exitValue();
          
    }  
      
    public static void main(String []args) throws Exception {
        // TODO: 2018/5/24 这里需要确定自己文档的路径和输出路径
        String sourcePath = "Downloads/编写高质量代码--Web前端开发修炼之道.pdf";
        String destPath = "project/qware/refactor/";
        String fileName = "test.swf";  
        Pdf2swfUtil.convertPDF2SWF(sourcePath, destPath, fileName);
        File file = new File(destPath + fileName);
        if (!file.exists()) {
            throw new RuntimeException("not create file ");
        }
    }  
}
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Nginx配置https
一、开启nginx的ssl模块1.未安装过nginx,编译安装配置参数如下:./configure\prefix/usr/local/nginx\withpcre\withhttp\_ssl\_modulessl模块\withhttp\_stub\_status\_module\wit
Wesley13 Wesley13
2年前
VirtualBox导入已安装好的操作系统的方法
VirtualBox导入已安装好的操作系统的方法1、修改UUID进入VirtualBox安装目录,运行VBoxManage修改UUID,命令运行如下:D:\\VirtualBoxVBoxManage.exe internalcommands setvdiuuid E:\\VirtualX
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
4个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这