我无法绕过这个问题? PDF 文档 生成问题.

33 views
Skip to first unread message

lees...@gmail.com

unread,
Apr 27, 2006, 9:37:36 AM4/27/06
to CZUG-Zope技术讨论
我无法绕过这个问题? PDF 文档 生成问题. 各位 应 看到
我多次 发贴 请教. 但都无结果. 现在 又只好再次询问.

我已做到 能 通过 REPORTLAB 结合 SIMSUN.TTF 字体 生成
简单的 中文文档..
现在的问题是 通过 ZOPE 添加 一个 外部方法 如何
返回 这个 中文PDF 文档.

请有经验的 先生 赐教!!!
不胜感谢!!!

lees...@gmail.com

unread,
May 2, 2006, 9:44:27 PM5/2/06
to CZUG-Zope技术讨论
现在的问题是如何把取得的 ZSQL METHOD 的数据 返回给
外部方法的 变量?

是否 要用到 cStringIO.StringIO ,请给一点指教!

周海文\(Haiwen\)

unread,
May 2, 2006, 10:33:30 PM5/2/06
to czug...@googlegroups.com
有两种方法:
 
 
第一种:
在zope里添加一个 External Method 指向一个Python脚本,然后用Python脚本生成PDF文件,存储在磁盘上,在Python最后重定向到那个磁盘文件(不过,你需要在ZOPE里安装 LocalFS 或者 ExternalFile产品,以便ZOPE能直接将磁盘文件对外发布)。
当然,这种方法也可直接将生成的PDF添加到ZOPE, 用以下语句将PDF加到ZODB里,但对于生成很多PDF文件,不建议这样,因为ZODB会增长很快。
self.manage_addFile(id = filename, file = content, title = "A sample PDF document produced with ReportLab", precondition = '', content_type = "application/pdf")
 
第二种:
同第一种,区别就是用ReportLab生成的PDF不存盘,也不存到ZODB, 而是直接在内存里,然后在Python脚本最后,加上
        self.REQUEST.RESPONSE.setHeader('Content-Type', 'application/pdf')
        self.REQUEST.RESPONSE.setHeader('Content-Disposition', 'attachment; filename=%s' % filename)
具体请参见附件。
 
说明:我使用的是第一种里的存在磁盘上。
注意:须将reportlab安装到 C:\Program Files\Zope-2.7.0\bin\reportlab,这样zope里的python环境可以直接调用reportlab
rlzope.py

lees...@gmail.com

unread,
May 2, 2006, 11:20:28 PM5/2/06
to CZUG-Zope技术讨论
谢谢指教!

我也是 模仿 RLZOPE.PY 已经实现了返回 中文 及
表格的问题.
现在 我要 把 ZSQL 的 结果 返回给 外部 方法的 DATA
变量 , 以便通过 表格 显示.

测试了一下 如下外部方法代码:

#coding=utf-8
#/usr/bin/python

import cStringIO

def getdata(self):
data=cStringIO.StringIO(self.test_sql())
return data.getvalue()

得到如下错误:

Site error

This site encountered an error trying to fulfill your request. The
errors were:

Error Type
TypeError
Error Value
expected read buffer, instance found

作不下去了!!!
遍查PYTHON LIB 也没有头绪!

谢谢指点!!!
祝五一快乐!!!

周海文\(Haiwen\)

unread,
May 2, 2006, 11:45:05 PM5/2/06
to czug...@googlegroups.com
直接在Extenal Method 中调用ZSQL, 这样更直接一些,下面的 SQL_get_user_list 就是一个ZSQL方法的id, temps就是ZSQL从数据库查出的结果。

def writeuserlist(self):
temps=self.SQL_get_user_list()
if len(temps)==0:return ''
userNameList=[]
for n in range(len(temps)):
userNameList.append(temps[n].username)
print userNameList


----- Original Message -----
From: <lees...@gmail.com>
To: "CZUG-Zope技术讨论" <czug...@googlegroups.com>

lees...@gmail.com

