Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中将纯文本转换为PDF_Python_Text_Reportlab - Fatal编程技术网

在Python中将纯文本转换为PDF

在Python中将纯文本转换为PDF,python,text,reportlab,Python,Text,Reportlab,对于我的项目,我从另一个程序获得一个纯文本文件(report.txt)。它都是纯文本格式的。如果你用记事本打开它,它看起来很漂亮(就像一个纯文本文件一样)。当我在Word中打开文件并显示段落时,我看到。。。对于空间,向后的P表示paragraph 我需要将此文件转换为PDF,并添加一些其他PDF页面以制作最终的PDF。所有这些都是在Python中发生的 我无法将report.txt转换为pdf。我有ReportLab,能够读取文件并进行一些更改(如将文本更改为Courier),但间距丢失。当文件

对于我的项目,我从另一个程序获得一个纯文本文件(report.txt)。它都是纯文本格式的。如果你用记事本打开它,它看起来很漂亮(就像一个纯文本文件一样)。当我在Word中打开文件并显示段落时,我看到。。。对于空间,向后的P表示paragraph

我需要将此文件转换为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)
#------------------------------------
#风格
# ------------------------------------
样式表=getSampleStyleSheet()
mystyle=段落样式(name='normal',fontName='Courier',
fontSize=10,
校准=TA_校准,
领先=1.2*12,
父项=样式表['Normal'])
#=====================================================================================       
模型报告='report.txt'
#创建用于写入pdf的文档
doc=SimpleDocTemplate(str(pdfPath)\
右边距=40,左边距=40\
上边距=40,下边距=25\
页面大小=A4)
doc.pagesize=纵向(A4)
#“可流动”对象的容器
元素=[]
#打开模型报告
infle=文件(模型报告).read()
报告\段落=填充分割(“\n”)
关于报告中的段落:
para1=“%s”%para
元素。追加(段落(para1,style=mystyle))
文档生成(元素)

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

您是否尝试过仅使用
样式表['Normal']
创建文本?也就是说,如果您通过以下方式获得了正确的外观输出,那么问题就出在您的风格上

Paragraph(para1, style=StyleSheet['Normal'])

我也有类似的问题。我用这个密码解决了:

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()
来自reportlab.lib.pagesizes导入信函
从reportlab.pdfgen导入画布
从reportlab.lib.utils导入ImageReader
从PIL导入图像
# .....
# ..... 一些exta代码对此问题不重要。。。。
# ....
#给你
ptr=open(“tafAlternos.txt”,“r”)#我需要转换的文本文件
lineas=ptr.readlines()
ptr.close()
i=750
numeroLinea=0
当numeroLinea

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

您可以使用
Pdf\u canvas=canvas.canvas('output\u file.Pdf')
创建画布,并使用
Pdf\u canvas.save()
生成Pdf,以便将文本或文本文件转换为Pdf,模块fpdf应使用命令行界面中的pip install 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")

参考资料:

我创建了一个小助手函数,通过使用单间距字体将多行文本转换为“报表外观”中的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')

正常是不起作用的,所以我试着创建我自己的。既然正常应该起作用,我建议你找出它不起作用的原因。从文档中复制粘贴一个示例,如果它仍然不起作用,则说明ReportLab的安装有问题。然后将
report.txt
添加到混音中,如果出现这种情况,请检查您的文件编码——您是否可以使用UTF16而不是ascii?祝你好运。你能编辑一下以显示你是如何创建画布和pdf文件的吗?