8

对于我的项目,我从另一个程序中获得了一个纯文本文件 (report.txt)。它全部采用纯文本格式。如果您在记事本中打开它,它看起来不错(就像纯文本文件一样)。当我在 Word 中打开文件并显示段落时,我看到 ... 表示空格,而向后的 P 表示段落。

我需要将此文件转换为 PDF 并添加一些其他 PDF 页面来制作最终的 PDF。这一切都发生在 Python 中。

我无法将 report.txt 转换为 pdf。我有 ReportLab,并且能够读取文件并进行一些更改(例如将文本更改为 Courier),但间距会丢失。当文件被读取时,它似乎去除了任何额外的空格。

问题:a) 有没有更简单的方法将 report.txt 转换为 pdf?b)如果没有,有没有办法在我阅读文件时保留我的空间?c)或者我的段落样式中是否缺少一个参数来保持原始外观?

这是我的代码:

# ------------------------------------
# Styles
# ------------------------------------

styleSheet = getSampleStyleSheet()
mystyle = ParagraphStyle(name='normal',fontName='Courier',
                         fontSize=10, 
                         alignment=TA_JUSTIFY, 
                         leading=1.2*12,
                         parent=styleSheet['Normal'])       

#=====================================================================================       
model_report = 'report.txt'

# Create document for writing to pdf  
doc = SimpleDocTemplate(str(pdfPath),  \
                        rightMargin=40, leftMargin=40, \
                        topMargin=40, bottomMargin=25, \
                        pageSize=A4)
doc.pagesize = portrait(A4)

# Container for 'Flowable' objects
elements = []    

# Open the model report
infile   = file(model_report).read()
report_paragraphs = infile.split("\n")

for para in report_paragraphs:  
    para1 = '<font face="Courier" >%s</font>' % para 
    elements.append(Paragraph(para1, style=mystyle))
doc.build(elements)
4

5 回答 5

3

我创建了一个小型辅助函数,通过使用等宽字体将多行文本转换为“报告外观”的 PDF 文件。太长的行在空格处换行,以使其适合页面宽度:

import textwrap
from fpdf import FPDF

def text_to_pdf(text, filename):
    a4_width_mm = 210
    pt_to_mm = 0.35
    fontsize_pt = 10
    fontsize_mm = fontsize_pt * pt_to_mm
    margin_bottom_mm = 10
    character_width_mm = 7 * pt_to_mm
    width_text = a4_width_mm / character_width_mm

    pdf = FPDF(orientation='P', unit='mm', format='A4')
    pdf.set_auto_page_break(True, margin=margin_bottom_mm)
    pdf.add_page()
    pdf.set_font(family='Courier', size=fontsize_pt)
    splitted = text.split('\n')

    for line in splitted:
        lines = textwrap.wrap(line, width_text)

        if len(lines) == 0:
            pdf.ln()

        for wrap in lines:
            pdf.cell(0, fontsize_mm, wrap, ln=1)

    pdf.output(filename, 'F')

这是您将如何使用此函数将文本文件转换为 PDF 文件的方法:

input_filename = 'test.txt'
output_filename = 'output.pdf'
file = open(input_filename)
text = file.read()
file.close()
text_to_pdf(text, output_filename)
于 2020-11-17T14:25:19.527 回答
2

ReportLab 是通常的建议——您可以从本页右侧的“相关”问题中看到。

您是否尝试过使用 just 创建文本StyleSheet['Normal']?即,如果您通过以下内容获得外观正确的输出,则问题出在您的风格上。

Paragraph(para1, style=StyleSheet['Normal'])
于 2012-04-12T16:47:03.240 回答
2

要将文本或文本文件转换为 pdf,应在命令行界面中使用pip install fpdf安装模块 fpdf 。运行以下代码,您将在文件夹中找到 pdf 文件-

from fpdf import FPDF 
pdf = FPDF()      
# Add a page 
pdf.add_page()  
# set style and size of font  
# that you want in the pdf 
pdf.set_font("Arial", size = 15)
# open the text file in read mode 
f = open("path where text file is stored\\File_name.txt", "r") 
# insert the texts in pdf 
for x in f: 
    pdf.cell(50,5, txt = x, ln = 1, align = 'C') 
# save the pdf with name .pdf 
pdf.output("path where you want to store pdf file\\File_name.pdf")

参考:https ://www.geeksforgeeks.org/convert-text-and-text-file-to-pdf-using-python/

于 2020-07-14T14:43:06.340 回答
0

您可以使用创建画布pdf_canvas = canvas.Canvas('output_file.pdf')并使用pdf_canvas.save().

于 2020-06-12T21:22:02.927 回答
0

我有类似的问题。我用这段代码解决了:

from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from reportlab.lib.utils import ImageReader
from PIL import Image

# .....
# ..... some exta code unimportant for this issue....
# ....


# here it is
ptr = open("tafAlternos.txt", "r")  # text file I need to convert
lineas = ptr.readlines()
ptr.close()
i = 750
numeroLinea = 0

while numeroLinea < len(lineas):
    if numeroLinea - len(lineas) < 60: # I'm gonna write every 60 lines because I need it like that
        i=750
        for linea in lineas[numeroLinea:numeroLinea+60]:      
            canvas.drawString(15, i, linea.strip())
            numeroLinea += 1
            i -= 12
        canvas.showPage()
    else:
        i = 750
        for linea in lineas[numeroLinea:]:
           canvas.drawString(15, i, linea.strip())
           numeroLinea += 1
           i -= 12
        canvas.showPage()

Pdf 看起来与原始文本文件完全相同

于 2016-07-21T20:33:20.043 回答