精华内容
下载资源
问答
  • 2021-03-01 09:53:18

    Java自动生成带图片、富文本、表格等的word文档

    使用技术 freemark+jsoup 生成mht格式的伪word文档,已经应用项目中,确实是可行的,无论是富文本中是图片还是表格,都能在word中展现出来

    使用jsoup解析富文本框,将其中的图片进行Base64位转码,

    使用freemark替换模板的占位符,将变量以及图片资源放入模板中在输出文件

    maven地址

    org.freemarker

    freemarker

    2.3.23

    org.jsoup

    jsoup

    1.10.2

    制作word的freemark模板

    先将wrod的格式内容定义好,如果需要插入参数的地方以${xxx}为表示,例:${product}

    模板例子:

    a5609dcc8ac9b706d95c133626b20e50.png

    2. 将模板另存为mht格式的文件,打开该文件检查每个变量(${product})是否完整,有可能在${}中出现其他代码,需要删除。

    3. 将mht文件变更文件类型,改成ftl为结尾的文件,引入到项目中

    4. 修改ftl模板文件,在文件中加上图片资源占位符${imagesBase64String},${imagesXmlHrefString}

    具体位置如下图所示:

    33900834fce27dfabda421740905365d.png

    5. ftl文件中由几个关键配置需要引入到代码中:

    docSrcParent = word.files

    docSrcLocationPrex = file:///C:/268D4AA4

    nextPartId = 01D2C8DD.BC13AF60

    上面三个参数,在模板文件中可以找到,需要进行配置,如果配置错误,图片文件将不会显示

    下面这三个参数固定,切换模板也不会改变

    shapeidPrex = _x56fe__x7247__x0020

    typeid = #_x0000_t75

    spidPrex = _x0000_i

    6. 模板引入之后进行代码编辑

    下载源码后需要进行调整下内容:

    录入步骤5中的6个参数

    修改freemark获取模板方式

    下面这种方式能获取模板,但是在项目打包之后无法获取jar包内的文件

    Configuration configuration=newConfiguration(Configuration.getVersion());

    configuration.setDefaultEncoding(StandardCharsets.UTF_8.toString());

    configuration.setDirectoryForTemplateLoading(newFile(templatePath));

    Template template=configuration.getTemplate("xxx.ftl");

    通过流的形式直接创建模板对象

    Configuration configuration=newConfiguration(Configuration.getVersion());

    configuration.setDefaultEncoding(StandardCharsets.UTF_8.toString());

    configuration.setDirectoryForTemplateLoading(newFile(templatePath));

    InputStream inputStream=newFileInputStream(newFile(templatePath+"/"+templateName));

    InputStreamReader inputStreamReader=newInputStreamReader(inputStream,StandardCharsets.UTF_8);

    Template template=newTemplate(templateName,inputStreamReader,configuration);

    更多相关内容
  • 主要为大家详细介绍了C#生成Word文件,包括图片、文字等素材,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • QT基于HTML生成WORD文件

    2021-04-02 11:16:16
    QT基于HTML生成WORD文件,支持标题,表格,缩进,更多格式根据需求调整
  • 本文详细讲解如何使用Aspose.Words for .NET的组件来生成word文档与水印的方法,请看本文内容。
  • C# WPF根据word模板生成word文档,包括Microsoft.Office.Core.dll,Microsoft.Office.Interop.Word.dll文件
  • 下面小编就为大家分享一篇js生成word图片处理方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 工作中如何快速生word文档

    注意:只针对数据信息与图片信息进行生成。


     一,准备工作

    1,编辑word模板,变量信息以${变量名称}表示,图片要使用临时图片占用位置。

     

    2,转换格式word输出为Word.xml文档格式,在手动改为ftl格式。

    4,检查所有的变量${xxxx}在转换格式时是否错位。

    二,代码

     

    package com.maxinyang.word;
    
    import com.itextpdf.text.pdf.BaseFont;
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import freemarker.template.TemplateException;
    import freemarker.template.Version;
    import org.apache.tools.ant.types.resources.AbstractClasspathResource;
    import sun.misc.BASE64Encoder;
    
    import java.io.*;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Random;
    
    /**
     * 作者:killgod
     * 口号:天王盖地虎
     */
    public class WriteWord {
        /**
         * word生成需要org.freemarker.freemarker类
         * 主要介绍如何使用模板生成(包含图片)
         * 主要是用的类:
         * 1.BABSE64Encoder类:因为转为xml文件的图片编码使用的是BASE64
         * 2.Configuration类: 配置类使用它获取到模板类对象
         * 3.Template类:使用他来完成参数与${xxxx}映射
         * 
         * 注意:
         *  1.map中key必须与word文档中${xxx}一致才能完成赋值
         *  2.word生成图片必须完成前提准备
         *
         * @param args
         */
        public static void main(String[] args) {
            
            Map<String, Object> map = new HashMap<>();
            // 将word所需要的数据放入map集合
            map.put("name", "张三");
            map.put("password", "laoma123");
            map.put("age", "18");
            // 读取图片将其转为base64格式
            String imgPaht = downPicture("F:\\学习测试文件\\PDF\\2.png");
            map.put("img", imgPaht);
            // 核心方法
            generateWord(map);
    
    
        }
    
        /**
         * 将图片转为base64格式返回处理好的字符串
         *
         * @param picture
         */
        public static String downPicture(String picture) {
            InputStream in = null;
            byte[] data = null;
            try {
                in = new FileInputStream(picture);
                data = new byte[in.available()];
                in.read(data);
                in.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            BASE64Encoder encoder = new BASE64Encoder();
            return encoder.encode(data);
        }
    
    
        /**
         * 生成word文档核心方法
         * @param params
         */
        public static void generateWord(Map<String, Object> params) {
            // 读取模板文件
            Version incompatibleImprovements;
            Configuration configuration = new Configuration();
            configuration.setDefaultEncoding("UTF-8");
            // 模板文件.ftl文件位置 注意:目录是指文件存在的文件夹。
            File templateContents = new File("F:\\学习测试文件\\wrod\\");
            String templateFileName = "测试word模板.ftl";
            BufferedWriter bufferedWriter = null;
            try {
                // 通过配置类读取模板获取模板类
                configuration.setDirectoryForTemplateLoading(templateContents);
                Template template = configuration.getTemplate(templateFileName, "UTF-8");
    
                // 输出文件名称
                long timeMillis = System.currentTimeMillis();
                String outFileName = "xxcs_" + timeMillis + ".doc";
                String outFile = "F:\\学习测试文件\\word\\result\\";
                //获取输出文件路径
                File outFileContents = new File(outFile);
                // 判断文件路径是否存在
                if (!outFileContents.exists()) {
                    outFileContents.mkdirs();
                }
                outFileContents = new File(outFile + outFileName);
                bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFileContents), "UTF-8"));
    
                // 参数与输出流
                template.process(params, bufferedWriter);
    
            } catch (IOException | TemplateException e) {
                e.printStackTrace();
            }finally {
                if(bufferedWriter!=null){
                    try {
                        //关闭流
                        bufferedWriter.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
    
    
        }
    
    }
    

    展开全文
  • 主要功能: 将word转为RTF 将word转为PDF 将word转为图片 将word转为txt 将.docx转为.doc 插入水印 插入下标和上标 删除宏 插入脚注 插入尾注 设置高亮 加密word文档 插入注释 页面设置 查看模式邮件合并 邮件合并...
  • java 使用poi根据模版导出word文件文件中的标签替换成文字或者文件 文件中标签用{xxxx}生成文件
  • 使用ftl用ftl模板生成word文档打不开,一直未响应的可能问题如下: 1.word模板另存为xml格式文件的时候,选择Word 2003 XML格式(兼容问题) 2.模板中有图片的时候,将ftl文件图片的base64编码改成变量${xxx} ...
  • 通过对freemarker在Java web项目中的测试,进行生成word文档测试,将图片插入到模板并生成word文档包含图片成功。
  • 最近在做一个出卷系统,需要通过试卷模板从数据库中抽取题目,然后按照模板的样式生成完整的试卷,包括试卷格式的排版和图片的写入。这是用freemarker模板生成word文档。里面包括完整代码和所需jar包。
  • FreeMaker解析Word模板(含图片生成Word文档
  • java上传图片,处理图片word转pdf图片缩略图生成,替换所有图片的ip地址工具类
  • 网络上的根据模板填充Word我都看过一些, 它们的功能在数据换行的时候用的是run对象的.addCarriageReturn()方法,或者是直接用\n实现换行。这些都不符合我的需求, 因为我要的是分段,而不是换行。换行的word导致另一...
  • 使用java Apache poi 根据word模板生成word报表 仅支持docx格式的word文件,大概是word2010及以后版本,doc格式不支持。 使用说明:https://blog.csdn.net/u012775558/article/details/79678701
  • POI生成word文档

    2019-01-18 15:46:16
    最近在做一个出卷系统,需要通过试卷模板从数据库中抽取题目,然后按照模板的样式生成完整的试卷,包括试卷格式的排版和图片的写入。这是用POI模板生成word文档。里面包括完整代码和所需jar包。
  • 大哥 还是大姐不要再删了 我要崩溃了 我上传的资源就是有关于javaja操作wordpdf图片生成图片水印的 一些相关资料而已
  • 1、Word模板转html模板的操作步骤(图示例+操作描述,13张图); 2、由上述生成的html模板通过java代码生成pdf;...阅读建议:按照上述操作步骤,先看README.md文档,再看other/生成html操作步骤目录下的图片
  • 上几章节我们主要学习了如何读取文章,而主要任务是读取文档中的文本信息,也就是字符串,而图片本身是不可读的文件所以并没有去读取图片。从今天开始将学习如何通过 python 脚本来自动生成一个 word 文档。...
    万叶集
    🎉 隐约雷鸣,阴霾天空。 🎉
    🎉 但盼风雨来,能留你在此。 🎉


    前言
    ✌ 作者简介:渴望力量的哈士奇 ✌,大家可以叫我 🐶哈士奇🐶 ,一位致力于 TFS - 全栈 赋能的博主 ✌
    🏆 CSDN博客专家认证、新星计划第三季全栈赛道 top_1 、华为云享专家、阿里云专家博主 🏆
    📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
    💬 人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。💬
    🔥 如果感觉博主的文章还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦


    专栏系列(点击解锁)学习路线指引知识定位
    🔥Python全栈白皮书🔥 零基础入门篇 以浅显易懂的方式轻松入门,让你彻底爱上Python的魅力。
    语法进阶篇 主要围绕多线程编程、正则表达式学习、含贴近实战的项目练习 。
    自动化办公篇 实现日常办公软件的自动化操作,节省时间、提高办公效率。
    自动化测试实战篇 从实战的角度出发,先人一步,快速转型测试开发工程师。
    数据库开发实战篇 更新中
    爬虫入门与实战 更新中
    数据分析篇 更新中
    前端入门+flask 全栈篇 更新中
    django+vue全栈篇 更新中
    拓展-人工智能入门 更新中
    网络安全之路 踩坑篇 记录学习及演练过程中遇到的坑,便于后来居上者
    网安知识扫盲篇 三天打鱼,不深入了解原理,只会让你成为脚本小子。
    vulhub靶场漏洞复现 让漏洞复现变得简单,让安全研究者更加专注于漏洞原理本身。
    shell编程篇 不涉及linux基础,最终案例会偏向于安全加固方向。 [待完结]
    WEB漏洞攻防篇 2021年9月3日停止更新,转战先知社区等安全社区及小密圈
    渗透工具使用集锦 2021年9月3日停止更新,转战先知社区等安全社区及小密圈
    点点点工程师 测试神器 - Charles 软件测试数据包抓包分析神器
    测试神器 - Fiddler 一文学会 fiddle ,学不会倒立吃翔,稀得!
    测试神器 - Jmeter 不仅是性能测试神器,更可用于搭建轻量级接口自动化测试框架。
    RobotFrameWork Python实现的自动化测试利器,该篇章仅介绍UI自动化部分。
    Java实现UI自动化 文档写于2016年,Java实现的UI自动化,仍有借鉴意义。
    MonkeyRunner 该工具目前的应用场景已不多,文档已删,为了排版好看才留着。


    上几章节我们主要学习了如何读取文章,而主要任务是读取文档中的文本信息,也就是字符串,而图片本身是不可读的文件所以并没有去读取图片。从今天开始将学习如何通过 python 脚本来自动生成一个 word 文档。

    🐳 保存生成 word

    在学习如何生成一个 word 文档之前,我们来看看如何保存生成 word 文件,因为马上就会用到。

    使用方法:

    document_obj.save(文件地址) ---> /home/demo.docx

    代码示例如下:

    # coding:utf-8
    
    
    from docx import Document
    
    
    doc = Document()
    
    doc.save('test.docx')
    

    运行结果如下:



    🐳 生成标题

    使用方法:

    title_obj = DocumentObj.add_heading(标题内容, 标题样式等级) 通过 Document 对象调用 add_heading 函数 返回 标题对象


    标题样式等级:

    0 <= lever <= 9


    标题内容追加:

    titleobj.add_run 通过标题对象调用 add_run 函数 进行标题内容的追加

    代码示例如下:

    # coding:utf-8
    
    
    from docx import Document
    
    
    doc = Document()
    
    title = doc.add_heading('this is title', 1)    # 添加 word 文件的 title 标题
    title.add_run('\n - 测试版本')      # 针对 title 标题进行内容追加(换行)
    
    
    doc.save('test.docx')
    

    运行结果如下:



    🐳 生成段落

    使用方法:

    para_obj = document_obj.add_paragraph(段落内容) 通过 Document 对象调用 add_paragraph 函数 返回 段落对象


    段落内容追加:

    para_obj.add_run(字符串内容)


    换行方式:

    \n 换行特殊字符来分割段落

    代码示例如下:

    # coding:utf-8
    
    
    from docx import Document
    
    
    doc = Document()
    
    title = doc.add_heading('this is title', 1)    # 添加 word 文件的 title 标题
    title.add_run('\n - 测试版本')      # 针对 title 标题进行内容追加(换行)
    
    para = doc.add_paragraph('这是 \"test.docx\" 文件的第一行段落')
    para.add_run('\n这是 \"test.docx\" 文件追加的的第二行段落')
    
    doc.save('test.docx')
    

    运行结果如下:



    🐳 添加图片

    使用方法:

    image_obj = document_obj.add_picture(图片地址, 宽, 高) 通过 Document 对象调用 add_picture 函数 返回 图片对象


    宽高定义:

    from docx.shared import Inches

    add_picture(x, width=Inches(5), height=Inches(5))

    代码示例如下:

    # coding:utf-8
    
    
    from docx import Document
    from docx.shared import Inches
    
    
    doc = Document()
    
    title = doc.add_heading('this is title', 1)    # 添加 word 文件的 title 标题
    title.add_run('\n - 测试版本')      # 针对 title 标题进行内容追加(换行)
    
    para = doc.add_paragraph('这是 \"test.docx\" 文件的第一行段落')
    para.add_run('\n这是 \"test.docx\" 文件追加的的第二行段落')
    
    image = doc.add_picture('test_image.png', width=Inches(3), height=Inches(1.5))
    
    doc.save('test.docx')
    

    运行结果如下:



    🐳 添加表格

    使用方法:

    table_obj = document_obj.add_table(row=行数, cols=列数) 通过 Document 对象调用 add_table 函数 返回 表格对象

    cell = table_obj.row[0].cells 表格对象调用 rows 返回表格的行对象

    cell[0].text = 当前行 0 列的内容

    cell[1].text = 当前行 1 列的内容


    表格追加:

    row_cell = table.add_row().cells

    代码示例如下:

    # coding:utf-8
    
    
    from docx import Document
    from docx.shared import Inches
    
    
    doc = Document()
    
    title = doc.add_heading('this is title', 1)    # 添加 word 文件的 title 标题
    title.add_run('\n - 测试版本')      # 针对 title 标题进行内容追加(换行)
    
    para = doc.add_paragraph('这是 \"test.docx\" 文件的第一行段落')
    para.add_run('\n这是 \"test.docx\" 文件追加的的第二行段落')
    
    image = doc.add_picture('test_image.png', width=Inches(3), height=Inches(1.5))
    
    table_title = ['name', 'age', 'sex']
    table = doc.add_table(rows=1, cols=3)
    table_cells = table.rows[0].cells
    table_cells[0].text = table_title[0]
    table_cells[1].text = table_title[1]
    table_cells[2].text = table_title[2]
    
    data = [
        ('Neo', '18', 'man'),
        ('Adem', '17', 'man'),
        ('Lily', '18', 'women')
    ]
    
    for i in data:
        row_cells = table.add_row().cells
        row_cells[0].text = i[0]
        row_cells[1].text = i[1]
        row_cells[2].text = i[2]
    
    doc.save('test.docx')
    

    运行结果如下:



    🐳 分页

    使用方法:

    document_obj.add_page_break()

    代码示例如下:

    # coding:utf-8
    
    
    from docx import Document
    from docx.shared import Inches
    
    
    doc = Document()
    
    title = doc.add_heading('this is title', 1)    # 添加 word 文件的 title 标题
    title.add_run('\n - 测试版本')      # 针对 title 标题进行内容追加(换行)
    
    para = doc.add_paragraph('这是 \"test.docx\" 文件的第一行段落')
    para.add_run('\n这是 \"test.docx\" 文件追加的的第二行段落')
    
    image = doc.add_picture('test_image.png', width=Inches(3), height=Inches(1.5))      # 添加图片
    
    table_title = ['name', 'age', 'sex']    # 定义表格的第一行的标题
    table = doc.add_table(rows=1, cols=3)   # 定义表格的行数、列数
    table_cells = table.rows[0].cells       # 将 table_title 的每列的名称写入表格
    table_cells[0].text = table_title[0]
    table_cells[1].text = table_title[1]
    table_cells[2].text = table_title[2]
    
    data = [            # 定义 data 的内容,准备将其追加写入表格
        ('Neo', '18', 'man'),
        ('Adem', '17', 'man'),
        ('Lily', '18', 'women')
    ]
    
    for i in data:      # 利用 for 循环将 data 追加写入表格
        row_cells = table.add_row().cells
        row_cells[0].text = i[0]
        row_cells[1].text = i[1]
        row_cells[2].text = i[2]
    
    doc.add_page_break()        # 添加 word 文件的分页
    title = doc.add_heading('this is page_2 title', 1)    # 添加 word 文件的第二分页的 title 标题
    
    doc.save('test.docx')
    

    运行结果如下:



    展开全文
  • 如何将word文档转换为图片

    千次阅读 2020-12-04 23:01:12
    前段时间换工作,在BOSS直聘上看到一个有意思的功能,上传docx格式的简历,能够以图片的形式在线预览,并且图片还添加了水印,笔者对此比较感兴趣,就摸索着实现方法。网上逛了一圈,对于docx直接转图片这种转换没有...

    前段时间换工作,在BOSS直聘上看到一个有意思的功能,上传docx格式的简历,能够以图片的形式在线预览,并且图片还添加了水印,笔者对此比较感兴趣,就摸索着实现方法。网上逛了一圈,对于docx直接转图片这种转换没有什么有效的信息,不过结合获取的信息,笔者倒是想了一个曲线救国的法子,docx->pdf, pdf->image,通过两步可以最终实现该转换。

    一、环境准备

    首先进行环境准备工作,把需要用到的工具都安装配置好:

    1、安装pandoc

    Pandoc是由John MacFarlane开发的标记语言转换工具,可实现不同标记语言间的格式转换,堪称该领域中的“瑞士军刀”。该工具使用Haskell语言编写,以命令行形式实现与用户的交互,可支持多种操作系统。简而言之,pandoc就是一款转换工具,可以把格式A的文档转换为格式B的文档,就本文的目标来讲,主要用它实现了docx->pdf的转换。

    根据系统类别选择对应的安装包,安装完成后将其安装目录添加到系统路径中,windows版本的安装完成后会自动添加,不用额外设置。

    2、安装miktex

    MikTex是一款基于Tex的排版引擎。TeX 在不同的硬件和操作系统上有不同的实现版本。这就像C语言,在不同的操作系统中有不同的编译系统,例如Linux 下的gcc,Windows 下的Visual C++ 等。有时,一种操作系统里也会有好几种的TeX系统。目前常见的Unix/Linux 下的TeX系统是Texlive,Windows 下则有MiKTeX和fpTeX。CTeX指的是CTeX中文套装的简称,是把MiKTeX和一些常用的相关工具,如GSview,WinEdt 等包装在一起制作的一个简易安装程序,并对其中的中文支持部分进行了配置,使得安装后马上就可以使用中文。

    该排版工具是docx->pdf转换时不可获取的,否则无法实现转换。

    下载地址:https://miktex.org/   根据系统类别选择合适的版本,安装完成后将安装目录添加到系统路径。

    3、安装poppler

    代码实现中引用了一个开源库pdf2image,而这个库又引用了poppler,所以需要安装该环境。Poppler是一个基于xpdf-3.0的用于操作pdf的库,其中poppler-utils是建立在Poppler的库API上的工具集合,用于管理PDF和提取内容,主要工具如下:

    pdfdetach – 从PDF中提取嵌入式文档;

    pdffonts – 列出PDF中使用的字体;

    pdfimages – 从PDF中以原始分辨率提取所有嵌入式图像;

    pdfinfo – 列出PDF的所有信息;

    pdfseparate – 从PDF中提取单个页面;

    pdftocairo – 使用cairo将单页从PDF转换为矢量或位图格式;

    pdftohtml – 将PDF转换为HTML格式的保留格式;

    pdftoppm – 将PDF页面转换为位图;

    pdftops – 将PDF转换为可打印的PS格式;

    pdftotext – 从PDF中提取所有文本;

    pdfunite – 合并几个PDF。

    pdf2image使用了pdftoppm和pdfinfo这两个工具,用来将pdf转换为图片和获取pdf的文档页数,代码稍后会列出。

    下载地址:https://github.com/Belval/pdf2image  根据系统类别选择对应的版本,安装完成后将安装目录下的bin目录添加到系统路径。

    4、字体下载

    用来生成水印时使用,笔者下载的是SimSun宋体,下载地址:https://www.fontke.com/font/10132367/download/,也可以下载其他字体,看个人选择。

    完成上边四步环境就配置好了,笔者的电脑是Windows10,当然以上工具同样支持linux和mac环境,每个工具的官档都标注了支持的系统版本。环境配置好后接下来就是coding环节了,通过程序来实现转换过程的自动化调用,笔者会列出代码的目录结构,并依次说明其用途。

    二、代码实现

    关于实现这部分,笔者使用的开发语言是python36,以下为目录结构:

    1、font目录

    该目录存放的是下载好的字体文件,供代码中引用。

    2、pdf目录

    该目录存放转换之后的pdf文件。

    3、target目录

    该目录存放最终转换后的图片,图片为以时间戳命名的png图片,格式可以指定。

    4、config.py

    配置文件,存放了目录、图片大小、水印等配置,代码如下:

    Python

    import os

    # 根目录

    BASE_DIR = os.path.dirname(__file__)

    # pdf默认输出路径

    DEFAULT_OUTPUT_DIR = os.path.join(BASE_DIR, 'pdf')

    # 最终生成的图片存放在此目录

    TARGET_DIR = os.path.join(BASE_DIR, 'target')

    # 水印字体

    FONT_FILE = os.path.join(BASE_DIR, "font/simsun.ttf")

    # 单张图片的宽高,PIL支持图片的最大宽度1700

    IMAGE_WIDTH = 1700

    IMAGE_HEIGHT = 2200

    # 水印位置-left和top

    WATERMARK_LEFT = 0

    WATERMARK_TOP = 1800

    # 水印图片背景色-白色透明,最后一位表示透明度0~255,0为透明

    BACKGROUND_COLOR = (255, 255, 255, 0)

    #水印字体颜色-红色 60透明度

    FONT_COLOR = (255, 0, 0, 60)

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    importos

    # 根目录

    BASE_DIR=os.path.dirname(__file__)

    # pdf默认输出路径

    DEFAULT_OUTPUT_DIR=os.path.join(BASE_DIR,'pdf')

    # 最终生成的图片存放在此目录

    TARGET_DIR=os.path.join(BASE_DIR,'target')

    # 水印字体

    FONT_FILE=os.path.join(BASE_DIR,"font/simsun.ttf")

    # 单张图片的宽高,PIL支持图片的最大宽度1700

    IMAGE_WIDTH=1700

    IMAGE_HEIGHT=2200

    # 水印位置-left和top

    WATERMARK_LEFT=0

    WATERMARK_TOP=1800

    # 水印图片背景色-白色透明,最后一位表示透明度0~255,0为透明

    BACKGROUND_COLOR=(255,255,255,0)

    #水印字体颜色-红色 60透明度

    FONT_COLOR=(255,0,0,60)

    5、doc2pdf.py

    该模块封装了pandoc命令行工具的调用,实现了docx文档到pdf的转换过程

    Python

    import os

    import uuid

    from subprocess import Popen, PIPE

    def _load_doc(doc):

    doc = str(doc)

    if not os.path.exists(doc):

    raise FileNotFoundError("file {} not found".format(doc))

    _, doc_name = os.path.split(doc)

    if not doc_name.endswith('.docx'):

    raise TypeError("Only support word doc with suffix '.docx'")

    return doc

    def _build_command(doc_path, output_dir, pdf_name=None, pdf_engine=None):

    args = ['pandoc', '--pdf-engine=xelatex']

    # args = ['pandoc', '--pdf-engine=lualatex']

    if pdf_engine is not None:

    # MikTex包含了两种pandoc支持的Tex

    if pdf_engine not in ("xelatex", "lualatex"):

    raise ValueError("not supported pdf-engine: {}".format(pdf_engine))

    else:

    args[1] = '--pdf-engine={}'.format(pdf_engine)

    if pdf_name is None:

    pdf_name = str(uuid.uuid4()) + '.pdf'

    if not os.path.isdir(output_dir):

    raise NotADirectoryError("{} is not a existed directory".format(output_dir))

    pdf_path = os.path.join(output_dir, pdf_name)

    args.append('-o')

    args.append(pdf_path)

    args.append(doc_path)

    # 设置字体避免中文乱码无法输出问题,SimSun是宋体, MicrosoftYaHei是微软雅黑

    args.append('-V')

    args.append('mainfont="MicrosoftYaHei"')

    # args.append('-V')

    # args.append('margin-left=0in')

    return args, pdf_path

    def doc2pdf(source, pdf_path):

    doc_path = _load_doc(source)

    cmd, output_pdf = _build_command(doc_path, pdf_path)

    # run cmd

    print("doc to pdf, converting...")

    Popen(cmd, stderr=PIPE, stdout=PIPE).communicate()

    print("job done!")

    return output_pdf

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    importos

    importuuid

    fromsubprocessimportPopen,PIPE

    def_load_doc(doc):

    doc=str(doc)

    ifnotos.path.exists(doc):

    raiseFileNotFoundError("file {} not found".format(doc))

    _,doc_name=os.path.split(doc)

    ifnotdoc_name.endswith('.docx'):

    raiseTypeError("Only support word doc with suffix '.docx'")

    returndoc

    def_build_command(doc_path,output_dir,pdf_name=None,pdf_engine=None):

    args=['pandoc','--pdf-engine=xelatex']

    # args = ['pandoc', '--pdf-engine=lualatex']

    ifpdf_engineisnotNone:

    # MikTex包含了两种pandoc支持的Tex

    ifpdf_enginenotin("xelatex","lualatex"):

    raiseValueError("not supported pdf-engine: {}".format(pdf_engine))

    else:

    args[1]='--pdf-engine={}'.format(pdf_engine)

    ifpdf_nameisNone:

    pdf_name=str(uuid.uuid4())+'.pdf'

    ifnotos.path.isdir(output_dir):

    raiseNotADirectoryError("{} is not a existed directory".format(output_dir))

    pdf_path=os.path.join(output_dir,pdf_name)

    args.append('-o')

    args.append(pdf_path)

    args.append(doc_path)

    # 设置字体避免中文乱码无法输出问题,SimSun是宋体, MicrosoftYaHei是微软雅黑

    args.append('-V')

    args.append('mainfont="MicrosoftYaHei"')

    # args.append('-V')

    # args.append('margin-left=0in')

    returnargs,pdf_path

    defdoc2pdf(source,pdf_path):

    doc_path=_load_doc(source)

    cmd,output_pdf=_build_command(doc_path,pdf_path)

    # run cmd

    print("doc to pdf, converting...")

    Popen(cmd,stderr=PIPE,stdout=PIPE).communicate()

    print("job done!")

    returnoutput_pdf

    6、pdf2image.py

    一个开源的python库,只包含了一个文件,笔者直接复制过来使用的。主要封装了poppler的命令行调用,实现pdf到图片的转换。

    Python

    """

    pdf2image is a light wrapper for the poppler-utils tools that can convert your

    PDFs into Pillow images.

    """

    import os

    import re

    import tempfile

    import uuid

    from io import BytesIO

    from subprocess import Popen, PIPE

    from PIL import Image

    def convert_from_path(pdf_path, dpi=200, output_folder=None, first_page=None, last_page=None, fmt='ppm', thread_count=1, userpw=None):

    """

    Description: Convert PDF to Image will throw whenever one of the condition is reached

    Parameters:

    pdf_path -> Path to the PDF that you want to convert

    dpi -> Image quality in DPI (default 200)

    output_folder -> Write the resulting images to a folder (instead of directly in memory)

    first_page -> First page to process

    last_page -> Last page to process before stopping

    fmt -> Output image format

    thread_count -> How many threads we are allowed to spawn for processing

    userpw -> PDF's password

    """

    page_count = __page_count(pdf_path, userpw)

    if thread_count < 1:

    thread_count = 1

    if first_page is None:

    first_page = 1

    if last_page is None or last_page > page_count:

    last_page = page_count

    # Recalculate page count based on first and last page

    page_count = last_page - first_page + 1

    if thread_count > page_count:

    thread_count = page_count

    reminder = page_count % thread_count

    current_page = first_page

    processes = []

    for _ in range(thread_count):

    # A unique identifier for our files if the directory is not empty

    uid = str(uuid.uuid4())

    # Get the number of pages the thread will be processing

    thread_page_count = page_count // thread_count + int(reminder > 0)

    # Build the command accordingly

    args, parse_buffer_func = __build_command(['pdftoppm', '-r', str(dpi), pdf_path], output_folder, current_page, current_page + thread_page_count - 1, fmt, uid, userpw)

    # Update page values

    current_page = current_page + thread_page_count

    reminder -= int(reminder > 0)

    # Spawn the process and save its uuid

    processes.append((uid, Popen(args, stdout=PIPE, stderr=PIPE)))

    images = []

    for uid, proc in processes:

    data, _ = proc.communicate()

    if output_folder is not None:

    images += __load_from_output_folder(output_folder, uid)

    else:

    images += parse_buffer_func(data)

    return images

    def convert_from_bytes(pdf_file, dpi=200, output_folder=None, first_page=None, last_page=None, fmt='ppm', thread_count=1, userpw=None):

    """

    Description: Convert PDF to Image will throw whenever one of the condition is reached

    Parameters:

    pdf_file -> Bytes representing the PDF file

    dpi -> Image quality in DPI

    output_folder -> Write the resulting images to a folder (instead of directly in memory)

    first_page -> First page to process

    last_page -> Last page to process before stopping

    fmt -> Output image format

    thread_count -> How many threads we are allowed to spawn for processing

    userpw -> PDF's password

    """

    with tempfile.NamedTemporaryFile('wb') as f:

    f.write(pdf_file)

    f.flush()

    return convert_from_path(f.name, dpi=dpi, output_folder=output_folder, first_page=first_page, last_page=last_page, fmt=fmt, thread_count=thread_count, userpw=userpw)

    def pdf_page_count(pdf, password=None):

    return __page_count(pdf, password)

    def __build_command(args, output_folder, first_page, last_page, fmt, uid, userpw):

    if first_page is not None:

    args.extend(['-f', str(first_page)])

    if last_page is not None:

    args.extend(['-l', str(last_page)])

    parsed_format, parse_buffer_func = __parse_format(fmt)

    if parsed_format != 'ppm':

    args.append('-' + parsed_format)

    if output_folder is not None:

    args.append(os.path.join(output_folder, uid))

    if userpw is not None:

    args.extend(['-upw', userpw])

    return args, parse_buffer_func

    def __parse_format(fmt):

    if fmt[0] == '.':

    fmt = fmt[1:]

    if fmt == 'jpeg' or fmt == 'jpg':

    return 'jpeg', __parse_buffer_to_jpeg

    if fmt == 'png':

    return 'png', __parse_buffer_to_png

    # Unable to parse the format so we'll use the default

    return 'ppm', __parse_buffer_to_ppm

    def __parse_buffer_to_ppm(data):

    images = []

    index = 0

    while index < len(data):

    code, size, rgb = tuple(data[index:index + 40].split(b'\n')[0:3])

    size_x, size_y = tuple(size.split(b' '))

    file_size = len(code) + len(size) + len(rgb) + 3 + int(size_x) * int(size_y) * 3

    images.append(Image.open(BytesIO(data[index:index + file_size])))

    index += file_size

    return images

    def __parse_buffer_to_jpeg(data):

    return [

    Image.open(BytesIO(image_data + b'\xff\xd9'))

    for image_data in data.split(b'\xff\xd9')[:-1] # Last element is obviously empty

    ]

    def __parse_buffer_to_png(data):

    images = []

    index = 0

    while index < len(data):

    file_size = data[index:].index(b'IEND') + 8 # 4 bytes for IEND + 4 bytes for CRC

    images.append(Image.open(BytesIO(data[index:index+file_size])))

    index += file_size

    return images

    def __page_count(pdf_path, userpw=None):

    try:

    if userpw is not None:

    proc = Popen(["pdfinfo", pdf_path, '-upw', userpw], stdout=PIPE, stderr=PIPE)

    else:

    proc = Popen(["pdfinfo", pdf_path], stdout=PIPE, stderr=PIPE)

    out, err = proc.communicate()

    except:

    raise Exception('Unable to get page count. Is poppler installed and in PATH?')

    try:

    # This will throw if we are unable to get page count

    return int(re.search(r'Pages:\s+(\d+)', out.decode("utf8", "ignore")).group(1))

    except:

    raise Exception('Unable to get page count. %s' % err.decode("utf8", "ignore"))

    def __load_from_output_folder(output_folder, uid):

    return [Image.open(os.path.join(output_folder, f)) for f in sorted(os.listdir(output_folder)) if uid in f]

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    81

    82

    83

    84

    85

    86

    87

    88

    89

    90

    91

    92

    93

    94

    95

    96

    97

    98

    99

    100

    101

    102

    103

    104

    105

    106

    107

    108

    109

    110

    111

    112

    113

    114

    115

    116

    117

    118

    119

    120

    121

    122

    123

    124

    125

    126

    127

    128

    129

    130

    131

    132

    133

    134

    135

    136

    137

    138

    139

    140

    141

    142

    143

    144

    145

    146

    147

    148

    149

    150

    151

    152

    153

    154

    155

    156

    157

    158

    159

    160

    161

    162

    163

    164

    165

    166

    167

    168

    169

    170

    171

    172

    173

    174

    175

    176

    """

    pdf2image is a light wrapper for the poppler-utils tools that can convert your

    PDFs into Pillow images.

    """

    importos

    importre

    importtempfile

    importuuid

    fromioimportBytesIO

    fromsubprocessimportPopen,PIPE

    fromPILimportImage

    defconvert_from_path(pdf_path,dpi=200,output_folder=None,first_page=None,last_page=None,fmt='ppm',thread_count=1,userpw=None):

    """

    Description: Convert PDF to Image will throw whenever one of the condition is reached

    Parameters:

    pdf_path -> Path to the PDF that you want to convert

    dpi -> Image quality in DPI (default 200)

    output_folder -> Write the resulting images to a folder (instead of directly in memory)

    first_page -> First page to process

    last_page -> Last page to process before stopping

    fmt -> Output image format

    thread_count -> How many threads we are allowed to spawn for processing

    userpw -> PDF's password

    """

    page_count=__page_count(pdf_path,userpw)

    ifthread_count<1:

    thread_count=1

    iffirst_pageisNone:

    first_page=1

    iflast_pageisNoneorlast_page>page_count:

    last_page=page_count

    # Recalculate page count based on first and last page

    page_count=last_page-first_page+1

    ifthread_count>page_count:

    thread_count=page_count

    reminder=page_count%thread_count

    current_page=first_page

    processes=[]

    for_inrange(thread_count):

    # A unique identifier for our files if the directory is not empty

    uid=str(uuid.uuid4())

    # Get the number of pages the thread will be processing

    thread_page_count=page_count//thread_count+int(reminder>0)

    # Build the command accordingly

    args,parse_buffer_func=__build_command(['pdftoppm','-r',str(dpi),pdf_path],output_folder,current_page,current_page+thread_page_count-1,fmt,uid,userpw)

    # Update page values

    current_page=current_page+thread_page_count

    reminder-=int(reminder>0)

    # Spawn the process and save its uuid

    processes.append((uid,Popen(args,stdout=PIPE,stderr=PIPE)))

    images=[]

    foruid,procinprocesses:

    data,_=proc.communicate()

    ifoutput_folderisnotNone:

    images+=__load_from_output_folder(output_folder,uid)

    else:

    images+=parse_buffer_func(data)

    returnimages

    defconvert_from_bytes(pdf_file,dpi=200,output_folder=None,first_page=None,last_page=None,fmt='ppm',thread_count=1,userpw=None):

    """

    Description: Convert PDF to Image will throw whenever one of the condition is reached

    Parameters:

    pdf_file -> Bytes representing the PDF file

    dpi -> Image quality in DPI

    output_folder -> Write the resulting images to a folder (instead of directly in memory)

    first_page -> First page to process

    last_page -> Last page to process before stopping

    fmt -> Output image format

    thread_count -> How many threads we are allowed to spawn for processing

    userpw -> PDF's password

    """

    withtempfile.NamedTemporaryFile('wb')asf:

    f.write(pdf_file)

    f.flush()

    returnconvert_from_path(f.name,dpi=dpi,output_folder=output_folder,first_page=first_page,last_page=last_page,fmt=fmt,thread_count=thread_count,userpw=userpw)

    defpdf_page_count(pdf,password=None):

    return__page_count(pdf,password)

    def__build_command(args,output_folder,first_page,last_page,fmt,uid,userpw):

    iffirst_pageisnotNone:

    args.extend(['-f',str(first_page)])

    iflast_pageisnotNone:

    args.extend(['-l',str(last_page)])

    parsed_format,parse_buffer_func=__parse_format(fmt)

    ifparsed_format!='ppm':

    args.append('-'+parsed_format)

    ifoutput_folderisnotNone:

    args.append(os.path.join(output_folder,uid))

    ifuserpwisnotNone:

    args.extend(['-upw',userpw])

    returnargs,parse_buffer_func

    def__parse_format(fmt):

    iffmt[0]=='.':

    fmt=fmt[1:]

    iffmt=='jpeg'orfmt=='jpg':

    return'jpeg',__parse_buffer_to_jpeg

    iffmt=='png':

    return'png',__parse_buffer_to_png

    # Unable to parse the format so we'll use the default

    return'ppm',__parse_buffer_to_ppm

    def__parse_buffer_to_ppm(data):

    images=[]

    index=0

    whileindex

    code,size,rgb=tuple(data[index:index+40].split(b'\n')[0:3])

    size_x,size_y=tuple(size.split(b' '))

    file_size=len(code)+len(size)+len(rgb)+3+int(size_x)*int(size_y)*3

    images.append(Image.open(BytesIO(data[index:index+file_size])))

    index+=file_size

    returnimages

    def__parse_buffer_to_jpeg(data):

    return[

    Image.open(BytesIO(image_data+b'\xff\xd9'))

    forimage_dataindata.split(b'\xff\xd9')[:-1]# Last element is obviously empty

    ]

    def__parse_buffer_to_png(data):

    images=[]

    index=0

    whileindex

    file_size=data[index:].index(b'IEND')+8# 4 bytes for IEND + 4 bytes for CRC

    images.append(Image.open(BytesIO(data[index:index+file_size])))

    index+=file_size

    returnimages

    def__page_count(pdf_path,userpw=None):

    try:

    ifuserpwisnotNone:

    proc=Popen(["pdfinfo",pdf_path,'-upw',userpw],stdout=PIPE,stderr=PIPE)

    else:

    proc=Popen(["pdfinfo",pdf_path],stdout=PIPE,stderr=PIPE)

    out,err=proc.communicate()

    except:

    raiseException('Unable to get page count. Is poppler installed and in PATH?')

    try:

    # This will throw if we are unable to get page count

    returnint(re.search(r'Pages:\s+(\d+)',out.decode("utf8","ignore")).group(1))

    except:

    raiseException('Unable to get page count. %s'%err.decode("utf8","ignore"))

    def__load_from_output_folder(output_folder,uid):

    return[Image.open(os.path.join(output_folder,f))forfinsorted(os.listdir(output_folder))ifuidinf]

    7、main.py

    入口主程序,传入doc文档,得到png图片^_^

    Python

    import os

    import time

    from PIL import Image

    from PIL import ImageFont

    from PIL import ImageDraw

    from config import *

    from pdf2image import convert_from_path, pdf_page_count

    from doc2pdf import doc2pdf

    def doc2image(doc, fmt='png', output_dir=None, watermark=None, fpage=None, lpage=None):

    if output_dir is None:

    output_dir = TARGET_DIR

    target_name = os.path.join(output_dir, "{}.{}".format(int(time.time()), fmt))

    temp_pdf = doc2pdf(doc, pdf_path=DEFAULT_OUTPUT_DIR)

    if fpage is None:

    fpage = 1

    if lpage is not None:

    page_count = lpage - fpage + 1

    else:

    page_count = pdf_page_count(temp_pdf)

    print("pdf to image, converting...")

    to_image = _convert_pdf_to_image(temp_pdf, page_count, fmt, fpage, lpage)

    if watermark is not None:

    watermark_image = _make_watermark_image(to_image.size, watermark, page_count)

    # 合并内容图片和水印图片

    out = Image.alpha_composite(to_image, watermark_image)

    # out.show()

    # 转换为RGB模式才可保存为图片

    out.convert("RGB").save(target_name)

    else:

    to_image.save(target_name)

    print("job done!")

    def _convert_pdf_to_image(pdf, page_count, fmt, f, l, save=False):

    '''

    params:

    pdf: 待转换的pdf文件路径

    page_count: 要转换的页数

    fmt: 转换的图片格式

    f: 要转换的开始页数

    l: 结束页数

    save: 是否保留pdf文件,默认不保留

    '''

    # 根据页数转换为相应数量的图片

    image_list = convert_from_path(pdf, fmt=fmt, first_page=f, last_page=l)

    target_name = os.path.join(TARGET_DIR, "{}.{}".format(int(time.time()), fmt))

    to_image = Image.new('RGBA', (IMAGE_WIDTH, page_count * IMAGE_HEIGHT))

    for i, image in enumerate(image_list):

    # 计算高度,拼合单张图片到一整张图片上

    loc = (0, i * IMAGE_HEIGHT)

    to_image.paste(image, loc)

    if not save:

    try:

    os.remove(pdf)

    except Exception as e:

    print("fail to remove pdf, please check and remove it manually")

    return to_image

    def _make_watermark_image(image_size, watermark, count=1):

    '''

    生成水印图片

    params:

    image_size: 水印图片大小,与底板图片大小一致

    watermark: 水印文本

    count: 水印数量, 与内容页数保持一致

    '''

    fnt = ImageFont.truetype(font=FONT_FILE, size=80)

    watermark_image = Image.new('RGBA', image_size, color=BACKGROUND_COLOR)

    draw = ImageDraw.Draw(watermark_image)

    for i in range(1, count+1):

    draw.multiline_text((WATERMARK_LEFT, WATERMARK_TOP * i), watermark, font=fnt, fill=FONT_COLOR)

    return watermark_image

    if __name__ == '__main__':

    txt = "玩点coding https://vdcoding.com"

    doc = "resume.docx"

    doc2image(doc, watermark=txt)

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    81

    82

    83

    importos

    importtime

    fromPILimportImage

    fromPILimportImageFont

    fromPILimportImageDraw

    fromconfigimport*

    frompdf2imageimportconvert_from_path,pdf_page_count

    fromdoc2pdfimportdoc2pdf

    defdoc2image(doc,fmt='png',output_dir=None,watermark=None,fpage=None,lpage=None):

    ifoutput_dirisNone:

    output_dir=TARGET_DIR

    target_name=os.path.join(output_dir,"{}.{}".format(int(time.time()),fmt))

    temp_pdf=doc2pdf(doc,pdf_path=DEFAULT_OUTPUT_DIR)

    iffpageisNone:

    fpage=1

    iflpageisnotNone:

    page_count=lpage-fpage+1

    else:

    page_count=pdf_page_count(temp_pdf)

    print("pdf to image, converting...")

    to_image=_convert_pdf_to_image(temp_pdf,page_count,fmt,fpage,lpage)

    ifwatermarkisnotNone:

    watermark_image=_make_watermark_image(to_image.size,watermark,page_count)

    # 合并内容图片和水印图片

    out=Image.alpha_composite(to_image,watermark_image)

    # out.show()

    # 转换为RGB模式才可保存为图片

    out.convert("RGB").save(target_name)

    else:

    to_image.save(target_name)

    print("job done!")

    def_convert_pdf_to_image(pdf,page_count,fmt,f,l,save=False):

    '''

    params:

    pdf: 待转换的pdf文件路径

    page_count: 要转换的页数

    fmt: 转换的图片格式

    f: 要转换的开始页数

    l: 结束页数

    save: 是否保留pdf文件,默认不保留

    '''

    # 根据页数转换为相应数量的图片

    image_list=convert_from_path(pdf,fmt=fmt,first_page=f,last_page=l)

    target_name=os.path.join(TARGET_DIR,"{}.{}".format(int(time.time()),fmt))

    to_image=Image.new('RGBA',(IMAGE_WIDTH,page_count*IMAGE_HEIGHT))

    fori,imageinenumerate(image_list):

    # 计算高度,拼合单张图片到一整张图片上

    loc=(0,i*IMAGE_HEIGHT)

    to_image.paste(image,loc)

    ifnotsave:

    try:

    os.remove(pdf)

    exceptExceptionase:

    print("fail to remove pdf, please check and remove it manually")

    returnto_image

    def_make_watermark_image(image_size,watermark,count=1):

    '''

    生成水印图片

    params:

    image_size: 水印图片大小,与底板图片大小一致

    watermark: 水印文本

    count: 水印数量, 与内容页数保持一致

    '''

    fnt=ImageFont.truetype(font=FONT_FILE,size=80)

    watermark_image=Image.new('RGBA',image_size,color=BACKGROUND_COLOR)

    draw=ImageDraw.Draw(watermark_image)

    foriinrange(1,count+1):

    draw.multiline_text((WATERMARK_LEFT,WATERMARK_TOP*i),watermark,font=fnt,fill=FONT_COLOR)

    returnwatermark_image

    if__name__=='__main__':

    txt="玩点coding https://vdcoding.com"

    doc="resume.docx"

    doc2image(doc,watermark=txt)

    三、待完善的地方

    笔者从网上下载了份docx格式的简历模板,通过上边的程序转换后得到的图片如下:

    从图中可以看到个人信息部分的样式跑偏了,这部分是在docx->pdf过程中的排版引擎决定的,所以想要获得完美的图片,先要好好研究下排版引擎的使用,排版引擎可以加载多种扩展包,用来支持不同的排版格式。笔者只是兴趣使然,在短时间内实现了docx到图片的转换,没有深入研究排版引擎部分。关于这种转换笔者能力有限,只能以这种繁琐的方式实现,不过笔者倒是很好奇BOSS直聘是如何实现的,如果有机会真心希望交流一下。

    展开全文
  • 3、找到word文档中邮件–使用现有列表–导入你第一步准备的表格。 4、找到插入合并域,分别把姓名和时间替换到海报中的内容。 替换完毕之后是《姓名》《时间》表示出来的。 5、最后一步,选择邮件中–完成并合并...
  • 使用 DDoc.js,你可以生成一份 word 文档,在此文档中可以添加多种元素并设置多种属性。 可添加的元素 段落 超链接 标题 表格 列表 图片 可设置的属性 font:字体,比如:"Microsoft YaHei UI" fontSize:字体大小,...
  • Springboot 生成包含图片Word文档
  • java:多个图片导出到word文档里显示,用于打印图片导出
  • Java Poi流根据Word模板插入相应的文本、表格和图片,并生成新的Word报告。文档提供相应的jar包和Word模板文件,表格支持动态添加数据,插入图片支持多种格式!
  • Java POI 生成Word文档

    2017-10-28 13:54:46
    Java POI 生成Word文档,支持图片插入,关键是修改XML部分,本人已测试通过。
  • 通过C#调用NPOI组件生成Word文档,在生成Word文档过程中插入表格以及插入图片,使用到了C#,扩展等技术

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,087
精华内容 25,234
关键字:

word文档生成图片