printer.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512
  1. """
  2. 打印功能模块
  3. 使用PyQt5的QPrinter实现打印功能
  4. """
  5. from PyQt5.QtPrintSupport import QPrinter, QPrintDialog, QPrintPreviewDialog
  6. from PyQt5.QtWidgets import QApplication
  7. from PyQt5.QtGui import QPainter, QFont, QFontMetrics, QPen
  8. from PyQt5.QtCore import Qt, QRect, QSizeF, QSize
  9. from typing import Dict
  10. import platform
  11. class Printer:
  12. """打印类"""
  13. def __init__(self):
  14. # 100mm x 150mm 纸张尺寸
  15. self.page_width_mm = 100 # 100mm
  16. self.page_height_mm = 150 # 150mm
  17. # 边距(mm)
  18. self.margin_mm = 3 # 上下左右各3mm边距
  19. # 计算可用尺寸
  20. # 可用高度 = 150mm - 上下边距(6mm) = 144mm
  21. # 可用宽度 = 100mm - 左右边距(6mm) = 94mm
  22. available_height_mm = self.page_height_mm - (2 * self.margin_mm) # 144mm
  23. available_width_mm = self.page_width_mm - (2 * self.margin_mm) # 94mm
  24. # 12行数据行 + 1行标题行 = 13行
  25. # 标题行占用10mm,剩余134mm给12行数据行
  26. # 每行高度 = 134mm / 12 ≈ 11.17mm
  27. num_data_rows = 12 # 12行数据行
  28. title_height_mm = 10.0 # 标题行高度
  29. data_rows_height_mm = available_height_mm - title_height_mm # 134mm
  30. self.line_height_mm = data_rows_height_mm / num_data_rows # 约11.17mm每行
  31. self.title_line_height_mm = title_height_mm # 10mm标题行
  32. # 4列布局:左侧label + 左侧内容 + 右侧label + 右侧内容
  33. # 每列约 = 94mm / 4 ≈ 23.5mm
  34. # 但实际分配:左侧部分和右侧部分各占50%
  35. # 左侧:label(约25%) + 内容(约25%)
  36. # 右侧:label(约25%) + 内容(约25%)
  37. column_width_mm = available_width_mm / 4 # 约23.5mm每列
  38. # 字体大小(增加3倍)
  39. self.title_font_size_mm = 2.1 # 标题字体大小(mm),增加3倍
  40. self.content_font_size_mm = 1.68 # 内容字体大小(mm),增加3倍
  41. self.label_font_size_mm = 1.68 # 标签字体大小(mm),增加3倍(不加粗)
  42. # 单元格内边距和间距
  43. self.cell_padding_mm = 2.0 # 单元格内边距(mm)
  44. self.label_content_spacing_mm = 2.5 # label和内容之间的间距(mm)
  45. # 这些值将在draw_weighing_slip中根据实际页面尺寸动态计算
  46. self.title_font_size = None
  47. self.content_font_size = None
  48. self.label_font_size = None
  49. self.line_height = None
  50. self.title_line_height = None
  51. self.cell_padding = None
  52. self.label_content_spacing = None
  53. self.label_width_2col = None
  54. self.label_width_4col = None
  55. self.label_width_cargo_name = None
  56. self.label_width_business_type = None
  57. self.label_width_supplier_consignee = None
  58. self.label_width_time = None
  59. self.label_width_planned_executed = None
  60. def _calculate_dimensions_from_page(self, page_width, page_height, dpi, painter=None):
  61. """
  62. 根据实际页面尺寸计算所有尺寸
  63. :param page_width: 页面宽度(points)
  64. :param page_height: 页面高度(points)
  65. :param dpi: 打印机DPI
  66. :param painter: QPainter对象(可选,用于更准确地计算字体宽度)
  67. """
  68. # 将mm转换为points:1mm = (dpi / 25.4) points
  69. mm_to_point = dpi / 25.4
  70. # 计算实际页面尺寸(mm)
  71. actual_width_mm = page_width / mm_to_point
  72. actual_height_mm = page_height / mm_to_point
  73. # 基于实际尺寸计算缩放比例(相对于100mm x 150mm)
  74. width_scale = actual_width_mm / self.page_width_mm
  75. height_scale = actual_height_mm / self.page_height_mm
  76. scale = min(width_scale, height_scale) # 使用较小的缩放比例,确保内容不超出
  77. # 计算字体大小(points)
  78. self.title_font_size = int(self.title_font_size_mm * mm_to_point * scale)
  79. self.content_font_size = int(self.content_font_size_mm * mm_to_point * scale)
  80. self.label_font_size = int(self.label_font_size_mm * mm_to_point * scale)
  81. # 计算行高和间距(points)
  82. self.line_height = int(self.line_height_mm * mm_to_point * scale)
  83. self.title_line_height = int(self.title_line_height_mm * mm_to_point * scale)
  84. self.cell_padding = int(self.cell_padding_mm * mm_to_point * scale)
  85. self.label_content_spacing = int(self.label_content_spacing_mm * mm_to_point * scale)
  86. # 创建临时字体来计算label宽度(不加粗)
  87. two_char_width = 0
  88. try:
  89. label_font = QFont("微软雅黑", self.label_font_size) # 不加粗
  90. if painter:
  91. # 使用painter的font metrics,更准确
  92. painter.setFont(label_font)
  93. label_metrics = painter.fontMetrics()
  94. else:
  95. # 如果没有painter,使用QFontMetrics
  96. label_metrics = QFontMetrics(label_font)
  97. two_char_width = label_metrics.boundingRect("测试").width()
  98. except:
  99. # 如果无法创建QFontMetrics,使用估算值
  100. # 基于字体大小估算两个字的宽度
  101. two_char_width = int(self.label_font_size * 2.2)
  102. # 计算label宽度(基于mm,然后转换为points)
  103. # 100mm纸张,减去边距6mm = 94mm可用宽度
  104. # 4列布局:每列约23.5mm
  105. # 两列布局:每列约47mm,label占用约40% = 18.8mm
  106. # 四列布局:每列约23.5mm,label占用约40% = 9.4mm
  107. available_width_mm = self.page_width_mm - (2 * self.margin_mm) # 94mm
  108. # 两列布局:label宽度约为可用宽度的20%(给内容更多空间)
  109. label_width_2col_mm = available_width_mm * 0.20 * scale # 约18.8mm
  110. # 四列布局:label宽度约为单列宽度的40%
  111. label_width_4col_mm = (available_width_mm / 4) * 0.40 * scale # 约9.4mm
  112. self.label_width_2col = int(label_width_2col_mm * mm_to_point) + two_char_width
  113. self.label_width_4col = int(label_width_4col_mm * mm_to_point) + two_char_width
  114. # 特定字段的label宽度(基于实际字符宽度)
  115. # 货物名称、供货单位、收货单位的label较长,需要更多宽度
  116. self.label_width_cargo_name = int(available_width_mm * 0.25 * scale * mm_to_point) + two_char_width
  117. self.label_width_business_type = int(label_width_4col_mm * 1.1 * mm_to_point) + two_char_width
  118. self.label_width_supplier_consignee = int(available_width_mm * 0.25 * scale * mm_to_point) + two_char_width
  119. self.label_width_time = int(label_width_4col_mm * 1.1 * mm_to_point) + two_char_width
  120. self.label_width_planned_executed = int(label_width_4col_mm * 1.1 * mm_to_point) + two_char_width
  121. def get_printer(self) -> QPrinter:
  122. """
  123. 获取配置好的打印机对象
  124. :return: QPrinter对象
  125. """
  126. # 使用高分辨率打印机
  127. printer = QPrinter(QPrinter.HighResolution)
  128. # 设置自定义页面大小:100mm x 150mm
  129. printer.setPageSize(QPrinter.Custom)
  130. # 设置页面尺寸(单位:毫米)
  131. # 使用setPaperSize设置自定义尺寸
  132. try:
  133. printer.setPaperSize(QSizeF(self.page_width_mm, self.page_height_mm), QPrinter.Millimeter)
  134. except (AttributeError, TypeError):
  135. # 如果setPaperSize不存在或参数错误,尝试使用物理尺寸
  136. try:
  137. # 计算points尺寸:100mm = 283.46 points (72 DPI), 150mm = 425.19 points
  138. # 但在高分辨率打印机上,需要使用实际DPI
  139. dpi = printer.resolution()
  140. width_points = self.page_width_mm * (dpi / 25.4)
  141. height_points = self.page_height_mm * (dpi / 25.4)
  142. printer.setPaperSize(QSizeF(width_points, height_points), QPrinter.Point)
  143. except:
  144. pass
  145. # 设置页边距(单位:毫米)
  146. printer.setPageMargins(
  147. self.margin_mm, self.margin_mm,
  148. self.margin_mm, self.margin_mm,
  149. QPrinter.Millimeter
  150. )
  151. return printer
  152. def preview_weighing_slip(self, slip: Dict):
  153. """
  154. 预览地磅单
  155. :param slip: 地磅单数据字典
  156. """
  157. printer = self.get_printer()
  158. # 创建打印预览对话框
  159. preview_dialog = QPrintPreviewDialog(printer)
  160. preview_dialog.setWindowTitle("打印预览 - 地磅单")
  161. # 定义绘制函数
  162. def paint_page(printer_obj):
  163. painter = QPainter(printer_obj)
  164. try:
  165. self.draw_weighing_slip(painter, printer_obj, slip)
  166. finally:
  167. painter.end()
  168. # 连接预览绘制信号
  169. preview_dialog.paintRequested.connect(paint_page)
  170. # 显示预览对话框
  171. preview_dialog.exec_()
  172. def print_weighing_slip(self, slip: Dict, show_preview: bool = False):
  173. """
  174. 打印地磅单
  175. :param slip: 地磅单数据字典
  176. :param show_preview: 是否先显示预览(默认False,直接打印)
  177. """
  178. if show_preview:
  179. # 显示预览
  180. self.preview_weighing_slip(slip)
  181. return
  182. printer = self.get_printer()
  183. # 显示打印对话框
  184. print_dialog = QPrintDialog(printer)
  185. if print_dialog.exec_() != QPrintDialog.Accepted:
  186. return
  187. # 开始打印
  188. painter = QPainter()
  189. painter.begin(printer)
  190. try:
  191. self.draw_weighing_slip(painter, printer, slip)
  192. finally:
  193. painter.end()
  194. def draw_weighing_slip(self, painter: QPainter, printer: QPrinter, slip: Dict):
  195. """
  196. 绘制地磅单内容
  197. :param painter: QPainter对象
  198. :param printer: QPrinter对象
  199. :param slip: 地磅单数据字典
  200. """
  201. # 获取页面尺寸(已减去边距)
  202. page_rect = printer.pageRect()
  203. width = page_rect.width()
  204. height = page_rect.height()
  205. # 获取打印机DPI
  206. dpi = printer.resolution()
  207. # 根据实际页面尺寸计算所有尺寸(传入painter以便更准确地计算字体宽度)
  208. self._calculate_dimensions_from_page(width, height, dpi, painter)
  209. x = 0
  210. y = 0
  211. # 设置字体
  212. title_font = QFont("微软雅黑", self.title_font_size, QFont.Bold)
  213. # label字体不加粗,与内容字体一样
  214. label_font = QFont("微软雅黑", self.label_font_size) # 不加粗
  215. content_font = QFont("微软雅黑", self.content_font_size)
  216. # 绘制标题 - 确保居中
  217. painter.setFont(title_font)
  218. title = "山峡化工地磅单"
  219. title_metrics = QFontMetrics(title_font)
  220. # 使用boundingRect获取更准确的文本宽度
  221. title_rect = title_metrics.boundingRect(title)
  222. title_width = title_rect.width()
  223. # 使用页面实际宽度计算居中位置(相对于pageRect,x从0开始)
  224. title_x = (width - title_width) / 2
  225. # 确保标题垂直居中在标题行内
  226. # 使用更精确的垂直居中:单元格中心 + 文本rect的top偏移
  227. title_baseline = y + self.title_line_height / 2 + title_rect.height() / 2 - title_rect.bottom()
  228. # 使用QRect和Qt.AlignCenter来确保完美居中
  229. title_draw_rect = QRect(0, y, width, self.title_line_height)
  230. painter.drawText(title_draw_rect, Qt.AlignCenter, title)
  231. # 标题后直接开始数据行,不增加额外间距(因为行高已经合理分配)
  232. y += self.title_line_height
  233. # 设置边框画笔(2px边框线)
  234. # 在Qt打印系统中,使用逻辑单位,设置为2点(points)即可
  235. # 这样在打印时会自动按比例缩放,保持2像素的视觉效果
  236. border_width_points = 2 # 2px边框宽度(逻辑单位)
  237. border_pen = QPen(Qt.black, border_width_points)
  238. border_pen.setStyle(Qt.SolidLine)
  239. painter.setPen(border_pen)
  240. # 绘制表格内容(带边框)
  241. painter.setFont(label_font)
  242. content_metrics = QFontMetrics(content_font)
  243. label_metrics = QFontMetrics(label_font)
  244. # 计算文本垂直居中位置(通用函数)
  245. def get_text_baseline(cell_y_pos):
  246. max_metrics = label_metrics if label_metrics.height() > content_metrics.height() else content_metrics
  247. return cell_y_pos + self.line_height / 2 + max_metrics.ascent() - max_metrics.height() / 2
  248. # 辅助函数:绘制两列单元格(label + 内容)
  249. def draw_2col_row(label_text, value_text, y_pos, custom_label_width=None):
  250. cell_y = y_pos
  251. # 绘制边框(确保所有参数都是整数)
  252. painter.drawRect(int(x), int(cell_y), int(width), int(self.line_height))
  253. text_baseline = get_text_baseline(cell_y)
  254. # 使用自定义label宽度或默认宽度
  255. label_width = custom_label_width if custom_label_width is not None else self.label_width_2col
  256. # 绘制标签(固定宽度)
  257. painter.setFont(label_font)
  258. label_x = x + self.cell_padding
  259. painter.drawText(int(label_x), int(text_baseline), label_text)
  260. # 绘制内容(从固定label宽度后开始,剩余空间全部给内容)
  261. if value_text:
  262. painter.setFont(content_font)
  263. content_x = label_x + label_width + self.label_content_spacing
  264. # 计算内容区域的最大宽度,避免超出边界
  265. content_max_width = width - content_x - self.cell_padding
  266. painter.drawText(int(content_x), int(text_baseline), str(value_text))
  267. return y_pos + self.line_height
  268. # 辅助函数:绘制四列单元格(label1 + 内容1 + label2 + 内容2)
  269. def draw_4col_row(label1_text, value1_text, label2_text, value2_text, y_pos,
  270. custom_label1_width=None, custom_label2_width=None,
  271. left_content_max_width=None, custom_line_height=None,
  272. draw_center_line=False):
  273. cell_y = y_pos
  274. # 使用自定义行高或默认行高(如果包含多行文本,使用更大的行高)
  275. actual_line_height = custom_line_height if custom_line_height is not None else self.line_height
  276. # 如果value2包含换行符(多行文本),增加行高(减小增加比例)
  277. if value2_text and "\n" in str(value2_text):
  278. actual_line_height = actual_line_height * 1.4 # 增加40%的行高来容纳两行文本(减小了)
  279. # 绘制边框(确保转换为整数)
  280. painter.drawRect(int(x), int(cell_y), int(width), int(actual_line_height))
  281. text_baseline = get_text_baseline(cell_y)
  282. # 使用自定义label宽度或默认宽度
  283. label1_width = custom_label1_width if custom_label1_width is not None else self.label_width_4col
  284. label2_width = custom_label2_width if custom_label2_width is not None else self.label_width_4col
  285. # 左侧部分(占一半宽度,但如果指定了left_content_max_width,则调整)
  286. if left_content_max_width is not None:
  287. # 计算左侧内容区域的结束位置
  288. label1_x = x + self.cell_padding
  289. content1_x = label1_x + label1_width + self.label_content_spacing
  290. left_end_x = content1_x + left_content_max_width
  291. # 右侧部分从左侧内容区域结束后开始
  292. right_start_x = left_end_x + self.cell_padding
  293. else:
  294. # 默认:左侧部分(占一半宽度)
  295. left_half_width = width / 2
  296. right_start_x = x + left_half_width
  297. # 左侧label
  298. painter.setFont(label_font)
  299. label1_x = x + self.cell_padding
  300. painter.drawText(int(label1_x), int(text_baseline), label1_text)
  301. # 左侧内容
  302. if value1_text:
  303. painter.setFont(content_font)
  304. content1_x = label1_x + label1_width + self.label_content_spacing
  305. # 左侧内容最大宽度
  306. if left_content_max_width is not None:
  307. content1_max_width = left_content_max_width
  308. else:
  309. content1_max_width = right_start_x - content1_x - self.cell_padding
  310. painter.drawText(int(content1_x), int(text_baseline), str(value1_text))
  311. # 右侧label
  312. painter.setFont(label_font)
  313. label2_x = right_start_x + self.cell_padding
  314. painter.drawText(int(label2_x), int(text_baseline), label2_text)
  315. # 右侧内容
  316. if value2_text:
  317. content2_x = label2_x + label2_width + self.label_content_spacing
  318. # 右侧内容最大宽度
  319. content2_max_width = width - content2_x - self.cell_padding
  320. value2_str = str(value2_text)
  321. # 检查是否包含换行符(多行文本,通常是时间字段)
  322. if "\n" in value2_str:
  323. # 多行文本(时间字段):使用更小的字体
  324. time_font_size = int(self.content_font_size * 0.75) # 减小25%的字体大小
  325. time_font = QFont("微软雅黑", time_font_size)
  326. painter.setFont(time_font)
  327. # 多行文本:使用QRect和TextWordWrap
  328. content2_rect = QRect(
  329. int(content2_x),
  330. int(cell_y + self.cell_padding),
  331. int(content2_max_width),
  332. int(actual_line_height - 2 * self.cell_padding)
  333. )
  334. painter.drawText(content2_rect, Qt.AlignLeft | Qt.AlignTop | Qt.TextWordWrap, value2_str)
  335. else:
  336. # 单行文本:使用原来的字体
  337. painter.setFont(content_font)
  338. painter.drawText(int(content2_x), int(text_baseline), value2_str)
  339. # 如果需要绘制中间竖线,在行的正中间往左30px位置绘制(20px + 10px)
  340. if draw_center_line:
  341. # 将30px转换为逻辑单位(points)
  342. # 在Qt打印系统中,width是points单位
  343. # 屏幕96 DPI:1 pixel = 72/96 = 0.75 points
  344. # 所以:30px = 30 * 0.75 = 22.5 points
  345. offset_points = 30 * 72.0 / 96.0 # 约22.5 points
  346. center_x = x + width / 2 - offset_points
  347. painter.drawLine(int(center_x), int(cell_y), int(center_x), int(cell_y + actual_line_height))
  348. return y_pos + actual_line_height
  349. # 表格第一行:车号(两列:label + 内容)
  350. y = draw_2col_row("车号:", slip['vehicle_no'], y)
  351. # 表格第二行:计划号(两列:label + 内容)
  352. y = draw_2col_row("计划号:", slip.get('plan_no', '') or '', y)
  353. # 表格第三行:货物名称(两列:label + 内容)
  354. y = draw_2col_row("货物名称:", slip['cargo_name'], y, self.label_width_cargo_name)
  355. # 表格第四行:业务类型、批号(四列:label1 + 内容1 + label2 + 内容2)
  356. y = draw_4col_row(
  357. "业务类型:", slip['business_type'],
  358. "批号:", slip.get('batch_no', '') or '',
  359. y,
  360. custom_label1_width=self.label_width_business_type,
  361. draw_center_line=True
  362. )
  363. # 表格第五行:供货单位(两列:label + 内容)
  364. y = draw_2col_row("供货单位:", slip['supplier'], y, self.label_width_supplier_consignee)
  365. # 表格第六行:收货单位(两列:label + 内容)
  366. y = draw_2col_row("收货单位:", slip['consignee'], y, self.label_width_supplier_consignee)
  367. # 格式化时间字符串,将日期和时间分两行显示
  368. def format_time_to_two_lines(time_str):
  369. """将时间字符串格式化为两行:日期和时间分开"""
  370. if not time_str:
  371. return ""
  372. # 将空格替换为换行符
  373. # 例如:"2025-11-20 09:08:01" -> "2025-11-20\n09:08:01"
  374. return str(time_str).replace(" ", "\n", 1)
  375. # 表格第七行:毛重(t)、毛重时间(四列:label1 + 内容1 + label2 + 内容2)
  376. # 将kg转换为t(除以1000)
  377. gross_weight_t = slip['gross_weight'] / 1000.0
  378. # 格式化毛重时间,分成两行显示
  379. gross_weight_time_formatted = format_time_to_two_lines(slip['gross_weight_time'])
  380. # 限制毛重内容区域宽度,让时间部分往左移
  381. # 4列布局:左侧50%中,label占40%,内容占60%的左侧部分 = 约28mm
  382. # 但为了给时间更多空间,限制毛重内容为左侧部分的50%
  383. gross_weight_content_width = int(width * 0.22)
  384. y = draw_4col_row(
  385. "毛重(t):", f"{gross_weight_t:.2f}",
  386. "毛重时间:", gross_weight_time_formatted,
  387. y,
  388. custom_label2_width=self.label_width_time,
  389. left_content_max_width=gross_weight_content_width,
  390. draw_center_line=True
  391. )
  392. # 表格第八行:皮重(t)、皮重时间(四列:label1 + 内容1 + label2 + 内容2)
  393. # 将kg转换为t(除以1000)
  394. tare_weight_t = slip['tare_weight'] / 1000.0
  395. # 格式化皮重时间,分成两行显示
  396. tare_weight_time_formatted = format_time_to_two_lines(slip['tare_weight_time'])
  397. # 限制皮重内容区域宽度,让时间部分往左移
  398. # 4列布局:与毛重相同,限制皮重内容为左侧部分的50%
  399. tare_weight_content_width = int(width * 0.22)
  400. y = draw_4col_row(
  401. "皮重(t):", f"{tare_weight_t:.2f}",
  402. "皮重时间:", tare_weight_time_formatted,
  403. y,
  404. custom_label2_width=self.label_width_time,
  405. left_content_max_width=tare_weight_content_width,
  406. draw_center_line=True
  407. )
  408. # 表格第九行:扣杂(t)、净重(t)(四列:label1 + 内容1 + label2 + 内容2)
  409. # 将kg转换为t(除以1000)
  410. deduction_t = slip.get('deduction', 0) / 1000.0
  411. net_weight_t = slip['net_weight'] / 1000.0
  412. # 使用与皮重时间相同的左侧内容宽度,确保右侧label对齐
  413. y = draw_4col_row(
  414. "扣杂(t):", f"{deduction_t:.2f}",
  415. "净重(t):", f"{net_weight_t:.2f}",
  416. y,
  417. left_content_max_width=tare_weight_content_width,
  418. draw_center_line=True
  419. )
  420. # 表格第十行:计划量(t)、已执行量(t)(四列:label1 + 内容1 + label2 + 内容2)
  421. # 将kg转换为t(除以1000)
  422. planned_qty = slip.get('planned_quantity')
  423. planned_qty_t = planned_qty / 1000.0 if planned_qty else None
  424. executed_qty = slip.get('executed_quantity')
  425. executed_qty_t = executed_qty / 1000.0 if executed_qty else None
  426. # 使用与皮重时间相同的左侧内容宽度,确保右侧label对齐
  427. y = draw_4col_row(
  428. "计划量(t):", f"{planned_qty_t:.2f}" if planned_qty_t else "",
  429. "已执行量(t):", f"{executed_qty_t:.2f}" if executed_qty_t else "",
  430. y,
  431. custom_label1_width=self.label_width_planned_executed,
  432. custom_label2_width=self.label_width_planned_executed,
  433. left_content_max_width=tare_weight_content_width,
  434. draw_center_line=True
  435. )
  436. # 表格第十一行:磅点(两列:label + 内容)
  437. y = draw_2col_row("磅点:", slip.get('weighing_point', '山峡地磅'), y)
  438. # 表格第十二行:备注(两列:label + 内容)
  439. y = draw_2col_row("备注:", slip.get('remarks', '') or '', y)