智慧讲台:office 文件 pdf 文件 转成 png图片

Posted qianbo_insist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智慧讲台:office 文件 pdf 文件 转成 png图片相关的知识,希望对你有一定的参考价值。

java 请使用poi ,pdfbox

试了以下java的方式还是不错的,poi的问题就是版本匹配问题,能把人迷惑,不过确实可以用,官方网站资料齐全,笔者尝试了以下,虽然可以但是没有使用libreoffice那么方便,所以最后使用go 语言调用libreoffice 最为经济实用。
新增加java转换 在最下面

go nodejs

使用子进程方式可以直接调用libreoffice 和 imagemagick
另外 node 可以使用 pdf2png.js
Install: npm install pdf2png
这个使用ghostscript 来转换,windows下不用安装。但我依然推荐libreoffice 和imagemagick,最好直接调用可执行文件。

c++

以上使用go node 这种方式转换是可行的,如果想少装一个imagemagick,可以使用c 语言的mupdf,这个我发现很多人不知道,使用libreoffice 转换 office文件后成pdf,然后,接下来另外一种选择就是使用mupdf转换pdf成为png图片,接下来着重说明这种方式,show me the code,直接上代码

int main(int argc, char **argv)
{
//10 个线程
	_THREAD_NUM = 10;
	//exe 输入文件名 输出文件地址
	if (argc < 3){
		outjson_string(-1, "more parameter!:lightpdf2png sourcepathname savepath");
		return EXIT_FAILURE;
		//exit(0);
	}

	char *filename = argv[1]; // argc >= 2 ? argv[1] : "e:\\\\d.pdf";
	char *filedir  = argv[2];
	pthread_t *thread = NULL;
	fz_locks_context locks;
	pthread_mutex_t mutex[FZ_LOCK_MAX];
	char buffer[128];
	int i,pos;
	
	// Initialize FZ_LOCK_MAX number of non-recursive mutexes.

	for (i = 0; i < FZ_LOCK_MAX; i++)
	{
		if (pthread_mutex_init(&mutex[i], NULL) != 0)
			fail("pthread_mutex_init()");
	}
	for (i = 0; i < 3; i++)
		pthread_mutex_init(&_mutex_page[i], NULL);
	

	locks.user = mutex;
	locks.lock = lock_mutex;
	locks.unlock = unlock_mutex;


	_ctx = fz_new_context(NULL, &locks, FZ_STORE_UNLIMITED);


	fz_register_document_handlers(_ctx);

	char *utf8f = to_utf8(NULL, filename , 0);

	fz_try(_ctx)
		_doc = fz_open_document(_ctx, utf8f);
	fz_catch(_ctx)
	{
		outjson_string(-1, fz_caught_message(_ctx));
		//sprintf(buffer, "{'ret':-1,'info':'%s'}", fz_caught_message(_ctx));
		//fprintf(stdout, buffer);
		fz_drop_context(_ctx);
		return EXIT_FAILURE;
	}

	//加上后缀
	get_file_path(filedir, utf8f, _file_flag, "%04d.png");

	free(utf8f);

	_page_total = fz_count_pages(_ctx, _doc);

	if (_page_total > 0)
	{
		outjson_int(1, _page_total);
	}
	else{
		outjson_int(-1, -1);
		return EXIT_FAILURE;
	}
	fflush(NULL);
	
	//fprintf(stderr, "spawning %d threads, one per page...\\n", _THREAD_NUM);

	thread = malloc(_THREAD_NUM * sizeof(pthread_t));



	for (i = 0; i < _THREAD_NUM; i++){
		if (pthread_create(&thread[i], NULL, renderer2, _ctx) != 0)
			fail("pthread_create()");
	}


	for (i = 0; i < _THREAD_NUM; i++){
		if (pthread_join(thread[i], (void **)NULL) != 0)
			fail("pthread_join");
	}

	fprintf(stderr, "trans over!\\n");


	free(thread);
	//free(_data);
	// Finally the document is closed and the main thread's
	// context is freed.

	fz_drop_document(_ctx, _doc);
	fz_drop_context(_ctx);

	return 0;
}



笔者使用mupdf成功地将pdf 多线程快速将pdf 转成png图片,比其他语言都要快很多。使用go,node等语言调用子进程后抓取控制台输出或是使用一个http get方式给主进程通知信息,这样就是在c里面再实现一个http client,不过很容易,我的文章里面有简易httpclient,native,无依赖

python

是可以,不建议使用,如果使用这个,请使用go方式,因为go可以编译成可执行程序,省去了安装python的过程。

增加java 转换使用libreoffice

    
    public static boolean convertOffice2PDF(String in, String outpdf){
        long start = System.currentTimeMillis();
        String cmd;
        String osName = System.getProperty("os.name");
        if (osName.contains("Windows")) {
            cmd = "cmd /c start soffice --headless --invisible --convert-to pdf:writer_pdf_Export " + in+ " --outdir " + outpdf;
        }else {
            cmd = "libreoffice --headless --invisible --convert-to pdf:writer_pdf_Export " + in+ " --outdir " + outpdf;
        }
        boolean flag = executeCommand(command);
        long end = System.currentTimeMillis();
        logger.debug("用时:{} ms", end - start);
        return flag;
    }
 
    public static boolean executeCommand(String cmd) {
       logger.debug("convert2PDF cmd : {}", cmd);
        Process process;
        try {
            process = Runtime.getRuntime().exec(cmd);// 
        } catch (IOException e) {
            logger.error(" convert {} error", command, e);
            return false;
        }
        int exitStatus = 0;
        try {
            exitStatus = process.waitFor();// 0 is ok
        } catch (InterruptedException e) {
            logger.error("error of convert2PDF {}", command, e);
            return false;
        }
        if (exitStatus != 0) {
            logger.error("convertOffice2PDF {}", exitStatus);
        } else {
            logger.debug("convertOffice2PDF ok {}", exitStatus);
        }
        process.destroy(); 
        logger.info("the process over\\n");
        return true;
    }  

office 转pdf中文乱码问题:

1、查看fonts目录:

cat /etc/fonts/fonts.conf | grep fon
得知字体存放位置如:/usr/share/fonts

2: 拷贝字体

把Windows下的字体C:\\Windows\\Fonts下的宋体,如 simsun.ttc,上传到/usr/share/fonts下

以上是关于智慧讲台:office 文件 pdf 文件 转成 png图片的主要内容,如果未能解决你的问题,请参考以下文章

智慧讲台必须支持的协议

如何在linux下实现office文档转成pdf

如何将word 文件.docx转成.PDF文件

智慧讲台中的windows探测U盘

如何在线将PDF转成图片

什么是et文件?如何将et文件转成PDF格式