如何将完整的 Google 表格选项卡导出为 PDF,然后使用 Python 打印到本地打印机

问题描述 投票:0回答:1

几周后,我已经非常接近解决我的整体问题了。我希望将我的 Google 表格连接到本地打印机并打印标签“标签”和“声明”。标签需要打印 x 次,x 由单元格 f2 中的值定义。索赔也应该打印一次。

这似乎都已解决,但由于某种原因,完整的 Google 表格选项卡未正确导出为 PDF。

标签似乎是纵向打印的,当它应该是横向打印时,文本可能需要更大(下图是如何打印的)?

[![错误标签][1]][1]

我似乎无法弄清楚如何调整它。 “索赔”选项卡只是打印空白,但我认为这对两者来说都是同一个问题。

关于如何调整此代码以完全打印选项卡的任何想法?添加示例 URL:

https://docs.google.com/spreadsheets/d/1MmUb7aPR9JVy-o2erbIDFzoY1iH9M5skcBRYNTuB_Ug/edit#gid=904472643

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
python canvas operating-system pywin32 reportlab
1个回答
0
投票

根据[ReportLab.Docs]: Graphics and Text with pdfgen - More about the Canvas重点是我的):

pagesize
参数 是两个数字的元组,以点(1/72 英寸)为单位。

页面大小被指定为元组,包括那些动态构造的(通过函数: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)。

© www.soinside.com 2019 - 2024. All rights reserved.