PythonはTXTからPDFファイルを作成--reportlab

使用してPDFファイルを作成するReportLabの
一般TXT形式の電子書籍をしているが、いくつかの電子書籍リーダーは、DPT-RP1としてTXT文書を、読み取ることができません。したがって、この紙の使用のPDFへの変換TXTを達成するためのpython、およびビルドディレクトリをサポートし、ディレクトリは、中国をサポートする、(txtファイル内の各章の位置を知るためにすることを提供する)接続のクリックを生成することができます。

ReportLabの使用ReportLabのは、公式ドキュメントを表示することができます。次のようにTXT、PDF、詳細なコードを回します:

#コーディング:UTF-8

#フォントUTF-8 STSを設定
インポートSYSの
リロード(SYS)
sys.setdefaultencoding( 'UTF-8')

reportlab.pdfbase輸入pdfmetricsから
reportlab.pdfbase.ttfontsからTTFontをインポート
getSampleStyleSheet、ParagraphStyleをインポートreportlab.lib.stylesから
reportlab.platypusインポートBaseDocTemplate、フレームから、PageTemplate、段落
reportlab.platypus.tableofcontentsからはTableOfContentsをインポート
reportlab.platypusインポート改ページから
reportlab.lib.pagesizesからA4をインポート

pdfmetrics.registerFont(TTFont( 'STSONG'、 './STSONG.TTF '))フォント#register
pdfmetrics.registerFont(TTFont(' simhei'、 './simhei.ttf'))フォント#register
スタイル= getSampleStyleSheet()
スタイル.add(ParagraphStyle(たfontName = 'STSONG'、NAME = 'STSONG'、主要= 20、のfontSize = 12、firstLineIndent = 22、wordWrapの= 'CJK'))
styles.add(ParagraphStyle(たfontName = 'simhei'、名前= 'simhei'、主要= 25、のfontSize = 14、wordWrapの= 'CJK'))#コンテンツフォント

クラスMyDocTemplate(BaseDocTemplate):
デフ__init __(自己、ファイル名、**キロワット):
self.allowSplitting = 0
適用されます(BaseDocTemplate .__ init__、(自己、ファイル名)、キロワット)

目次へ#エントリは、のいずれかによって手動で行うことができます
#TableOfContentsにaddEntryメソッドを呼び出すオブジェクトまたは自動
のafterFlowable方法で「TOCEntry」通知を送信することにより、#
を使用している#DocTemplate。通知に渡されるデータは、リストある
レベルの数、エントリテキスト、ページcountaining 3つのまたは4つの項目の#
#番号、エントリが指すべき任意の宛先キー。
#このリストは、通常のようなドキュメントテンプレートの方法で作成されます
通知()メソッドを使用して通知コール作り、#afterFlowable()
該当するデータで#を。

デフafterFlowable(自己流動性は):
「TOCエントリを登録します。」
もし、流動性.__クラス__.__ name__ == '段落':
テキスト= flowable.getPlainText()
スタイル= flowable.style.name
かのスタイル== '見出し1':
レベル= 0
のelifスタイル== 'simhei':
レベル= 1
他:
返す
Eは= [レベル、テキスト、self.page]
我々は、ブックマーク名を持っているの#if我々のデータを通知することを追加
= GETATTR(フロアブル、 '_ bookmarkName'、なし)bnを
E.append(BN):BNがNoneでない場合は
、自己に.notify( 'TOCEntry'、タプル(E))


#この機能は、当社の見出しになり
ます:def(データ、テキスト、STY)をdoHeading
hashlib輸入のSHA1から
#がbookmarknameを作成
bnを= SHA1(テキスト).hexdigest()
は、bnを名前でアンカーポイントを含めるように段落テキストを変更し
、H =段落(テキスト+ 'の<a name="%s"/>' %BN、STY)
ストア流動性にブックマーク名afterFlowableこの見ることができるように
h._bookmarkNameは= BN
data.append(H)

#ページ番号
DEFフッタ(キャンバス、DOC):
PAGE_NUM = canvas.getPageNumber()
canvas.saveState()
P =パラグラフ( "%d個の" %PAGE_NUM、
スタイル[ '通常'])
、H = P.wrap W(DOC .width、doc.bottomMargin)
P.drawOn(キャンバス、doc.leftMargin + / 2、H)W
canvas.restoreState()

