几周后,我已经非常接近解决我的整体问题了。我希望将我的 Google 表格连接到本地打印机并打印标签“标签”和“声明”。标签需要打印 x 次,x 由单元格 f2 中的值定义。索赔也应该打印一次。
这似乎都已解决,但由于某种原因,完整的 Google 表格选项卡未正确导出为 PDF。
标签似乎是纵向打印的,当它应该是横向打印时,文本可能需要更大(下图是如何打印的)?
[![错误标签][1]][1]
我似乎无法弄清楚如何调整它。 “索赔”选项卡只是打印空白,但我认为这对两者来说都是同一个问题。
关于如何调整此代码以完全打印选项卡的任何想法?添加示例 URL:
import os
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import win32print
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A5
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
# Set up Google Sheets API credentials
scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('creds.json', scope)
client = gspread.authorize(creds)
# Set up printer name and font
printer_name = "Rollo Printer"
font_path = "arial.ttf"
# Register Arial font
pdfmetrics.registerFont(TTFont('Arial', font_path))
# Open the Google Sheet and select Label and Claims worksheets
sheet_url = "URL"
label_sheet = client.open_by_url(sheet_url).worksheet("Label")
claims_sheet = client.open_by_url(sheet_url).worksheet("Claims")
# Get the number of label copies to print
num_copies = int(label_sheet.acell("F2").value)
# Set up label filename and PDF canvas
label_file = "label.pdf"
label_canvas = canvas.Canvas(label_file, pagesize=A5)
# Write label text to PDF canvas
label_text = label_sheet.get_all_values()
x_pos = 10 # set initial x position
y_pos = 260 # set initial y position
line_height = 14 # set line height for text
label_canvas.setFont('Arial', 8)
for row in label_text:
for col in row:
textobject = label_canvas.beginText()
textobject.setFont('Arial', 8)
textobject.setTextOrigin(x_pos, y_pos)
lines = col.split("\n")
for line in lines:
textobject.textLine(line)
y_pos -= line_height
label_canvas.drawText(textobject)
x_pos += 90
y_pos = 260
x_pos = 10
# Save the label PDF and print to the printer
label_canvas.save()
for i in range(num_copies):
os.startfile(label_file, 'printto', printer_name, "", 1)
# Set up claims filename and PDF canvas
claims_file = "claims.pdf"
claims_canvas = canvas.Canvas(claims_file, pagesize=A5)
# Write claims text to PDF canvas
claims_text = claims_sheet.get_all_values()
y_pos = 260 # set initial y position
claims_canvas.setFont('Arial', 8)
for row in claims_text:
textobject = claims_canvas.beginText()
textobject.setFont('Arial', 8)
lines = row[0].split("\n")
for line in lines:
textobject.textLine(line)
y_pos -= line_height
claims_canvas.drawText(textobject)
y_pos = 260
# Save the claims PDF and print to the printer
claims_canvas.save()
os.startfile(claims_file, 'printto', printer_name, "", 1)
我想出了切换到横向,但标签仍然不正确。有没有办法将它们指定为 4x6?或以不同方式从 Google 表格导出?问题是标签没有按照 4x6 标签的格式导出为 PDF。
import os
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import win32print
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import landscape, A5
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
# Set up Google Sheets API credentials
scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('creds.json', scope)
client = gspread.authorize(creds)
# Set up printer name and font
printer_name = "Rollo Printer"
font_path = "arial.ttf"
# Register Arial font
pdfmetrics.registerFont(TTFont('Arial', font_path))
# Open the Google Sheet and select Label and Claims worksheets
sheet_url = "https://docs.google.com/spreadsheets/d/1eRO-30eIZamB5sjBp-Mz2QMKCfGxV037MQO8nS7G7AI/edit#gid=1988901382"
label_sheet = client.open_by_url(sheet_url).worksheet("Label")
claims_sheet = client.open_by_url(sheet_url).worksheet("Claims")
# Get the number of label copies to print
num_copies = int(label_sheet.acell("F2").value)
# Set up label filename and PDF canvas
label_file = "label.pdf"
label_canvas = canvas.Canvas(label_file, pagesize=landscape(A5))
# Write label text to PDF canvas
label_text = label_sheet.get_all_values()
x_pos = 10 # set initial x position
y_pos = 260 # set initial y position
line_height = 14 # set line height for text
label_canvas.setFont('Arial', 8)
for row in label_text:
for col in row:
textobject = label_canvas.beginText()
textobject.setFont('Arial', 8)
textobject.setTextOrigin(x_pos, y_pos)
lines = col.split("\n")
for line in lines:
textobject.textLine(line)
y_pos -= line_height
label_canvas.drawText(textobject)
x_pos += 90
y_pos = 260
x_pos = 10
# Save the label PDF and print to the printer
label_canvas.save()
for i in range(num_copies):
os.startfile(label_file, 'printto', printer_name, "", 1)
# Set up claims filename and PDF canvas
claims_file = "claims.pdf"
claims_canvas = canvas.Canvas(claims_file, pagesize=landscape(A5))
# Write claims text to PDF canvas
claims_text = claims_sheet.get_all_values()
y_pos = 260 # set initial y position
claims_canvas.setFont('Arial', 8)
for row in claims_text:
textobject = claims_canvas.beginText()
textobject.setFont('Arial', 8)
lines = row[0].split("\n")
for line in lines:
textobject.textLine(line)
y_pos -= line_height
claims_canvas.drawText(textobject)
y_pos = 260
# Save the claims PDF and print to the printer
claims_canvas.save()
os.startfile(claims_file, 'printto', printer_name, "", 1)
我认为代码需要看起来更像这样,但我收到了回溯错误(也在下面)。
代码:
import os
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import win32print
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import landscape, portrait
from reportlab.lib.units import mm
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
# Set up Google Sheets API credentials
scope = ['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('creds.json', scope)
client = gspread.authorize(creds)
# Set up printer name and font
printer_name = "Rollo Printer"
font_path = "arial.ttf"
# Register Arial font
pdfmetrics.registerFont(TTFont('Arial', font_path))
# Open the Google Sheet and select Label and Claims worksheets
sheet_url = "https://docs.google.com/spreadsheets/d/1eRO-30eIZamB5sjBp-Mz2QMKCfGxV037MQO8nS7G7AI/edit#gid=1988901382"
label_sheet = client.open_by_url(sheet_url).worksheet("Label")
claims_sheet = client.open_by_url(sheet_url).worksheet("Claims")
# Get the number of label copies to print
num_copies = int(label_sheet.acell("F2").value)
# Set up label filename and PDF canvas
label_file = "label.pdf"
label_canvas = canvas.Canvas(label_file, pagesize=landscape((6*72*mm), (4*72*mm)))
# Write label text to PDF canvas
label_text = label_sheet.get_all_values()
x_pos = 10 # set initial x position
y_pos = 260 # set initial y position
line_height = 20 # set line height for text
label_canvas.setFont('Arial', 18)
for row in label_text:
for col in row:
textobject = label_canvas.beginText()
textobject.setFont('Arial', 18)
textobject.setTextOrigin(x_pos, y_pos)
lines = col.split("\n")
for line in lines:
textobject.textLine(line)
y_pos -= line_height
label_canvas.drawText(textobject)
x_pos += 145
y_pos = 260
x_pos = 10
# Save the label PDF and print to the printer
label_canvas.save()
for i in range(num_copies):
os.startfile(label_file, 'printto', printer_name, "", 1)
# Set up claims filename and PDF canvas
claims_file = "claims.pdf"
claims_canvas = canvas.Canvas(claims_file, pagesize=landscape((6*72*mm), (4*72*mm)))
# Write claims text to PDF canvas
claims_text = claims_sheet.get_all_values()
y_pos = 260 # set initial y position
claims_canvas.setFont('Arial', 18)
for row in claims_text:
textobject = claims_canvas.beginText()
textobject.setFont('Arial', 18)
lines = row[0].split("\n")
for line in lines:
textobject.textLine(line)
y_pos -= line_height
claims_canvas.drawText(textobject)
y_pos = 260
# Save the claims PDF and print to the printer
claims_canvas.save()
os.startfile(claims_file, 'printto', printer_name, "", 1)
错误:
PS C:\Users\amadl\JRPrintFinal> & "C:/Program Files/Python311/python.exe" c:/Users/amadl/JRPrintFinal/printerv7testing.py
Traceback (most recent call last):
File "c:\Users\amadl\JRPrintFinal\printerv7testing.py", line 34, in <module>
label_canvas = canvas.Canvas(label_file, pagesize=landscape((6*72*mm), (4*72*mm)))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: landscape() takes 1 positional argument but 2 were given
[1]: https://i.stack.imgur.com/UUv4C.png
根据[ReportLab.Docs]: Graphics and Text with pdfgen - More about the Canvas(重点是我的):
参数 是两个数字的元组,以点(1/72 英寸)为单位。pagesize
页面大小被指定为元组,包括那些动态构造的(通过函数:e.g.:landscape)。
您可以看到这样的函数,例如从一个页面大小(作为参数传递)到另一个页面大小(返回)的转换。
这个也可以看源码:[ReportLab.HG]: hg-public/reportlab - (v3.5.0) src/reportlab/lib/pagesizes.py(我对Mercurial不熟悉所以我不知道 URL 是否永久(因为它包含 Id)或(如果不是,)它的有效期是多久)。
所以,必须把故障线改成:
label_canvas = canvas.Canvas(label_file, pagesize=landscape((6 * 72 * mm, 4 * 72 * mm)))
作为附加说明,我不知道最终尺寸应该是多少,但它们对我来说有点不对(因为 72 因子 - 代表 DpI)。