【问题标题】:ReportLab Paragraph Formatting Line BreaksReportLab 段落格式换行符
【发布时间】:2018-06-14 14:32:50
【问题描述】:

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

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

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

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

然而,在 PDF 中它看起来像:

与流行的看法相反,Lorem Ipsum 不仅仅是随机文本。它 起源于公元前 45 年的一部古典拉丁文学作品,使 它已有 2000 多年的历史。理查德麦克林托克,拉丁语教授 弗吉尼亚州的汉普登-悉尼学院,查找了其中一所比较不起眼的 来自 Lorem Ipsum 段落的拉丁词 consectetur 通过在古典文学中对这个词的引用,发现了 毫无疑问的来源。 Lorem Ipsum 来自第 1.10.32 节和 西塞罗的“de Finibus Bonorum et Malorum”(善与恶的极端)1.10.33,写于公元前 45 年。这本书是一篇关于 伦理学理论,在文艺复兴时期非常流行。第一行 Lorem Ipsum 的“Lorem ipsum dolor sit amet..”来自于 第 1.10.32 节。与流行的看法相反,Lorem Ipsum 并不简单 随机文本。它起源于一部古典拉丁文学作品 从公元前 45 年开始,至今已有 2000 多年的历史。理查德·麦克林托克,拉丁人 弗吉尼亚州汉普顿-悉尼学院的教授,查找了其中一个 来自 Lorem Ipsum 段落的更晦涩的拉丁词 consectetur,以及 浏览古典文学中对这个词的引用, 发现了不容置疑的来源。 Lorem Ipsum 来自部分 西塞罗写于公元前 45 年的“de Finibus Bonorum et Malorum”(善与恶的极端)的 1.10.32 和 1.10.33。这本书是一本专着 关于伦理学的理论,在文艺复兴时期非常流行。这 Lorem Ipsum 的第一行,“Lorem ipsum dolor sit amet..”,来自 1.10.32 节中的一行。

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

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

这是脚本中的 ReportLab 代码 sn-p。 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()))

感谢您的帮助!

【问题讨论】:

    标签: python python-3.x python-2.7 pdf reportlab


    【解决方案1】:

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

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

    希望这可以帮助遇到同样问题的人

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 2019-08-27
      • 2011-04-18
      • 1970-01-01
      • 2011-05-15
      相关资源
      最近更新 更多