最近眼睛不好,想着少看着点手机,于是将闲置吃灰好多年的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平台需采用其他方法。