12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- # -*- coding: utf-8 -*-
- import io
- import os
- import sys
- from docx import Document
- from docx.shared import Inches, Cm
- import cv2
- import numpy as np
- scale = 37.79527559055118 # word的cm与px的比例(别问为什么, 自己去测)
- def main(param):
- docx_name, chessboard_cm, width_cm, height_cm = param
- chessboard_pixel = chessboard_cm*scale
- width = round(width_cm / chessboard_cm)
- height = round(height_cm / chessboard_cm)
- # width_pix = (width + 1) * chessboard_pixel
- # height_pix = (height + 1) * chessboard_pixel
- width_pix = round(width_cm * scale)
- height_pix = round(height_cm * scale)
- size = width_cm/height_cm
- image = np.zeros((height_pix, width_pix, 3), dtype=np.uint8)
- image.fill(255)
- color = (255, 255, 255)
- fill_color = 0
- for j in range(0, height + 1):
- y = round(j * chessboard_pixel)
- for i in range(0, width + 1):
- x0 = round(i * chessboard_pixel)
- y0 = y
- rect_start = (x0, y0)
- x1 = round(x0 + chessboard_pixel)
- y1 = round(y0 + chessboard_pixel)
- rect_end = (x1, y1)
- cv2.rectangle(image, rect_start, rect_end, color, 1, 0)
- image[y0:y1, x0:x1] = fill_color
- if width % 2:
- if i != width:
- fill_color = (0 if (fill_color == 255) else 255)
- else:
- if i != width + 1:
- fill_color = (0 if (fill_color == 255) else 255)
- bottom = round(width_pix/size)
- if bottom < height_pix:
- image = image[0:bottom, :, :]
- # 创建显示窗口
- win_name = "chessboard"
- # cv.namedWindow(win_name, cv.WINDOW_NORMAL)
- cv2.imwrite(win_name + ".bmp", image)
- # cv.imshow(win_name, image)
- # cv.waitKey()
- doc = Document() # 以默认模板建立文档对象
- distance = Inches(0)
- sec = doc.sections[0]
- sec.left_margin = distance # 以下依次设置左、右、上、下页面边距
- sec.right_margin = distance
- sec.top_margin = distance
- sec.bottom_margin = distance
- sec.page_width = Cm(width_cm) # 设置页面宽度
- sec.page_height = Cm(height_cm) # 设置页面高度
- img_encode = cv2.imencode('.bmp', image)[1]
- str_encode = img_encode .tostring()
- cc = io.BytesIO(str_encode)
- # img = doc.add_picture(cc, Cm(42.01))
- doc.add_picture(cc)
- # doc.add_picture(win_name + ".bmp")
- doc.save(docx_name) # 保存图像
- if __name__ == '__main__':
- param = ['chessboard.docx', 4, 42, 29.7] # 文档名, 正方格长度cm, 页面宽度cm, 页面高度cm
- length = len(sys.argv)
- if length > 1:
- for idx in range(1, 5 if (length > 5) else length):
- param[idx - 1] = sys.argv[idx]
- strlist = os.path.splitext(str(param[0]))
- if len(strlist) == 1:
- param[0] = str(param[0]) + '.docx'
- elif strlist[-1] != 'docx':
- param[0] = ''.join(strlist[0:-1]) + '.docx'
- # print(param)
- main(param)
|