unread,
May 3, 2006, 12:38:22 AM5/3/06
to CZUG-Zope技术讨论
谢谢!
已测试成功你的代码.
正在加入 RLZOPE中. 祝节日快乐.

lees...@gmail.com

unread,
May 3, 2006, 1:19:37 AM5/3/06
to CZUG-Zope技术讨论
基础没学好.

二维数组 如何 构建.? 从 ZSQL 返回的 结果 构造成
一个二维数组.

lees...@gmail.com

unread,
May 3, 2006, 2:00:42 AM5/3/06
to CZUG-Zope技术讨论
已完成 从 ZSQL 中 取出数据 传入 外部方法,并生成 PDF
文件 ,返回给 BROWSER, 但是 设了字体后,网格
容不下文字.

STYLE 如下:

self.t=Table(self.data,style=[

('TEXTCOLOR',(0,0),(-1,-1),colors.blue),

('FONTNAME',(0,0),(-1,-1),'song'),

('FONTSIZE',(0,0),(-1,-1),20),

('GRID',(0,0),(-1,-1),1,colors.red),
])

如何处理?

周海文\(Haiwen\)

unread,
May 3, 2006, 3:54:22 AM5/3/06
to czug...@googlegroups.com
这个比较麻烦,英文是可以自动换行的,中文的话,要你自己处理,将超出的部分截下来,放在第二行相应的位置:例如:

ID NAME ADDR
001 互敬涛 中国北京朝阳区安定门外
小营路11号
002 刘涛 江苏省钱家大院
003 刘仁 江苏省钱家大院


----- Original Message -----
From: <lees...@gmail.com>
To: "CZUG-Zope技术讨论" <czug...@googlegroups.com>
Sent: Wednesday, May 03, 2006 2:00 PM
Subject: [czug-zope] Re: 我无法绕过这个问题? PDF 文档 生成问题.


lees...@gmail.com

unread,
May 3, 2006, 4:10:31 AM5/3/06
to CZUG-Zope技术讨论
谢谢你的回答!!!

我的 数据 有中文 英文 和 数字 字数并不多.
不设字体大小时 网格 是 恰好 包围 了 文字. 一设
FONTSIZE 就不行了.
谢谢你的回答?能不能 看看 截图? 请检查 邮箱!!!

lees...@gmail.com

unread,
May 3, 2006, 4:14:37 AM5/3/06
to CZUG-Zope技术讨论
在此论坛上 你是如何添加附件的? 找不到 添加 的
按钮!!!

周海文\(Haiwen\)

unread,
May 3, 2006, 5:03:54 AM5/3/06
to czug...@googlegroups.com
这个比较麻烦,英文是可以自动换行的,中文的话,要你自己处理,将超出的部分截下来,放在第二行相应的位置:例如:

ID NAME ADDR
001 互敬涛 中国北京朝阳区安定门外
小营路11号
002 刘涛 江苏省钱家大院
003 刘仁 江苏省钱家大院

你需要在Python里将从数据库选出的数据整形,就是说将含有太长数据的字段,像上面一样将文字截成两行甚至多行(整形后的二维LIST的长度会增加), 然后传给reportlab


----- Original Message -----
From: <lees...@gmail.com>
To: "CZUG-Zope技术讨论" <czug...@googlegroups.com>
Sent: Wednesday, May 03, 2006 4:10 PM
Subject: [czug-zope] Re: 我无法绕过这个问题? PDF 文档 生成问题.


lees...@gmail.com

unread,
May 3, 2006, 9:49:34 AM5/3/06
to CZUG-Zope技术讨论
谢谢你的回答!!!
我观察 GRID 的行高 好象是 设定好了的. 只要FONTSIZE>14
,不管英文还是 中文 或者是数字.都会 超过 GRID.

我还没有作到 中文换行的时候.

非常感谢你的指点!!!

lees...@gmail.com

unread,
May 3, 2006, 11:14:41 PM5/3/06
to CZUG-Zope技术讨论
网格的高度没随内容增高而加高,宽度随内容增加而变宽.必须在设表格时
,指定 表格的高度.
不知道原因何在?

lees...@gmail.com

