报表实验室段落格式换行符



我是ReportLab的新手,我正在创建一个简单的文档,员工在其中将文本输入到网站上的文本区域中,将其保存到数据库中,然后从数据库中提取以通过ReportLab创建PDF。我看到的问题是,如果用户输入的文本在 2 个段落之间包含换行符,则在创建 PDF 时不会使用该换行符。

当我通过相同的 Python 脚本将数据库中的文本内容直接打印到屏幕上时,一切都是正确的:

与普遍的看法相反,Lorem Ipsum不仅仅是随机文本。它 源于公元前45年的一部古典拉丁文学,使 它已有2000多年的历史。理查德·麦克林托克(Richard McClintock),拉丁语教授 弗吉尼亚州的汉普登-悉尼学院,查了一本比较晦涩难懂的学院 拉丁词,相音,来自Lorem Ipsum段落,然后去 通过古典文学中对这个词的引用,发现了 毫无疑问的来源。Lorem Ipsum 来自第 1.10.32 节和 1.10.33 西塞罗写于公元前 45 年的"善恶的极端"(善恶的极端)。本书是关于 伦理学理论,在文艺复兴时期非常流行。第一行 Lorem Ipsum,"Lorem ipsum dolor sit amet..",来自一行 第 1.10.32 节.

与普遍的看法相反,Lorem Ipsum不仅仅是随机文本。它 源于公元前45年的一部古典拉丁文学,使 它已有2000多年的历史。理查德·麦克林托克(Richard McClintock),拉丁语教授 弗吉尼亚州的汉普登-悉尼学院,查了一本比较晦涩难懂的学院 拉丁词,相音,来自Lorem Ipsum段落,然后去 通过古典文学中对这个词的引用,发现了 毫无疑问的来源。Lorem Ipsum 来自第 1.10.32 节和 1.10.33 西塞罗写于公元前 45 年的"善恶的极端"(善恶的极端)。本书是关于 伦理学理论,在文艺复兴时期非常流行。第一行 Lorem Ipsum,"Lorem ipsum dolor sit amet..",来自一行 第 1.10.32 节.

但是,在 PDF 中,它看起来像:

与普遍的看法相反,Lorem Ipsum不仅仅是随机文本。它 源于公元前45年的一部古典拉丁文学,使 它已有2000多年的历史。理查德·麦克林托克(Richard McClintock),拉丁语教授 弗吉尼亚州的汉普登-悉尼学院,查了一本比较晦涩难懂的学院 拉丁词,相音,来自Lorem Ipsum段落,然后去 通过古典文学中对这个词的引用,发现了 毫无疑问的来源。Lorem Ipsum 来自第 1.10.32 节和 1.10.33 西塞罗写于公元前 45 年的"善恶的极端"(善恶的极端)。本书是关于 伦理学理论,在文艺复兴时期非常流行。第一行 Lorem Ipsum,"Lorem ipsum dolor sit amet..",来自一行 第 1.10.32 节.与流行的看法相反,Lorem Ipsum 不仅仅是 随机文本。它起源于一部古典拉丁文学 从公元前45年开始,已有2000多年的历史。理查德·麦克林托克,拉丁人 弗吉尼亚州汉普登-悉尼学院教授,查找了其中一位 更晦涩的拉丁词,consectetur,来自Lorem Ipsum段落,以及 通过古典文学中这个词的引用, 发现了毋庸置疑的来源。Lorem Ipsum来自部分 1.10.32和1.10.33,西塞罗写于公元前45年的"善恶的极端"。本书是一本专著 关于伦理学理论,在文艺复兴时期非常流行。这 Lorem Ipsum的第一行,"Lorem ipsum dolor sit amet..",来自 第 1.10.32 节中的一行。

起初我认为这是数据库中的文本格式问题,但是在我能够在PDF创建之前正确打印出内容之后,我知道这不是问题所在。

我是否缺少段落的简单样式输入?我有点迷茫,因为我还不知道ReportLab的所有来龙去脉。

下面是脚本中的 ReportLab 代码片段。employeeQuestion1是在创建 PDF 之前以正确的格式打印出来的内容。

def stylesheet():
styles= {
'default': ParagraphStyle(
'default',
fontName='SourceSansPro-Bold',
fontSize=10,
leading=12,
leftIndent=0,
rightIndent=0,
firstLineIndent=0,
alignment=TA_LEFT,
spaceBefore=0,
spaceAfter=0,
bulletFontName='Times-Roman',
bulletFontSize=10,
bulletIndent=0,
textColor= black,
backColor=None,
wordWrap=None,
borderWidth= 0,
borderPadding= 0,
borderColor= None,
borderRadius= None,
allowWidows= 1,
allowOrphans= 0,
textTransform=None,
endDots=None,         
splitLongWords=1,
),
}
styles['employee_response'] = ParagraphStyle(
'employee_response',
parent=styles['default'],
fontName='SourceSansPro-Regular',
fontSize=10,
spaceAfter=10,
leftIndent=20
)
return styles
def build_flowables(stylesheet):
return [
Paragraph('{0}'.format(employeeQuestion1), stylesheet['employee_response']),
]
def build_pdf(filename, flowables):
doc = SimpleDocTemplate(filename, 
rightMargin=inch/2,
leftMargin=inch/2,
topMargin=inch/2,
bottomMargin=inch/2,
pagesize=letter,
)
doc.addPageTemplates(
[
PageTemplate(
frames=[
Frame(
doc.leftMargin,
doc.bottomMargin,
doc.width,
doc.height,
id=None
),
]
),
]
)
doc.build(flowables)
build_pdf('/etc/review_app/reviews/{0}.pdf'.format(pdfFileName), build_flowables(stylesheet()))

感谢您的帮助!

我通过将新行转换为<br />标签来解决此问题:

str(employeeQuestion1).replace('n','<br />n')

希望这对有相同问题的人有所帮助

最新更新