精华内容
下载资源
问答
  • 如何将word文档转换为图片

    千次阅读 2020-12-04 23:01:12
    环境配置好后接下来就是coding环节了,通过程序来实现转换过程的自动调用,笔者会列出代码的目录结构,并依次说明其用途。 二、代码实现 关于实现这部分,笔者使用的开发语言是python36,以下为目录结构: 1、font...

    前段时间换工作,在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直聘是如何实现的,如果有机会真心希望交流一下。

    展开全文
  • 用 Python 操作 Word 文档

    千次阅读 2019-07-23 08:30:00
    图片来源于网络♚作者:贠云龙Blog:zhihu.com/people/yunlongyun本文主要讲解python中操作word的思路。一、Hello,world!使...

    640?wx_fmt=jpeg

    图片来源于网络


    作者:贠云龙

    Blog: zhihu.com/people/yunlongyun

    本文主要讲解python中操作word的思路。

    一、Hello,world!

    使用win32com需要安装pypiwin32

    pip install pypiwin32

    推荐使用python的IDLE,交互方便

    1、如何新建文档

    from win32com.client import Dispatchapp = Dispatch('Word.Application')# 新建word文档doc = app.Documents.Add()

    按F5运行,发现什么效果都没有, 这是因为Word被隐藏了。

    2、如何显示Word

    app.Visible = 1

    运行后,熟悉的Word界面出现。现在来输入文字。

    640?wx_fmt=jpeg

    3、如何输入

    我们在Word中输入文字时,一般会先使用鼠标点击需要输入文字的位置,这个过程是获得了光标焦点。

    当我们需要替换某些文字时,首先会选中某些文字,然后再输入、被选择的文字呈现出灰色的背景,表示被选中了。

    光标焦点和选择范围在Word中,都是Selection。什么都没选择的光标焦点,和选择了整片文章的选择范围,代表了Selection的最小和最大范围。

    这也是为什么整个Word中只能有一个Selection的原因。因为光标或者选择范围就只能有一个。

    # 运行下句代码后,s获得新建文档的光标焦点,也就是图中的回车符前s = app.Selection# 用“Hello, World!“替换s代表的范围的文本s.Text = 'Hello, world!'

    此时,s的范围为'Hello, world!'这句话的选择区域。

    640?wx_fmt=jpeg

    能如此方便的调用Word,得益于其底层的COM(组件对象模型)可以被任意语言调用。

    Selection是Word对象模型中的类,此处的s是它的对象(实例)。

    4、如何查看选择区域是什么

    s.Text可以查看或者设置s选择区域的文本。Word对象模型中很多对象都有默认属性,Text就是Selection的默认属性,类似python的__str__方法。运行s()调用s的默认属性,此处等于于运行了s.Text

    s()

    控制台显示,s的范围为'Hello, world!'这句话的选择区域。

    640?wx_fmt=jpeg

    二、对Word对象模型的简单理解

    Word中最重要的类(对象)有以下几个。

    1、Application对象:Word应用。Application包含了菜单栏、工具栏、命令以及所有文档等。

    # 如何获得app = win32com.client.Dispatch('Word.Application')

    2、Document对象:文档。可以有多个Document,就像Word可以打开多个文档。

    使用下列代码新建文档或者打开文档

    # 如何获得# 新建文档doc = app.Documents.Add()# 打开已有文档doc = app.Documents.Open('你的Word文件路径')

    3、Selection对象:选区:代表当前窗口的选区。它可以是文档中的选择(高亮)区域,也可以是插入点(如果没有什么被选中)。同一时间只能激活一个Selection。

    • 如何获得

    s = app.Selection

    在Word中,按下Alt+F11打开宏编辑器

    640?wx_fmt=jpeg

    然后按下F2打开对象浏览器

    640?wx_fmt=jpeg

    输入selection并回车,发现成员一列中完全匹配Selection的只有4个类,这表示只有这些类的Selection属性可以返回Selection对象(如图)。

    640?wx_fmt=jpeg

    Application我们前面介绍过,其它的类可以用同样的方法查询如何获得。

    • 如何使用Selection输入

    # 替换当前选择s.Text = 'Hello, world!'# 输入s.TypeText('Hello, world!')# 把当前选择复制到剪贴板s.Copy()# 粘贴剪贴板中的内容s.Paste()

    Text和TypeText的不同在于完成后的选区:

    Text:输入的文本(前例中选区为'Hello, world!');

    TypeText:文本后的插入点(前例中选区为!后的插入点)。

    • 如何变更Selection

    # 使用Start,End指定字符范围s.Start = 0s.End = n# s从第0个字符(第1个字符前的插入点)到第n个字符。# 汉字是每字为1字符# 相当于按下Delete键s.Delete() # 相当于按下Ctrl+As.WholeStory() # 向左移动s.MoveLeft()# 向右移动2个字符,第1个参数是移动单位WdUnits,见下图s.MoveRight(1, 2)

    640?wx_fmt=jpeg

    640?wx_fmt=jpeg

    所有能获得Selection的类

    4、Range对象:连续区域。Range表示一个连续区域。Range由Start和End位置定义,用来区分文档的不同部分。Range是独立于Selection的。不管Selection是否改变,都可以定义和操作Range。文档中可以定义多个Range。这个连续区域同样可以小到一个插入点,大到整个文档。Selection有Range属性,而Range没有Selection属性。

    当使用Range(Start, End)方法来指定文档的特定范围时。文档的第一个字符位置为0,最后一个字符的位置和文档的字符总数相等。不提供参数时代表选择所有范围。

    • 如何获得

    r = doc.Range()# 或r = s.Range()

    Word中有很多对象的Range属性都能返回Range对象,请在Word-宏编辑器-对象浏览器中自己查询。

    • 如何使用

    因为本文仅使用Selection就可以达到效果,Range的很多属性和方法和Selection是类似的。

    5、Font对象:字体。包含对象的字体属性(字体名称、字号、颜色等)。

    • 如何获得

    font = s.Font# 或font = r.Font

    同样,其余获得方法可在Word-宏编辑器-对象浏览器中查询。

    • 如何使用

    # 字体设置为仿宋,电脑上必须安装有该字体font.Name = '仿宋'# 字号设置为三号font.Size = 16
    1. ParagraphFormat对象:段落格式。用来设置段落格式,包括对齐、缩进、行距、边框底纹等。

    • 如何获得

    pf = s.ParagraphFormat# 或pf = r.ParagraphFormat

    同样,其余获得方法可在Word-宏编辑器-对象浏览器中查询。

    • 如何使用

    # 左、中、右 对齐分别为0, 1, 2,其他对齐方式见.NET 文档中的ParagraphFormatpf.Alignment = 0# 单倍、1.5倍、双倍行距分别为0, 1, 2,其他见ParagraphFormat文档pf.LineSpacingRule = 0# 指定段落的左缩进值为21磅。pf.LeftIndent = 21

    7、PageSetup对象:页面设置。代表所有的页面设置属性,包括左边距,底边距,纸张大小等等。

    • 如何获得

    ps = doc.PageSetup# 或ps = s.PageSetup# 或ps = r.PageSetup

    同样,其余获得方法可在Word-宏编辑器-对象浏览器中查询。

    • 如何使用

    # 上边距79磅 ps.TopMargin = 79# 页面大小,A3、A4分别为6,7ps.PageSize = 7

    8、Styles对象:样式集。Styles包含指定文档中内置和用户定义的所有样式,它返回一个样式集。其中的每个样式的属性包括字体、 字形、 段落间距等。如常见的正文、页眉、标题1样式。

    • 如何获得

    # 只能通过文档获得styles = doc.Styles
    • 如何使用

    # 返回正文样式normal = styles(-1)# 修改正文样式的字体字号normal.Font.Name = '仿宋'normal.Font.Size = 16

    Styles的返回参数,标题1、标题2、标题3分别为-2、-3、-4,页眉为-32,标题为-63,其他见Styles文档

    三、解决问题思路

    因为有很多功能,在文档中难以直接找到,需要使用如下方法。

    1、把想实现的功能,使用word的录制宏,在宏编辑器里查看VBA代码,从而了解大概使用什么方法。

    2、使用在线的 .NET API,从而了解详细的语法

    3、如果不知道从哪获得实现该功能的对象,则可以使用word宏编辑器的对象浏览器(F2键),具体见前文Selection部分

    4、使用Python的IDLE进行实时交互

    app = win32com.client.Dispatch('word.application')app.Visible='True' # 让word程序可见,这样在交互命令行做的修改就可以实时显示doc = app.Documents.Open('你的桌面路径/test.docx') # word文件放在桌面方便手动修改

    然后输入自己想尝试的对象属性或方法。

    四、实例:格式化word文件为最新的公文国家标准

    只进行两个部分的设置,一是页面设置、二是页码设置

    from win32com.client import Dispatch #需要安装的是pypiwin32模块app=Dispatch('Word.Application')doc = app.Documents.Open('你的word文档路径')# 页面设置cm_to_points = 28.35 # 1厘米为28.35磅# 国家公文格式标准要求是上边距版心3.7cm# 但是如果简单的把上边距设置为3.7cm# 则因为文本的第一行本身有行距# 会导致实际版心离上边缘较远,上下边距设置为3.3cm# 是经过实验的,可以看看公文标准的图示# 版心指的是文字与边缘距离doc.PageSetup.TopMargin = 3.3*cm_to_points  # 上边距3.3厘米doc.PageSetup.BottomMargin = 3.3*cm_to_points  # 下边距3.3厘米doc.PageSetup.LeftMargin = 2.8*cm_to_points  # 左边距2.8厘米doc.PageSetup.RightMargin = 2.6*cm_to_points  # 右边距2.6厘米# 设置正常样式的字体# 是为了后面指定行和字符网格时# 按照这个字体标准进行doc.Styles(-1).Font.Name = '仿宋' # word中的“正常”样式字体为仿宋doc.Styles(-1).Font.NameFarEast = '仿宋' # word中的“正常”样式字体为仿宋doc.Styles(-1).Font.NameAscii = '仿宋'# word中的“正常”样式字体为仿宋doc.Styles(-1).Font.NameOther = '仿宋' # word中的“正常”样式字体为仿宋doc.Styles(-1).Font.Size = 16 # word中的“正常”样式字号为三号doc.PageSetup.LayoutMode = 1 # 指定行和字符网格doc.PageSetup.CharsLine = 28 # 每行28个字doc.PageSetup.LinesPage = 22 # 每页22行,会自动设置行间距# 页码设置doc.PageSetup.FooterDistance = 2.8*cm_to_points  # 页码距下边缘2.8厘米doc.PageSetup.OddAndEvenPagesHeaderFooter = 0 # 首页页码相同doc.PageSetup.OddAndEvenPagesHeaderFooter = 0 # 页脚奇偶页相同w = doc.windows(1)  # 获得文档的第一个窗口w.view.seekview = 4 # 获得页眉页脚视图s = w.selection  # 获取窗口的选择对象s.headerfooter.pagenumbers.startingnumber = startingnumber  # 设置起始页码s.headerfooter.pagenumbers.NumberStyle = 0  # 设置页码样式为单纯的阿拉伯数字s.WholeStory() # 扩选到整个部分(会选中整个页眉页脚)s.Delete() #按下删除键,这两句是为了清除原来的页码s.headerfooter.pagenumbers.Add(4)  # 添加页面外侧页码s.MoveLeft(1, 2)  # 移动到页码左边,移动了两个字符距离s.TypeText('— ')  # 给页码左边加上一字线,注意不是减号s.MoveRight() #移动到页码末尾,移动了一个字符距离# 默认参数是1(字符)s.TypeText(' —') s.WholeStory() # 扩选到整个页眉页脚部分,此处是必要的# 否则s只是在输入一字线后的一个光标,没有选择区域s.Font.Name = '宋体's.Font.Size = 14 #页码字号为四号s.paragraphformat.rightindent = 21 #页码向左缩进1字符(21磅)s.paragraphformat.leftindent = 21 # 页码向右缩进1字符(21磅)doc.Styles('页眉').ParagraphFormat.Borders(-3).LineStyle = 0 # 页眉无底边框横线

    参考文章:

    Python通过win32实现office自动化https://blog.csdn.net/lzl001/article/details/8435048引用Microsoft Word 对象的技术及实现https://www.docin.com/p-1333941826.htmlWord组件对象模型https://blog.csdn.net/wishfly/article/details/39959349


    640?wx_fmt=png

    ▼ 点击成为社区注册会员          「在看」一下,一起PY!

    展开全文
  • Python-docx 模块读写 Word 文档基础(三):读取文档文本信息、表格信息、段落格式、字体格式等前言:1、获取文档章节信息:2、获取段落文字信息:3、获取文字格式信息:4、获取文档中表格信息:结尾:【Python与...

    Python-docx 模块读写 Word 文档基础(三):读取文档文本信息、表格信息、段落格式、字体格式等

    前言:

    1、获取文档章节信息:

    2、获取段落文字信息:

    3、获取文字格式信息:

    4、获取文档中表格信息:

    结尾:

    【Python与Office】专栏

    前言:

    前两篇博客介绍了 Python 的 docx 模块对 Word 文档的写操作,这篇博客将介绍如何用 docx 模块读取已有 Word 文档中的信息。

    本篇博客主要内容有:

    1、获取文档的章节信息;

    2、获取段落文本信息;

    3、获取表格内文本信息;

    4、获取文档内格式信息。

    1、获取文档章节信息:

    1、用docx模块获取已有的word文档对象:

    from docx import Document

    # Document 类,不仅可以新建word文档,也可以打开一个本地文档

    doc = Document('test03.docx') # 想获取的文档文件名,这里是相对路径。

    用做示例的 test03.docx 文件截图如下:

    dc4ace747b7d293fea3bd380f7f53ddb.png

    文档中有两个章节共两页(一个章节一页),一个章节的页面为 A3 ,另

    展开全文
  • 微软的Office Word软件是一...(注: 在Linux运行Qt程序时, 只有将界面最大化, 才能在左上角看见菜单.) 实现该软件的核心点: 1. QMdiArea 类: 它是实现多文档操作的关键类, 通过向QMdiArea中添加子窗口,可操作多个子...

           微软的Office Word软件是一款通用的文字处理软件, 其功能非常强大, 但它是如何实现的呢? 本文怀着这样的想法, 用Qt开发出与之功能类似的文字处理软件.(当然了, 我只实现了一些基本功能, 读者们可根据本文的思路,对该软件的功能进行扩展), 请先看软件运行结果:

    (注: 在Linux运行Qt程序时, 只有将界面最大化, 才能在左上角看见菜单.)

    实现该软件的核心点:

    1. QMdiArea 类: 它是实现多文档操作的关键类, 通过向QMdiArea中添加子窗口,可操作多个子窗口(其中只有一个子窗体处于激活状态, 可通过activeSubWindow()获取), 设置激活的子窗体可通过它的setActiveSubWindow()成员函数, 它的主要信号函数是subWindowActivated(QMdiSubWindow *);

    2. 菜单和工具栏: 建立若干个QAction对象, 设置它们的文本、图片、快捷键和提示信息等信息, 建立响应单击事件的槽函数;

    3. 工具栏中的段落使用了QActionGroup类, 它可将菜单动作QAction分组,  同一组中的子菜单项属于同一个动作组,  在某一时刻,  所有的这些QAction只有一个被激活,  即它们的激活是互斥的.

    4. 字体格式的设置可通过QTextEdit对象的void mergeCurrentCharFormat(const QTextCharFormat &modifier)来完成, 通过QTextCharFormat和QTextFormat对象可以玩出很多花样, 如字体删除线、字体间隙、表格、图片等. 文本游标(QTextCursor)是用于通过编程接口访问和修改文本文档的内容和底层结构的对象,它模仿文本编辑器中游标的行为,QTextCursor包含有关光标在QTextDocument中的位置及其所做任何选择的信息, 它可通过QTextEdit::textCursor()获取.

    由于代码量较大,本文就不列出源代码了,源码可在以下路径下载:

    https://download.csdn.net/download/ouyangxiaozi/21506881

    展开全文
  • 情况:win764位 笔记本外接显示器 选择“仅投影仪”模式 ...问题:启动word2013文档无法最大化 原因:因为将文档界面移到了笔记本显示器了 方案1:多次 win+左键 方案2:win+p 切换为 “复制”模式
  • 使用Python对word文档进行操作 一、安装Python-docx Python-docx是专门针对于word文档的一个模块,只能读取docx 不能读取doc文件。说白了,python就相当于windows操作系统,QQ就是跑在windows操作系统上的软件,QQ...
  • 教程 | Python 实现 Word 文档操作...

    千次阅读 2019-07-26 00:00:00
    本文由P"ython中文社区"编辑本文主要讲解Python中操作word的思路。一、Hello,world!使用win32com需要安装pypiwin32pip inst...
  • 最大的差别在于有没有经过发酵这个过程。因为茶叶中的儿茶素会随着发酵温度的升高而相互结合,致使茶的颜色变深,但因此茶的涩味也会减少。这种儿茶素相互结合所形成的成分就是乌龙茶的多酚类。多酚类和具有抗氧化...
  • 《完整word版html标签大全推荐文档》由会员分享,可在线阅读,更多相关《完整word版html标签大全推荐文档(11页珍藏版)》请在人人文库网上搜索。1、实用标准文档文件标记文件宣告让浏览器知道这是 HTML文件vHEAD开头...
  • 主要介绍 word 文档中插入图片、设置图片大小;插入表格、设置表格样式、字体样式;章节设置:页面大小、边距等;设置页眉页脚等方法。
  • 一、使用Python对word文档进行操作

    千次阅读 2021-02-18 14:14:39
    使用Python对word文档进行操作 一、安装Python-docx Python-docx是专门针对于word文档的一个模块,只能读取docx 不能读取doc文件。说白了,python就相当于windows操作系统,QQ就是跑在windows操作系统上的软件,QQ...
  • 做项目的过程中,经常需要把数据里里的数据读出来,经过加工,以word格式输出。 在网上找了很多解决方案都不太理想,偶尔发现了PageOffice,一个国产的Office插件,开发调用非常简单!比网上介绍的poi,jacob等解决...
  • 软件采用微软最新发布的管方二进制文档结构规范进行开发,对于有严重结构坏损的文档,宏宇Word修复向导,具有自动强力修复内核,可最大化的修复文档中的文字信息。 宏宇Word修复向导,不仅是Word的最佳助手,同时也...
  • 是能够按照程序运行,自动、高速处理海量数据的现代智能电子设备。由硬件系统和软件系统所组成,没有安装任何软件的计算机称为裸机。 可分为超级计算机、工业控制计算机、网络计算机、个人计算机、嵌入式计算机五...
  • 介绍一个用 Python docx和xlrd模块,对已有的Word模板与需求,对模板文件进行修改,然后批量生成多个Word文档的实例。
  • Python|读取word文档表格内容

    千次阅读 2021-03-15 00:30:09
    运行结果: 所要提取的word文档目标: 最终提取到的内容结果: 结语 Python最大的优势之一就是其拥有数不胜数的第三方库,这里讲解的提取word文档表格内容只是冰山一角,但它能让使用者所收获到的价值是非凡的,无可...
  • 4)只能生成同一份word文档:每渲染一次,就要重新选定模板。 三、总结 通过本次实验,我们实现了根据模板批量生成含指定数据的word文件,我最开始看代码时不懂它是用的哪种类型变量接收从csv中读取的数据,通过...
  • 前言:前两篇博客介绍了 Python 的 docx 模块对 Word 文档的写操作,这篇博客将介绍如何用 docx 模块读取已有 Word...1、获取文档章节信息:1、用docx模块获取已有的word文档对象:from docx import Document# Docum...
  • 在打印时可以指定打印的页面36.Word 2010文档默认的文件扩展名为( ) 。 A.TXT B.WPS C.DOCX D.WRI37.在编辑文档时,如要看到页面的实际效果,应采用( )模式。 A.阅读版式视图 B.页面视图 C.大纲视图 D.Web...
  • Word转图片的方法(两种)

    千次阅读 2021-01-29 10:05:15
    Word转图片方法 我们经常要把Word转成JPG图片,用市面上的转换软件会出现各种问题,比如: 转出来后特殊字体变成了...3、拖动滑块,将画面显示最大化(见图) 4、拖动滑块,将画面显示最大化 最后用QQ截图:快捷键
  • Java 下载Word文档xwpfTemplate Java 下载Word文档xwpfTemplate 文档下载(图片,数据表格),pom依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId>...
  • 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料以及群交流解答点击...
  • word文件的组成

    2021-07-31 09:28:19
    1.word文档的界面组成1、最左上角...3、编辑好word文档后,要对文档进行相关设置,就会用到对话框里的选项4、用鼠标点中工具栏时,会有相应的工具栏文字提示,如把鼠标放在工具栏处,下方显示格式刷,放在其他位置,...
  • VC++ Word文档 自动技术

    千次阅读 2011-03-17 14:34:00
    <br />VC++6.0向Word文件的指定位置上插入一张图片,需要用到nlineShapes类型的AddPicture方法。 在MSDN中,该方法的声明如下: ****************************************************************...
  • 1 1 中文 Word2010 是 A 处理软件 B 系统软件 C 硬件 D 操作系统 2 在 Word2010 文档窗口进行最小操作 A 会将指定的文档关闭 B 文档的窗口和文档都没关闭 C 会关闭文档及窗口 D 将指定的文档从外存中读入并显示...
  • 词语向量-word2vec简介和使用

    万次阅读 多人点赞 2017-06-09 02:39:47
    前言最初听闻word2vec还在读研了。当时挺感兴趣的,不过一直忙于毕业事项,没好好研究下,对word2vec也只是概念上的了解,直到这两天有空才能专门学习下这方面的知识。知识不经过整理很容易忘记,尤其像这种算法类的...
  • 第三章:Word文档处理 一、课前预习 1. 二、课堂笔记 三、课后总结 –仰望星空,脚踏实地;以梦为马,不负韶华
  • Java中文分词组件 - word分词

    万次阅读 2019-02-10 16:17:50
    word分词是一个Java实现的分布式的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义。能准确识别英文、数字,以及日期、时间等数量词,能识别人名、地名、组织机构名等未登录词。能通过...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,951
精华内容 12,380
关键字:

word文档文字最大化