unread,
May 4, 2006, 5:35:28 AM5/4/06
to CZUG-Zope技术讨论
对于 RLZOPE.PY 能不能 旋转90度
,成为横向打印.以便适应宽行报表.

该在那儿 设置 ROTATE(90)

lees...@gmail.com

unread,
May 4, 2006, 9:59:40 AM5/4/06
to CZUG-Zope技术讨论
TableStyle 中 SPAN 指令 不起作用!!!
作成一件事真难!!

lees...@gmail.com

unread,
May 4, 2006, 11:37:27 PM5/4/06
to CZUG-Zope技术讨论
又出现了中文输入问题,

环境EBIAN TESTING
lee@debian:~/pythonu$ locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
中文输入法: FCITX

编辑文件 ,其中要输入中文,但是 文件 UTF-8 编码. 一旦
输入中文保存时 VI 提示 :
编码转换错误只有强制保存.此时文件 的汉字
就是错误的. 无论在 程序中加入
UNICODE(SELF.VAR,'GBK').ENCODE('UTF-8') 都 不行 . 提示 GBK
不认识 POSITION 2-3 . 字符.

lees...@gmail.com

unread,
May 6, 2006, 1:59:45 AM5/6/06
to CZUG-Zope技术讨论
报表横向打印 适合宽行的问题 请问如何解决?

lees...@gmail.com

unread,
May 7, 2006, 12:44:44 AM5/7/06
to CZUG-Zope技术讨论
海文兄,能否指点一下 A4 幅面 报表横向
打印的例子.一直找不到 setPageRotation(90) 或 者 rotate(90)
的恰当用法.

lees...@gmail.com

unread,
May 7, 2006, 4:22:55 AM5/7/06
to CZUG-Zope技术讨论
请大家帮忙检查 如下代码, 为什么 FRAME 不能 旋转
90度,谢谢!!!
#!/usr/bin/python
# -*- coding: utf-8 -*-

from reportlab.platypus import PageTemplate, BaseDocTemplate,
Paragraph, Spacer,Table,Frame,PageBreak
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.rl_config import defaultPageSize
from reportlab.lib.units import inch
from reportlab.lib import colors
from reportlab.pdfgen.canvas import Canvas
import reportlab.rl_config

class MyPageTemplate(PageTemplate) :
"""Our own page template."""
def __init__(self) :
content = Frame(1*inch, 4*inch, 5* inch, 4*inch,showBoundary=1)
PageTemplate.__init__(self, "MyTemplate", [content])

def beforeDrawPage(self, canvas, doc) :
"""Draws a page message on each page."""
canvas.saveState()
canvas.setPageRotation(90)
canvas.rotate(90)
canvas.drawString(4*inch, -7 * inch, "page %d"%doc.page)
canvas.restoreState()


def go():
doc = BaseDocTemplate("hello.pdf",showBoundary=1)

doc.addPageTemplates(MyPageTemplate())

Story = []

styles=getSampleStyleSheet()
normalStyle=styles['Normal']

bogustext=("here is paragraph show %s")*60
p = Paragraph(bogustext, normalStyle)
Story.append(p)

doc.build(Story)


if __name__=="__main__":
go()

周海文\(Haiwen\)

unread,
May 7, 2006, 11:13:29 AM5/7/06
to czug...@googlegroups.com
不是rotate, 应该是:

from reportlab.lib.units import inch,cm
self.canv.setPageSize((29.7*cm,21*cm))

设置画布的大小,上面那个尺寸,就是 A4横向, 设置成什么尺寸(例如A3,B2)都可以


----- Original Message -----
From: <lees...@gmail.com>
To: "CZUG-Zope技术讨论" <czug...@googlegroups.com>
Sent: Sunday, May 07, 2006 12:44 PM
Subject: [czug-zope] Re: 我无法绕过这个问题? PDF 文档 生成问题.


lees...@gmail.com

unread,
May 7, 2006, 9:20:49 PM5/7/06
to CZUG-Zope技术讨论
我修改了代码试了一试, 好象不行. 生成的文件都时
纵向 排版.并没有 横向 .

