0

之前已经发布过这个问题,最近收到了一些非常好的遮阳篷,尽管我还没有完全解决这个问题。我现在有一些可行的代码,虽然这个网站上的某个人可能能够修复,或者告诉我如何修复大声笑。

好吧,基本上是关于我的目标是什么,因为我被多次告知我正在做的事情是无用的,或者我没有提供足够的信息,我会在这里尽力而为。我有一个程序可以在 PDF 文件上创建发票并将其打印出来。python 脚本来自所有必要的客户/服务信息等的 CSV 文件。

现在,到目前为止,我的代码中的问题是我拥有的服务数量,以及在 Python Reportlabs 中,您必须选择在页面上绘制字符串的位置。一个命令示例是:

cursor.drawstring(xLocation,yLocation,String)

通常的做法是从第 1 串到第 6 串,一根一根地拉到它上面的一根。在接下来的三个示例中,您将看到第一个是在对所有服务收费时函数将如何输出。第二个(中间)是不向客户收取某些服务费用的输出。final(RightMost) 示例是我希望它如何输出的代码。

Service 1         Service 1        Service 1
Service 2                          Service 3
Service 3         Service 3        Service 4
Service 4         Service 4        Service 6
Service 5                          
Service 6         Service 6

不幸的是,基于布尔逻辑,并且有 6 种可能的服务,并且每种服务都可以收费或不收费,空的或满的,如果您愿意,那么有 64 种可能的方式来编写相同的函数以实现完美的输出。

如果我们为每个服务创建一个布尔值,0 为空,1 为满,那么我们将不得不测试从 000000 到 111111 的所有可能性。那是64。编码出来是完全合理的。

但是,我需要的服务远不止六项,而且所需的功能数量呈指数级增长。我没有编写每个函数,而是编写了一个程序,该程序将采用 0 和 1 集的文件,即:

0000000000
0000000001
0000000010
etc..

并测试每一行中的每一位。然后,此函数将根据行中的位为文件中的每一行写出一个函数。现在,它会产生不正确的输出。我将首先向您展示我的脚本:

def testFIle():
# This Function will be used to enumerate through the same file you 
used to create the switch dictionary,
# but will define a function for each line.

# filepath = '/home/smiley/Desktop/sampletenbools'
filepath = '/home/smiley/Desktop/10boolsALL'
with open(filepath) as fp:
    num = 1
    for cnt, line in enumerate(fp):
        var = line
        b1 = str(var)[0]
        b2 = str(var)[1]
        b3 = str(var)[2]
        b4 = str(var)[3]
        b5 = str(var)[4]
        b6 = str(var)[5]
        b7 = str(var)[6]
        b8 = str(var)[7]
        b9 = str(var)[8]
        b10 = str(var)[9]

        # YdrawLocationSVC1=490
        # YdrawLocationSVC2=475
        # YdrawLocationSVC3=460
        # YdrawLocationSVC4=445
        # YdrawLocationSVC5=430
        # YdrawLocationSVC6=415
        # YdrawLocationSVC7=400
        # YdrawLocationSVC8=375
        # YdrawLocationSVC9=360
        # YdrawLocationSVC10=345

        if b1 == "0":
            YdrawLocationSVC1=1111
            YdrawLocationSVC2=1
        if b1 == "1":
            YdrawLocationSVC1 = 1

        if b2 == "0":
            YdrawLocationSVC2=1111
            YdrawLocationSVC3=2
        if b2 == "1":
            YdrawLocationSVC2 = 2

        if b3 == "0":
            YdrawLocationSVC3=1111
            YdrawLocationSVC4=3
        if b3 == "1":
            YdrawLocationSVC3 = 3

        if b4 == "0":
            YdrawLocationSVC4=1111
            YdrawLocationSVC5=4
        if b4 == "1":
            YdrawLocationSVC4 = 4

        if b5 == "0":
            YdrawLocationSVC5=1111
            YdrawLocationSVC6=5
        if b5 == "1":
            YdrawLocationSVC5 = 5

        if b6 == "0":
            YdrawLocationSVC6=1111
            YdrawLocationSVC7=6
        if b6 == "1":
            YdrawLocationSVC6 = 6

        if b7 == "0":
            YdrawLocationSVC7=1111
            YdrawLocationSVC8=7
        if b7 == "1":
            YdrawLocationSVC7 = 7

        if b8 == "0":
            YdrawLocationSVC8=1111
            YdrawLocationSVC9=8
        if b8 == "1":
            YdrawLocationSVC8 = 9

        if b9 == "0":
            YdrawLocationSVC9=1111
            YdrawLocationSVC10=9
        if b9 == "1":
            YdrawLocationSVC9 = 9

        if b10 == "0":
            YdrawLocationSVC10=1111
        if b10 == "1":
            YdrawLocationSVC10 = 10


        print "# Bitrep ="+str(var).strip("\n")
        print "def Print"+str(num)+"():"
        print"\tc.setFont('Deja', 12, leading=None)"
        print "\t# SERVICE NAME"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC1)+", stringn1)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC2)+", stringn2)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC3)+", stringn3)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC4)+", stringn4)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC5)+", stringn5)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC6)+", stringn6)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC7)+", stringn7)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC8)+", stringn8)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC9)+", stringn9)"+\
        "\n\tc.drawString(100, "+str(YdrawLocationSVC10)+", stringn10)"




        # print("{} : {}".format(str(line).strip("\n"), "Print" + str(num)))
        num += 1
        # print "\n"


