最近眼睛不好,想着少看着点手机,于是将闲置吃灰好多年的kindle4拿出来,这个电纸书是kindle是淘宝上买的,美版,在阅读TXT时碰到很多问题,多次前后翻页后页码会乱,有时文本里有非法字符,会直接崩溃退出,体验感不好,于是想着将TXT文本转为PDF。
一、思路
不用python的话,TXT转文本最方便的就是使用WPS,免费且够用,也就是用WPS打开文本文件,然后另存为PDF格式就行。所以,这里就用python自动执行这个过程,而且加上批量功能,将一个文件夹中的TXT文本全转为PDF。为方便起见,将这个过程分割为多个过程:列出文件夹所有TXT文件、得到TXT文件编码、读入DOC文档并排版保存、将DOC文档转换为PDF。
二、代码
import os
import datetime
from docx import Document
from docx.shared import Cm
from win32com import client
import codecs
import chardet
def Txt2Doc(txtFile,docFile,txtencoding): #文本转DOC函数
if txtencoding == "GB2312":
txtencoding = "GB18030" #GB2312字库比较小,网上下载的GB2312文本经常有其他编码中文,所以用GB18030打开,出错会少一点。
document = Document()
ms = open(txtFile,"r",encoding=txtencoding,errors = 'ignore') #指定编码打开,出错时选择忽略错误
for line in ms.readlines(): #读入所有行
paragraph = document.add_paragraph(line) #写入DOC文档
sections = document.sections #得到文档中的section,进行页面设置
margin = 0.5 #上下左右边距都设为0.5cm
for section in sections:
section.top_margin = Cm(margin)
section.bottom_margin = Cm(margin)
section.left_margin = Cm(margin)
section.right_margin = Cm(margin)
section.page_width = Cm(8) #6寸kindle屏幕宽8cm,长10cm
section.page_height = Cm(10)
document.save(docFile) #保存为DOC文档
def doc2pdf(docFile,pdfFile): #doc转存为PDF
word = client.Dispatch("Kwps.Application") # 打开wps应用程序
doc = word.Documents.Open(docFile) # 打开docx文件
doc.SaveAs(pdfFile, 17) # 另存为后缀为".pdf"的文件,其中参数17表示为pdf
doc.Close() # 关闭原来word文件
word.Quit()# 退出WPS
def detectCode(path):#检测文件编码,path为全路径文件名,返回编码类型
with open(path, 'rb') as file:
data = file.read(2000) # 最多2000个字符
dicts = chardet.detect(data)
return dicts
if __name__ == '__main__':#主程序
path = 'D:\\Temp'#也可以用argv[1]取代D:\\Temp
print(datetime.datetime.now())#打印程序开始时间
for file_name in os.listdir(path):#列出所有文件
if os.path.isdir(path + "\\" + file_path):#跳过子文件夹
continue
filename, file_type = os.path.splitext(file_path)#分割文件名及后缀
if file_type == '.txt':#对TXT文件处理
dicts = detectCode(path + "\\" + file_path)#检测文件编码
try:
Txt2Doc(path + "\\" + file_path, path + "\\" + filename + ".docx",dicts['encoding'])#TXT转为DOC
doc2pdf(path + "\\" + filename + ".docx", path + "\\" + filename + ".pdf")#DOC转PDF
except Exception as e:#exception处理
print(e)
break
print(datetime.datetime.now())#显示完成时间
三、不足
本程序能满足一些TXT文本转PDF的需求,但存在比较多不足:
1、正如程序中加的两个显示时间,使用win32com调用WPS的最大问题是慢,我转换100个文件的时间大约有2个小时,少量文件转换是可以的,文件量一大就够呛。
2、win32com调用WPS还有个问题,就是无法处理较大文件,几MB的文件就无法处理了,程序经常会处于无响应状态。
3、从网上下载的TXT文本有时会有一些乱码,文件读入时会出错,需要优化,增加文件内容编码转换。
4、Win32com只能在windows平台使用,linux平台需采用其他方法。