谢谢你的指点.

另外一个代码就可以实现 横向 排版. 不过没有调用
BaseDocTemplate, 调用 BaseDocTemplate 可以实现更好的功能.
我还是想 实现 BaseDocTemplate 的横向 排版功能.

#!/usr/bin/python

from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch
from reportlab.platypus import Paragraph,Frame,Table
from reportlab.lib import colors

styles=getSampleStyleSheet()
styleN=styles['Normal']
styleH=styles['Heading1']

story=[]

story.append(Paragraph("this is a Heading",styleH))
story.append(Paragraph("this is paragraph",styleN))

data= [['BBBBB','','','',''],
['00', '01', '02', '03', '04'],
['10', '11', '12', '13', '14'],
['20', '21', '22', '23', '24'],
['30', '31', '32', '33', '34'],
['A', 'BBBBB', '', '', ''],
['00', '01', '02', '03', '04'],
['10', '11', '12', '13', '14'],
['20', '21', '22', '23', '24'],
['30', '31', '32', '33', '34'],
['BBBBB','','','',''],
['00', '01', '02', '03', '04'],
['10', '11', '12', '13', '14'],
['20', '21', '22', '23', '24'],
['30', '31', '32', '33', '34']


]

sty = [
('ALIGN',(0,0),(-1,-1),'CENTER'),
('VALIGN',(0,0),(-1,-1),'TOP'),
('GRID',(0,0),(-1,-1),1,colors.green),
('BOX',(0,0),(-1,-1),2,colors.red),


('SPAN',(0,0),(-1,0)),
('ALIGN',(0,0),(-1,0),'RIGHT'),

('BACKGROUND',(1,0),(1,0),colors.khaki),

('SPAN',(0,2),(-1,2)),
('SPAN',(-2,-2),(-1,-1)),
('VALIGN',(-2,-2),(-1,-1),'MIDDLE'),


('BACKGROUND',(0,0),(0,0),colors.cyan),
('LINEBELOW', (0,'splitlast'), (-1,'splitlast'), 1,
colors.white,'butt'),
]

rows=len(data)
t=Table(data,style=sty, colWidths = [50] * 5, rowHeights = [20]*rows)
story.append(t)

c=Canvas("mydoc.pdf")
c.setPageRotation(90)
c.rotate(90)
f=Frame(1.5*inch,-7.5*inch,7*inch,6.5*inch,showBoundary=1)
f.addFromList(story,c)

c.drawString(1*inch,-1*inch,"hello world")
c.save()

lees...@gmail.com

unread,
May 8, 2006, 3:08:33 AM5/8/06
to CZUG-Zope技术讨论
问题解决:

FRAME 的 纵 坐标 是负数, PAGE 的 纵坐标 也是 负数.
canvas.saveState()
canvas.setPageRotation(90)
canvas.rotate(90)
不要canvas.restoreState()

效果就出来了!!!!!

谢谢各位帮忙.

lees...@gmail.com

unread,
May 8, 2006, 11:16:37 PM5/8/06
to CZUG-Zope技术讨论
真是环境的打印问题:生成的PDF 文件在 adob reader 7.0
中,通过打印机打印的字体全部是虚的。
无论数字还是中文。都是虚的。

在 Foxit Reader 中 倒是 符合要求。但是没认设置的格式
比如:表格的宽度,页面的宽度。都没有按照设定打印。

lees...@gmail.com

unread,
May 9, 2006, 1:28:22 AM5/9/06
to CZUG-Zope技术讨论
是不是 Adobe AcrobatReader 不支持 TTF 字体.
在windows平台上 AcrobatReader5.0 中 看不到 文字
,只有表格线.
在 AcrobatReader7.0 中 可以看见 文字及表格 并且 PAGE
旋转了 90度. 但是通过打印机打印出来的文档
文字都是虚的. 根本没体现 SIMSUN的宋体. 好不容易走到
这一步了 又遇见了
这个问题,请有经验的的先生帮邦我解决这个问题?
不胜感谢!!!!
Reply all
Reply to author
Forward
0 new messages