智慧讲台: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图片的主要内容,如果未能解决你的问题,请参考以下文章