testFIle()

目前,只要仅缺少一项服务,此代码就会在此处生成像这样的正确输出:

# Bitrep =1111111101
def Print1022():
c.setFont('Deja', 12, leading=None)
# SERVICE NAME
c.drawString(100, 1, stringn1)
c.drawString(100, 2, stringn2)
c.drawString(100, 3, stringn3)
c.drawString(100, 4, stringn4)
c.drawString(100, 5, stringn5)
c.drawString(100, 6, stringn6)
c.drawString(100, 7, stringn7)
c.drawString(100, 9, stringn8)
c.drawString(100, 1111, stringn9)
c.drawString(100, 10, stringn10)
# Bitrep =1111111110
def Print1023():
c.setFont('Deja', 12, leading=None)
# SERVICE NAME
c.drawString(100, 1, stringn1)
c.drawString(100, 2, stringn2)
c.drawString(100, 3, stringn3)
c.drawString(100, 4, stringn4)
c.drawString(100, 5, stringn5)
c.drawString(100, 6, stringn6)
c.drawString(100, 7, stringn7)
c.drawString(100, 9, stringn8)
c.drawString(100, 9, stringn9)
c.drawString(100, 1111, stringn10)
# Bitrep =1111111111
def Print1024():
c.setFont('Deja', 12, leading=None)
# SERVICE NAME
c.drawString(100, 1, stringn1)
c.drawString(100, 2, stringn2)
c.drawString(100, 3, stringn3)
c.drawString(100, 4, stringn4)
c.drawString(100, 5, stringn5)
c.drawString(100, 6, stringn6)
c.drawString(100, 7, stringn7)
c.drawString(100, 9, stringn8)
c.drawString(100, 9, stringn9)
c.drawString(100, 10, stringn10)

但是,我的代码中的逻辑因多个缺失的服务而中断,如下所示:

# Bitrep =1111100101
def Print998():
c.setFont('Deja', 12, leading=None)
# SERVICE NAME
c.drawString(100, 1, stringn1)
c.drawString(100, 2, stringn2)
c.drawString(100, 3, stringn3)
c.drawString(100, 4, stringn4)
c.drawString(100, 5, stringn5)
c.drawString(100, 1111, stringn6)
c.drawString(100, 1111, stringn7)
c.drawString(100, 9, stringn8)
c.drawString(100, 1111, stringn9)
c.drawString(100, 10, stringn10)
# Bitrep =1111100110
def Print999():
c.setFont('Deja', 12, leading=None)
# SERVICE NAME
c.drawString(100, 1, stringn1)
c.drawString(100, 2, stringn2)
c.drawString(100, 3, stringn3)
c.drawString(100, 4, stringn4)
c.drawString(100, 5, stringn5)
c.drawString(100, 1111, stringn6)
c.drawString(100, 1111, stringn7)
c.drawString(100, 9, stringn8)
c.drawString(100, 9, stringn9)
c.drawString(100, 1111, stringn10)

如果有人可以修复此问题,以便文件中所有行的输出看起来像下一位,我会为你投票赞成 **** 大声笑:

def Print999():
c.setFont('Deja', 12, leading=None)
# SERVICE NAME
c.drawString(100, 1, stringn1)
c.drawString(100, 2, stringn2)
c.drawString(100, 3, stringn3)
c.drawString(100, 4, stringn4)
c.drawString(100, 5, stringn5)
c.drawString(100, 1111, stringn6)
c.drawString(100, 1111, stringn7)
c.drawString(100, 6, stringn8)
c.drawString(100, 7, stringn9)
c.drawString(100, 1111, stringn10)

def Print764():
c.setFont('Deja', 12, leading=None)
# SERVICE NAME
c.drawString(100, 1, stringn1)
c.drawString(100, 2, stringn2)
c.drawString(100, 1111, stringn3)
c.drawString(100, 3, stringn4)
c.drawString(100, 4, stringn5)
c.drawString(100, 1111, stringn6)
c.drawString(100, 1111, stringn7)
c.drawString(100, 5, stringn8)
c.drawString(100, 6, stringn9)
c.drawString(100, 1111, stringn10)

和往常一样,如果你写到我的帖子的结尾,我会印象深刻,哈哈。感谢任何为此付出哪怕一丁点努力的人,感谢所有帮助我走到这一步的人。

4

1 回答 1

0

不想让你的努力泄气,但人们一直在告诉你你做错了是有原因的:)

Reportlab 允许您使用编程工具来创建动态 PDF 文档,这意味着布局会随着内容的变化而变化。当您期望各种不同的内容时,尝试对每一行的位置进行硬编码将很快变得笨拙/不可能并且很容易中断。

让自己轻松一点,改用循环。作为一个最简单的例子,这里有一些基本页面列表的代码......

from reportlab.lib.units import cm 

# get the data selection first
my_services_list = [1,3,6]  # or my_dict, e.g. services {'1': 'message1', etc}

# set the cursor starting position
pos_X, pos_Y = 5, 15

for service in my_services_list:
    c.drawString(pos_X*cm, pos_Y*cm, service)
    # move the cursor down a line - remember that zero is the page bottom
    pos_Y -= 1

就是这样,没有空行。.drawString将适用于更简单的页面。如果您需要更全面的方法,请阅读有关 Frames 和 Flowables 的文档。如果需要,您可以将文本排列到文本框中,就像使用桌面排版软件一样。

于 2017-12-21T06:00:28.913 回答