Python ReportLab段落格式换行符

Python ReportLab段落格式换行符,python,python-3.x,python-2.7,pdf,reportlab,Python,Python 3.x,Python 2.7,Pdf,Reportlab,我是ReportLab的新手,我正在创建一个简单的文档,员工将文本输入网站上的文本区域,保存到数据库中,然后通过ReportLab从数据库中提取文本以创建PDF。我所看到的问题是,如果用户输入的文本包含两段之间的换行符,则在创建PDF时不会考虑该换行符 当我通过相同的Python脚本将DB中的文本内容直接打印到屏幕上时,一切都是正确的: 与流行的观点相反,Lorem Ipsum不是简单的随机文本。信息技术 源于公元前45年的一篇古典拉丁文学作品 它有2000多年的历史了。理查德·麦克林托克,哈佛

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

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

与流行的观点相反,Lorem Ipsum不是简单的随机文本。信息技术 源于公元前45年的一篇古典拉丁文学作品 它有2000多年的历史了。理查德·麦克林托克,哈佛大学拉丁语教授 弗吉尼亚州的汉普登悉尼学院(Hampden Sydney College)是一所比较默默无闻的学院 拉丁语单词,concertetur,来自Lorem Ipsum一段,和going 通过对古典文学中该词的引用,发现了 毫无疑问的来源。Lorem Ipsum来自第1.10.32节和 西塞罗于公元前45年所著《德菲尼布斯·博诺鲁姆和马洛鲁姆》(善与恶的极端)的第1.10.33节。这本书是一篇关于这个问题的论文 伦理学理论,在文艺复兴时期非常流行。第一行 关于Lorem Ipsum,“Lorem Ipsum dolor sit amet…”来自于 第1.10.32节

与流行的观点相反,Lorem Ipsum不是简单的随机文本。信息技术 源于公元前45年的一篇古典拉丁文学作品 它有2000多年的历史了。理查德·麦克林托克,哈佛大学拉丁语教授 弗吉尼亚州的汉普登悉尼学院(Hampden Sydney College)是一所比较默默无闻的学院 拉丁语单词,concertetur,来自Lorem Ipsum一段,和going 通过对古典文学中该词的引用,发现了 毫无疑问的来源。Lorem Ipsum来自第1.10.32节和 西塞罗于公元前45年所著《德菲尼布斯·博诺鲁姆和马洛鲁姆》(善与恶的极端)的第1.10.33节。这本书是一篇关于这个问题的论文 伦理学理论,在文艺复兴时期非常流行。第一行 关于Lorem Ipsum,“Lorem Ipsum dolor sit amet…”来自于 第1.10.32节

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

与流行的观点相反,Lorem Ipsum不是简单的随机文本。信息技术 源于公元前45年的一篇古典拉丁文学作品 它有2000多年的历史了。理查德·麦克林托克,哈佛大学拉丁语教授 弗吉尼亚州的汉普登悉尼学院(Hampden Sydney College)是一所比较默默无闻的学院 拉丁语单词,concertetur,来自Lorem Ipsum一段,和going 通过对古典文学中该词的引用,发现了 毫无疑问的来源。Lorem Ipsum来自第1.10.32节和 西塞罗于公元前45年所著《德菲尼布斯·博诺鲁姆和马洛鲁姆》(善与恶的极端)的第1.10.33节。这本书是一篇关于这个问题的论文 伦理学理论,在文艺复兴时期非常流行。第一行 关于Lorem Ipsum,“Lorem Ipsum dolor sit amet…”来自于 第1.10.32节。与流行的观点相反,Lorem Ipsum不仅仅是 随机文本。它起源于一篇古典拉丁文学作品 从公元前45年开始,已经有2000多年的历史了。理查德·麦克林托克,拉丁美洲人 弗吉尼亚州汉普登悉尼学院的教授查阅了 更晦涩的拉丁语单词,Concertetur,来自Lorem Ipsum一段,以及 翻阅古典文学中对这个词的引用, 发现了不容置疑的来源。Lorem Ipsum来自于切片 西塞罗于公元前45年所著《德菲尼布斯·博诺鲁姆和马洛鲁姆》(善与恶的极端)的1.10.32和1.10.33。这本书是一篇论文 关于伦理学的理论,在文艺复兴时期非常流行。这个 Lorem Ipsum的第一行“Lorem Ipsum dolor sit amet…”来自 第1.10.32节中的一行

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

我是否缺少段落的简单样式输入?我有点迷路了,因为我还不知道ReportLab的所有细节

下面是脚本中的ReportLab代码片段<代码>员工问题1是在创建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()))

谢谢你的帮助

我通过将新行转换为

标记解决了这个问题:

str(employeeQuestion1).replace('\n','<br />\n')
str(员工问题1)。替换('\n','
\n')
希望这对有同样问题的人有所帮助