#負荷txtファイル
loadTxt(txt_path)DEF:
:Fとして(txt_path、 'R')オープンと
txt_datas = f.readlines()
戻りtxt_datas

DEF toPDF(txt_datas、pdf_path):
PDF = MyDocTemplate(pdf_path、ページサイズ= A4)
フレーム=フレーム(PDF.leftMargin、PDF.bottomMargin、PDF.width、PDF.height、
ID = '正常')
テンプレート= PageTemplate(フレーム=フレームたOnPage =フッタ)
PDF.addPageTemplates([テンプレート])

データ= []

コンテンツの#テーブル
TOC = TableOfContents()
設定内容たfontNameとのfontSize
toc.levelStyles = [
ParagraphStyle(たfontName = 'simhei'のfontSize = 20、= 'TOCHeading1'名前、leftIndent = 20、firstLineIndent = -20、spaceBefore = 10 、
主要= 16)、
ParagraphStyle(たfontName = 'simhei'、= 18のfontSize、NAME = 'TOCHeading2'、leftIndent = 40、firstLineIndent = -20、spaceBefore = 5、主要= 12)
]
data.append(TOC)#内容追加
data.append(改ページ())#nextページを

NUM = 0
#はTXT追加
txt_datasでtxt_dataのために:
txt_data = txt_data.lstrip()#削除残された空間を
(txt_data)== 0 lenの場合:#何のテキスト
いきません
試してみてください。
txt_data = txt_data.decode( "2312")
を除い:
txt_data = txt_data.decode( "GBK")

もしtxt_data [0] == uの"第"と(txt_dataでuが"章"):
doHeading(データ、txt_data、スタイル[ 'simhei'])
他:
data.append(段落(txt_data、スタイル[ 'STSONG'] ))
NUM = NUM + 1枚の
プリント( '{} line'.format(NUM))

印刷( 'PDFファイルを作成します!')
PDF.multiBuild(データ)

もし__name__ == "__main__":
txt_path = "财运天降の.txt" .decode( "UTF8")
pdf_path = "财运天降.PDF" .decode( "UTF8")
txt_datas = loadTxt(txt_path)
toPDF(txt_datas、 pdf_path)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
コード・ウィンドウとpython2で試験し、メイン注意:

デフォルトのフォント設定:
インポートSYSの
リロード(SYS)
sys.setdefaultencoding( 'UTF-8')
1。
2
3。
中国語フォントのサポート:
pdfmetrics.registerFont(TTFont( 'STSong'、 './STSONG.TTF'))フォント#register
pdfmetrics.registerFontフォント#register(TTFont( 'simhei'、 './simhei.ttf'))
= getSampleStyleSheet(http://www.my516.com)スタイル
styles.add(ParagraphStyle(たfontName = 'STSong'、名前= 'STSong'、= 20リードしている、のfontSize = 12 firstLineIndent = 22は、wordWrapの= 'CJK'である))
(ParagraphStyle(たfontName = 'simhei'をstyles.add、NAME = 'simhei'、主要= 25、14 =のfontSize、wordWrapの= 'CJK'))#コンテンツフォント
。1
2
3。
4。
5。
中国語フォントディレクトリ:
toc.levelStyles = [
ParagraphStyle(たfontName = 'simhei'、20は、firstLineIndent = -20、spaceBefore = 10、のfontSize =、NAME = 'TOCHeading1'、leftindent = 20であり
、= 16をリード)
ParagraphStyle(たfontName = 'simhei'、18のfontSize =、名前は= 'TOCHeading2'、leftindent = 40、firstLineIndent = -20、A spaceBefore = 5、12)=リードして、
]
。1
2
。3
。4
。5
カタログ位置付け、これは実際のTXTの記事を検索するために応じて変更する必要がある
txt_data場合は[0] == U 「最初」と(txt_dataでU「の章では」):
1
、中国は、デコードされた繁体字中国語GB2312であるため、復号することができないので、試してください-以外の方法を使用
してみてください。
txt_data = txt_data.decode(「GB2312」)を
除い:
txt_data = txt_data。 (「GBK」)をデコードする
1
2
3
4
次のような効果がある:
インターネットは容易TXTの記事を発見しました。

PDFカタログを生成します。

PDFが生成コンテンツ:
--------------------- 

おすすめ

転載: www.cnblogs.com/ly570/p/10995942.html