파이썬은 TXT에서 PDF 파일을 만들 --reportlab

사용하여 PDF 파일을 만들 Reportlab
일반적으로 TXT 형식 전자 책됩니다, 일부 전자 독자는 DPT-RP1로 TXT 문서를 읽을 수 없습니다. 따라서,이 종이 사용 파이썬 PDF 파일로 변환 TXT를 달성하고, 빌드 디렉토리를 지원하기 위해합니다 (txt 파일에 각 챕터의 위치를 알아야한다) 연결 클릭을 생성 할 수있는 디렉토리, 중국어를 지원합니다.

reportlab 사용 reportlab은 공식 문서를 볼 수 있습니다. 다음과 같이 TXT는 PDF 상세 코드를 설정 :

# 코딩 : UTF-8

# 글꼴 UTF-8 STS를 설정
수입에 sys
다시로드 (SYS)
sys.setdefaultencoding ( 'UTF-8')

reportlab.pdfbase 수입 pdfmetrics에서
reportlab.pdfbase.ttfonts에서이 TTFont를 가져
reportlab.lib.styles에서 getSampleStyleSheet, ParagraphStyle을 가져
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 (폰트 명 = 'STSONG'이름 = 'STSONG'선도 = 20, 12 = fontSize는, firstLineIndent = 22 = wordWrap을 "CJK"))
styles.add (ParagraphStyle (폰트 명 = 'simhei'이름 = 'simhei'선도 = 25, 14 = fontSize는, 또한 wordWrap = "CJK")) # 콘텐츠 폰트

클래스 MyDocTemplate (BaseDocTemplate) :
데프 __init __ (자기, 파일 이름, ** kw) :
self.allowSplitting = 0
적용 (BaseDocTemplate .__ init__ (자기, 파일 이름), kw)

목차로 # 항목은 수동으로하거나 수행 할 수 있습니다
자동으로 오브젝트 TableOfContents를에 addEntry 메소드를 호출 # 또는
의 afterFlowable 방법에 'TOCEntry'통지를 보내 #
당신이 사용하고있는 중 # DocTemplate. 데이터는 목록입니다 알리기 위해 전달되는
수준 번호, 항목 텍스트, 페이지 countaining 서너 항목 #
# 번호와 항목을 가리켜 야합니다 옵션의 목적지 키.
#이 목록은 일반적으로 같은 문서 템플릿의 방법으로 생성 될
알림 () 메소드를 사용하여 호출 알림을 만드는) # afterFlowable (
적절한 데이터와 #을.

데프 afterFlowable (자기, 유동성이) :
"TOC 항목을 등록합니다."
경우 유동성 .__ 클래스 __.__ name__ == '단락'
텍스트 = flowable.getPlainText ()
스타일 = flowable.style.name
경우 스타일 == '머리글 1'
수준 = 0
ELIF 스타일 == 'simhei'
수준 = 1
다른 사람 :
반환
E = [수준, 텍스트, self.page]
우리는 책갈피 이름이 우리의 통지 데이터에 대한 것을 추가해야 #IF
= getattr 십억원 (유동성, '_ 여기서 BookmarkName', 없음)을
E.append (단위) : 억 없음]도 아니면이
자기를 .notify ( 'TOCEntry', 튜플 (E))


#이 기능은 우리의 제목하게
데프 doHeading (데이터, 텍스트, 우리 군을) :
hashlib 가져 오기 SHA1의에서
#은 여기서 BookmarkName을 만들
= SHA1 (텍스트) .hexdigest () 십억원
# 억 이름의 앵커 포인트 포함 단락 텍스트를 수정
시간을 = 단락 (텍스트 '의 <a name="%s"/>'% BN, 다래끼) +
유동성 #에 저장 북마크 이름은 afterFlowable이 볼 수 있도록
h._bookmarkName = BN
) data.append (H를

페이지 번호 #
DEF 푸터 (캔버스 문서)
PAGE_NUM canvas.getPageNumber = ()
canvas.saveState ()
P = 단락 ( "%의 D"%의 PAGE_NUM,
스타일 [ '정상'])
, H = P.wrap w (의사 .width, doc.bottomMargin)
P.drawOn (캔버스 doc.leftMargin + / 2, H) w
canvas.restoreState ()

# 부하 TXT 파일
데프 loadTxt (txt_path)
오픈 (txt_path, 'R')와 같이 F :
txt_datas 용의 f.readlines = ()
리턴 txt_datas

데프 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를 ()
# 폰트 명 및 설정 내용 fontSize는
toc.levelStyles =
ParagraphStyle (폰트 명 = 'simhei'fontSize는 = 20, = 'TOCHeading1'이름 = leftIndent 20 firstLineIndent = -20, spaceBefore = 10 ,
) = 16 선도
ParagraphStyle (폰트 명 = 'simhei'fontSize는 = 18 = 'TOCHeading2'leftIndent = 40 firstLineIndent = -20, spaceBefore = 5, 선도 = 12) 이름
]
data.append (TOC) # 내용 추가
data.append (페이지 나눔 ()) # 다음 페이지를

NUM = 0
#은 TXT를 추가
txt_datas에 txt_data을 위해 :
txt_data = txt_data.lstrip () # 삭제 왼쪽 공간
의 경우 렌 (txt_data) == 0 : # 텍스트가
계속되지
: 시도
txt_data = txt_data.decode ( "GB2312")
를 제외한를 :
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 (폰트 명 = 'STSong'이름 = 'STSong는'20 상기 fontSize는 = 12이고, firstLineIndent = 22 인 상기 wordWrap 속성 = "CJK")) 선도 =
14, 25 = 선도 styles.add (ParagraphStyle (폰트 명 = 'simhei'이름 = 'simhei를'= fontSize는 상기 wordWrap을 = 'CJK')) # 내용의 글꼴
. 1
2
3.
4.
5.
중국어 폰트 디렉토리 :
toc.levelStyles = [
ParagraphStyle (폰트 명 = 'simhei', 20, firstLineIndent = -20하는 spaceBefore = 10의 fontSize는 = NAME = "TOCHeading1 'leftindent = 20이다
= 16 선도)
ParagraphStyle (폰트 명 ='simhei '18 fontSize는 = 이름은 = 'TOCHeading2'leftindent = 40 firstLineIndent = -20하는 spaceBefore =. 5, 12) = 선행된다
]
. 1
2
. 3
. 4
. 5
위치 카탈로그, 이것은 실제 TXT 문서를 찾아 수정할 수있어서, 필요
하다면 txt_data [0] == U "최초의"와 (txt_data에서 U "장") :
1
중국어 디코딩 된 전통 중국 GB2312이기 때문에, 디코딩 할 수 없기 때문에 예외 처리 방법 사용
은 try :
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