如何利用win32printing库实现TXT文件内容在纸张居中打印?
这个问题我之前也碰到过,win32printing确实没有直接的居中打印预设,但我们可以通过计算页面尺寸与文本尺寸的差值来精准定位文本到页面中间,比瞎调边距靠谱多了。下面是具体的实现思路和代码:
核心思路
要让文本居中,关键是算出文本在页面上的起始坐标:
- 先获取打印机当前使用的页面尺寸(比如A4的宽高,单位是缇,1缇=1/1440英寸)
- 测量你要打印的文本(或多行文本块)的总宽度和总高度
- 用页面尺寸减去文本尺寸,再除以2,得到居中的起始X、Y坐标
- 直接指定坐标打印文本,比调边距更精准(还能避开打印机的最小边距限制)
单文本行居中示例
from win32printing import Printer, Font # 定义字体配置 font = Font(name="微软雅黑", size=14, bold=True) target_text = "title1" with Printer(linegap=20) as printer: # 获取当前打印机的页面尺寸(宽、高,单位:缇) page_width = printer.page_width page_height = printer.page_height # 测量目标文本的宽度和高度 text_width, text_height = printer.measure_text(target_text, font_config=font) # 计算居中的起始坐标 center_x = (page_width - text_width) // 2 center_y = (page_height - text_height) // 2 # 直接在居中位置打印文本 printer.text(target_text, x=center_x, y=center_y, font_config=font)
多行文本块居中示例
如果是多行文本,需要计算整个文本块的总高度(包含行间距):
from win32printing import Printer, Font font = Font(name="宋体", size=12) text_lines = ["标题1", "副标题", "内容第一行", "内容第二行"] with Printer(linegap=15) as printer: page_width = printer.page_width page_height = printer.page_height # 计算每行文本的宽度和总高度 line_dims = [printer.measure_text(line, font_config=font) for line in text_lines] max_text_width = max(dim[0] for dim in line_dims) total_text_height = sum(dim[1] for dim in line_dims) + (len(text_lines)-1)*printer.linegap # 计算文本块的起始坐标 block_x = (page_width - max_text_width) // 2 current_y = (page_height - total_text_height) // 2 # 逐行打印(每行也可单独水平居中) for line, (line_width, line_height) in zip(text_lines, line_dims): line_x = block_x + (max_text_width - line_width) // 2 printer.text(line, x=line_x, y=current_y, font_config=font) current_y += line_height + printer.linegap
注意事项
- 打印机有最小边距限制:如果计算出的坐标超出打印机的可打印区域,文本可能会被裁剪。可以通过
printer.printable_area获取实际可打印的宽高,用这个值代替page_width和page_height更稳妥。 - 单位问题:
win32printing默认用缇(Twip)作为单位,不用手动转换,直接用测量和获取到的数值计算即可。
内容的提问来源于stack exchange,提问作者kkkkmert
相关产品推荐
相关产品推荐

