精华内容
下载资源
问答
  • word文档转JPG图片

    2019-03-29 11:07:06
    word文档无损转JPG图片word文档无损转JPG图片
  • Word转JPG转换器一款Windows平台下的Word转换图片工具软件,无需安装Office和Word,就可以方便的、批量的将Word的DOC格式和DOCX格式文档转换成JPG,PNG,BMP,TIF,GIF,PCX,TGA等图片格式。您可以一次性添加...
  • 在写作中为了给文章添加一点特色,让用户有良好的阅读体验,就想将word文档转换成图片,那么怎么将word文档怎么转换成jpg格式图片呢? 这里小编教大家word文档转换jpg\bmp\ico图片的方法,具体步骤如下。 第一步...

        在写作中为了给文章添加一点特色,让用户有良好的阅读体验,就想将word文档转换成图片,那么怎么将word文档怎么转换成jpg格式图片呢?

        这里小编教大家word文档转换jpg\bmp\ico图片的方法,具体步骤如下。

        第一步:搜索迅捷pdf在线转换器http://app.xunjiepdf.com/word2jpg,找到相关页面点击进入在线网站主页面,进入页面后,用我们鼠标点到文档处理,找到“word转图片”那个栏目。

        第二步:进入到转换页面后,我们点击界面中间的“选择文件”,将需要转换的文件添加到转换器中。

        第三步:文件添加好了之后,对下方的自定义设置那一块进行设置一下,等待下一步操作。

        第四步:然后点击“开始转换”,文件转换可能需要一些时间,转换过程在上面也有显示,我们只需等待几分钟。

        第五步:当文件转换完成后,页面上会出现一个“立即下载”的按钮,可以按照自己的需要将文件保存下来。

        有了word转图片的方法,我们还可以在文章上添加水印呢!
     

    转载于:https://my.oschina.net/dengjiaqi666/blog/1593582

    展开全文
  • 为方便word文档转换jpg图片,我在网上搜索相类似的软件,说实话挺多,但苦于没有找到好用的,于是就自己做了一个, 现在拿出来给大家共享。此软件在安装后要做小的设置,可以参考帮助进行设置。
  • Word文档批量图片4.0,word图片软件是一款支持批量转换的word文档转图片工具,它能够轻松将Word文档中的图片从文档中分离提取出来、独立形成图片文档,支持EMF JPG BMP等图像文件,非常的好用。
  • 霄鹞Word文档转图片助手支持转换到JPG/PNG/BMP/GIF等常见图片格式,转换后的文字、图表清晰不变形。同时软件批量转换,只要您将要转换的文件加入到转换列表,就可以一键批量搞定。 霄鹞Word文档转图片助手 v1.4更新...
  • word文档转jpg图片

    2014-08-13 11:56:54
    word文档转jpg图片
  • 使用C#窗体将WORD文档转换成RTF格式
  • 怎么把jpg图片转为Word文档 怎么把Word转换成jpg.docx
  • JPG图片怎么转换成Word文档

    千次阅读 2019-07-31 15:07:10
    这一类的图片又以JPG的图片为多,但是一个字一个字看着打实在是又浪费精力又浪费时间,那可不可以直接转换成Word文档呢,今天小编就告诉大家“JPG图片怎么转换成Word文档”的。 步骤一:打开电脑进入浏览器内搜索...

    有的时候在办公中经常需要识别图片文件,将上面的文字内容识别成文字然后输入进Word档内,这一类的图片又以JPG的图片为多,但是一个字一个字看着打实在是又浪费精力又浪费时间,那可不可以直接转换成Word文档呢,今天小编就告诉大家“JPG图片怎么转换成Word文档”的。
    在这里插入图片描述
    步骤一:打开电脑进入浏览器内搜索“迅捷pdf在线转换器”,在百度搜索引擎下找到相对应的页面并点击进入。
    在这里插入图片描述
    步骤二:进入相对应的页面后,可以看到首页的界面内有很多关于转换的操作,我们点击导航栏上的图片文字识别,并在下拉框内选择图片转word。
    在这里插入图片描述
    步骤三:进入转换的功能页后,点击页面内的“点击选择文件”将需要转换的图片文件添加进入页面内。
    在这里插入图片描述
    步骤四:添加完文件后,设置需要转换的文件格式参数,准备工作准备好后,点击“开始转换”的按钮。
    在这里插入图片描述
    步骤五:转换开始后,后台页面将自动进行转换的操作,只需要耐心的等待一会就可以了,当然文件越大转换的时间也就越长。
    在这里插入图片描述
    步骤六:转换进度完成后,就可以提取文件至桌面上了。
    在这里插入图片描述
    图片转word的方法到这里就结束了,迅捷PDF在线转换器还有好多关于图片文字的相关功能,有需要的可以做个了解哦。

    展开全文
  • 如何将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直聘是如何实现的,如果有机会真心希望交流一下。

    展开全文
  • Delphi实现Word、PDF文档转Image

    热门讨论 2016-03-09 16:43:28
    Delphi实现Word、PDF文档转Image;图片大小可自定义。效果非常好。自己写的,已经用在项目上的。不错的资源。
  • word文档转图像格式

    2012-01-27 16:40:23
    DOC to Image Converter V2.00 。其实我也讨厌下载要资源分,但是由于我在这里也经常需要下载我想要的,但是积分不够,所以就请有积分的朋友多包涵,赏点~ 如果没有积分的朋友想要下载,就M我,我可以给你传过去~
  • java把word转换成图片

    2017-12-26 16:42:19
    这是我在网上找两天的结果,用的是java的jacob把word转成pdf文件,然后把pdf成图片,图片还算清晰,但是转换的过程有点慢,希望各位给点意见! 我这里面有相关jar包,操作步骤,亲测可用!
  • 最近在写项目中遇到一个问题,是需要将一个word转为图片 展示到前端,在网上搜索好久,苦得一法,简单 高效的转化图片。 1.首先下载aspose-words-15.8.0-jdk16.jar包 在我的网盘里 我已无私贡献 链接:...

    发现问题:

        最近在写项目中遇到一个问题,是需要将一个word转为图片  展示到前端,在网上搜索好久,苦得一法,简单 高效的转化图片。

    1.首先下载aspose-words-15.8.0-jdk16.jar包

    在我的网盘里 我已无私贡献

    链接:https://pan.baidu.com/s/1LiTGjRX72K26ABnkR1rdAw 
    提取码:00j0 
    2.直接上代码啊  想什么想

    package com.li;
    
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.imageio.ImageIO;
    import javax.imageio.stream.ImageInputStream;
    
    import com.aspose.words.Document;
    import com.aspose.words.ImageSaveOptions;
    import com.aspose.words.License;
    import com.aspose.words.SaveFormat;
    
    import sun.misc.BASE64Encoder;
    
    public class Test {
        public static void main(String[] args){
        	
        	//word2pdf("C:/Users/Administrator/Desktop/1.doc","C:/Users/Administrator/Desktop/xxxx.pdf");//word转pdf
    
        	
        	//word转图片格式
        	try {
    			File file = new File("C:/Users/Administrator/Desktop/1.doc");
    
    			InputStream inStream = new FileInputStream(file);
    			List<BufferedImage> wordToImg = wordToImg(inStream,2);//
    			BufferedImage mergeImage = mergeImage(false, wordToImg);
    
    			ImageIO.write(mergeImage, "jpg", new File("C:/Users/Administrator/Desktop/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.png")); //将其保存在C:/imageSort/targetPIC/下
    	       
    
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
        }
        
        
    
        /**
         * @Description: 验证aspose.word组件是否授权:无授权的文件有水印标记
         */
        public static boolean isWordLicense() {
            boolean result = false;
            try {
            	String s = "<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature></License>";
            	ByteArrayInputStream inputStream = new ByteArrayInputStream(s.getBytes());
            	//InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("license.xml");
                com.aspose.words.License license = new com.aspose.words.License();
                license.setLicense(inputStream);
                result = true;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        }
    
    
        
        
        /**
         * @Description: word和txt文件转换图片
         */
        private static List<BufferedImage> wordToImg(InputStream inputStream, int pageNum) throws Exception {
            if (!isWordLicense()) {
                return null;
            }
            try {
                long old = System.currentTimeMillis();
                Document doc = new Document(inputStream);
                ImageSaveOptions options = new ImageSaveOptions(SaveFormat.PNG);
                options.setPrettyFormat(true);
                options.setUseAntiAliasing(true);
                options.setUseHighQualityRendering(true);
                int pageCount = doc.getPageCount();
                if (pageCount > pageNum) {//生成前pageCount张
                    pageCount = pageNum;
                }
                List<BufferedImage> imageList = new ArrayList<BufferedImage>();
                for (int i = 0; i < pageCount; i++) {
                    OutputStream output = new ByteArrayOutputStream();
                    options.setPageIndex(i);
     
                    doc.save(output, options);
                    ImageInputStream imageInputStream = javax.imageio.ImageIO.createImageInputStream(parse(output));
                    imageList.add(javax.imageio.ImageIO.read(imageInputStream));
     
                }
                return imageList;
            } catch (Exception e) {
                e.printStackTrace();
                throw e;
            }
        }
    
        //outputStream转inputStream
        public static ByteArrayInputStream parse(OutputStream out) throws Exception {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            baos = (ByteArrayOutputStream) out;
            ByteArrayInputStream swapStream = new ByteArrayInputStream(baos.toByteArray());
            return swapStream;
        }
    
        
    
        /**
         * 合并任数量的图片成一张图片
         *
         * @param isHorizontal true代表水平合并,fasle代表垂直合并
         * @param imgs         待合并的图片数组
         * @return
         * @throws IOException
         */
        public static BufferedImage mergeImage(boolean isHorizontal, List<BufferedImage> imgs) throws IOException {
            // 生成新图片
            BufferedImage destImage = null;
            // 计算新图片的长和高
            int allw = 0, allh = 0, allwMax = 0, allhMax = 0;
            // 获取总长、总宽、最长、最宽
            for (int i = 0; i < imgs.size(); i++) {
                BufferedImage img = imgs.get(i);
                allw += img.getWidth();
     
                if (imgs.size() != i + 1) {
                    allh += img.getHeight() + 5;
                } else {
                    allh += img.getHeight();
                }
     
     
                if (img.getWidth() > allwMax) {
                    allwMax = img.getWidth();
                }
                if (img.getHeight() > allhMax) {
                    allhMax = img.getHeight();
                }
            }
            // 创建新图片
            if (isHorizontal) {
                destImage = new BufferedImage(allw, allhMax, BufferedImage.TYPE_INT_RGB);
            } else {
                destImage = new BufferedImage(allwMax, allh, BufferedImage.TYPE_INT_RGB);
            }
            Graphics2D g2 = (Graphics2D) destImage.getGraphics();
            g2.setBackground(Color.LIGHT_GRAY);
            g2.clearRect(0, 0, allw, allh);
            g2.setPaint(Color.RED);
     
            // 合并所有子图片到新图片
            int wx = 0, wy = 0;
            for (int i = 0; i < imgs.size(); i++) {
                BufferedImage img = imgs.get(i);
                int w1 = img.getWidth();
                int h1 = img.getHeight();
                // 从图片中读取RGB
                int[] ImageArrayOne = new int[w1 * h1];
                ImageArrayOne = img.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1); // 逐行扫描图像中各个像素的RGB到数组中
                if (isHorizontal) { // 水平方向合并
                    destImage.setRGB(wx, 0, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
                } else { // 垂直方向合并
                    destImage.setRGB(0, wy, w1, h1, ImageArrayOne, 0, w1); // 设置上半部分或左半部分的RGB
                }
                wx += w1;
                wy += h1 + 5;
            }
     
     
            return destImage;
        }
    
    
        
        
        public static void word2pdf(String docPath,String savePath){
    
        	try {
        	String s = "<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature></License>";
        	ByteArrayInputStream is = new ByteArrayInputStream(s.getBytes());
        	License license = new License();
        	license.setLicense(is);
        	com.aspose.words.Document document = new com.aspose.words.Document(docPath);
        	document.save(new FileOutputStream(new File(savePath)),SaveFormat.PDF);
        	} catch (Exception e) {
        		
        		e.printStackTrace();
        	}
        }
        	
    }
    

    3.详细的jar和代码我打包放到资源下载里了,有需要可自行去下载。

    下载地址:https://download.csdn.net/download/qq_41507845/11200632

    展开全文
  • 工作中我们可能经常遇到要把word文件或者合同等内容上传到一些网站,但是不少网站或者公司的服务器只允许上传图片格式例如JPG或者PNG等。那么将Word Doc / Docx文件转换为JPG图像就需要工具软件啦。把word文件转换成...
  • java利用iText转换jpg为PDF格式文件,详细代码100%可用
  • pdf2word PDF转word文档

    2018-05-22 16:34:52
    pdf2word能够从PDF格式文档中提取文字、图形和其它内容存放入Word格式文档中,因此你就能重复利用你的PDF文档内容,在Word中再编辑文字、排版及重整布局;并且它是一个独立软件,不需要安装Microsoft Word、Adobe ...
  • 有时候我们不想把文档以文字的形式共享别人,这时把word文档转换成图片会是一个不错的选择,即可以让其它人看到文档的内容,也可以保护了自己的word文档,那么如何把word文档转换成jpg图片呢? 下面就让我们看...
  • 怎样快速把jpg图片转换成word文档

    千次阅读 2019-06-11 18:05:51
    在日常的生活或者是工作中我们经常见到的图片就是jpg格式的了,无论是在哪个方面,我们都会多多少少的遇到将图片转换成文字的情况发生。在高中的时候,就经常有些jpg图片需要转化的。可是一直没有找到好的转换方法。...
  • 很易用的PDF格式转换器,支持PDF转换Word/DOC、PDF转换图片格式( JPG/BMP/GIF/PNG/TIF)、PDF转换TXT、PDF转换HTML、PDF转换Flash/SWf
  • 由于图片修改起来不方便,有时又需要用到图片中的文字或表格内容,将它转换成Word文档后就比较好方便了。那么怎样才能将JPG转成Word呢? 1、我们可以使用一些转换工具。首先下载极速玩后打开软件,选择图片转换中...
  • Word文档批量图像工具是一款专业的转换软件,用户通过使用软件能够实现一次性将多个Word文档(*.doc)转换为图像文件的功能支持包括EMF JPG BMP等图像格式文件。不仅如此,软件同时还可以批量提取word文档中的图片并...
  • 工作或生活中,有时需要把word转成图片文件(如 jpg格式),可以试一试以下几种方法。1、截屏具体方法参见《截图工具大比拼,哪一款是你的最爱?》,另有大神指出,sogou拼音输入法也可以截屏。2、Word导入具体分三步...
  • 日常工作中,你是否遇到过这样的场景,领导发来一份 Word 文档,要求你将文档中的图片存储到一个文件夹内,并且还要将图片都改成 .jpg 或者 .png,你会怎么办?你是不是一边内心崩溃,一边开始一张张的 另存为。今天...
  • 本资源包括word模板、aspose-words相关jar包、poi相关jar包,及java类,该类引入工程,导入jar包即可运行。警告:请勿用于商业用途,仅供学习研究,如有任何版权纠纷,本人概不负责!
  • C# Spire操作Word文档生成PDF或JPG格式

    千次阅读 2018-01-16 17:36:51
    Spire是文档处理组件 优点:完全脱离Office环境;纯.NET组件,与COM组件相比,省去注册和开发中的经常引用丢失,同时代码中的参数简化很多 缺点:免费版存在一些页数限制,但是基本都满足一般的要求的
  • Word文档按页拆分,将Word文档转图(bmp或jpg
  • PB用run调用C#开发的控制台应用——实现WORD文档按页转存JPG图片。 由来:一个POWERBUILDE项目,要实现WORD文档按页转存为JPG图片,并按页号存为001.JPG、002.JPG……寻找了好久找到了一个非常不借的C#的例子Word2...
  • Word 文档中的图片另存为 .jpg 格式图片方法 1. Office 按钮 -> 另存为 2. 筛选过的网页 (*.htm;*.html) 3. 查看生成文件夹 References

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,413
精华内容 11,365
关键字:

word文档转jpg格式