├── .gitignore ├── CopybookGeneratorApp.iss ├── CopybookGeneratorApp.py ├── CopybookGeneratorDlg.py ├── CopybookGeneratorDlg.wxg ├── README.md ├── app_dist └── copybook_generator_setup_v1.1.exe ├── build_copybook_generator_app.bat ├── msvcp90.dll ├── setup_CopybookGeneratorApp.py ├── snapshots ├── demo.png ├── print1.png └── print2.png ├── 三字经.txt ├── 三字经 ├── 三字经(Kindle).pdf ├── 三字经(中).pdf ├── 三字经(手机).pdf └── 三字经(抄写词语).pdf ├── 千字文.txt ├── 千字文 ├── 千字文(Kindle).pdf ├── 千字文(中).pdf ├── 千字文(大).pdf ├── 千字文(小).pdf ├── 千字文(手机).pdf ├── 千字文(抄写单字).pdf ├── 千字文(抄写词语).pdf ├── 千字文(拼音).pdf └── 千字文(极小).pdf ├── 千字文_繁体.txt ├── 千字文_繁体 └── 千字文_繁体(手机).pdf ├── 弟子规.txt ├── 弟子规 ├── 弟子规(中).pdf ├── 弟子规(手机).pdf └── 弟子规(抄写词语).pdf ├── 百家姓.txt ├── 百家姓 ├── 百家姓(手机).pdf └── 百家姓(拼音).pdf ├── 空白模板.txt └── 空白模板 ├── 空白模板(中).pdf ├── 空白模板(大).pdf ├── 空白模板(小).pdf └── 空白模板(拼音).pdf /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | *.pyc 3 | *.swp 4 | build/ 5 | dist/ 6 | 7 | 8 | -------------------------------------------------------------------------------- /CopybookGeneratorApp.iss: -------------------------------------------------------------------------------- 1 | ; Copy book generator 2 | 3 | [Setup] 4 | AppName=字帖生成器 V1.1 5 | AppVersion=1.1 6 | DefaultDirName={pf}\CopybookGenerator 7 | DefaultGroupName=字帖生成器 8 | DisableProgramGroupPage=yes 9 | Compression=lzma2 10 | SolidCompression=yes 11 | OutputDir=app_dist 12 | OutputBaseFilename=copybook_generator_setup_v1.1 13 | 14 | [Files] 15 | Source: "dist\*"; DestDir: "{app}" 16 | 17 | [Icons] 18 | Name: "{group}\字帖生成器"; Filename: "{app}\CopybookGeneratorApp.exe" 19 | Name: "{group}\Uninstall"; Filename: "{uninstallexe}" 20 | -------------------------------------------------------------------------------- /CopybookGeneratorApp.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: UTF-8 -*- 3 | # 4 | from __future__ import unicode_literals 5 | import os 6 | import re 7 | import sys 8 | import math 9 | import time 10 | from CopybookGeneratorDlg import * 11 | import svgwrite 12 | import cairosvg 13 | import pdfrw 14 | from pypinyin import pinyin 15 | 16 | 17 | 18 | ABOUT_INFO = '''\ 19 | 字帖生成器 V1.1 20 | 21 | URL: https://github.com/pengshulin/copybook_generator 22 | Peng Shullin 2017 23 | ''' 24 | 25 | MODE = [ 26 | { 27 | 'name': 'A4 抄写本(行高1.0,间距0.2)', 28 | 'page_width': 21.0, 'page_height': 29.7, 'margin_x': 0.9, 'margin_y': 1.0, 29 | 'width': 1.0, 'height': 1.0, 'space_x': 0.0, 'space_y': 0.2, 30 | }, 31 | 32 | { 33 | 'name': 'A4 28*41', 34 | 'page_width': 21.0, 'page_height': 29.7, 'margin_x': 1.0, 'margin_y': 1.0, 35 | 'width': 0.67, 'height': 0.67, 'space_x': 0.0, 'space_y': 0.0, 36 | }, 37 | 38 | { 39 | 'name': 'A4 24*35', 40 | 'page_width': 21.0, 'page_height': 29.7, 'margin_x': 1.0, 'margin_y': 1.0, 41 | 'width': 0.79, 'height': 0.79, 'space_x': 0.0, 'space_y': 0.0, 42 | }, 43 | 44 | { 45 | 'name': 'A4 12*18', # default 46 | 'page_width': 21.0, 'page_height': 29.7, 'margin_x': 1.5, 'margin_y': 1.5, 47 | 'width': 1.47, 'height': 1.47, 'space_x': 0.0, 'space_y': 0.0, 48 | }, 49 | 50 | { 51 | 'name': 'A4 8*13', 52 | 'page_width': 21.0, 'page_height': 29.7, 'margin_x': 1.5, 'margin_y': 1.5, 53 | 'width': 2.0, 'height': 2.0, 'space_x': 0.0, 'space_y': 0.0, 54 | }, 55 | 56 | { 57 | 'name': 'A4 6*9', 58 | 'page_width': 21.0, 'page_height': 29.7, 'margin_x': 1.5, 'margin_y': 1.5, 59 | 'width': 2.9, 'height': 2.9, 'space_x': 0.0, 'space_y': 0.0, 60 | }, 61 | 62 | { 63 | 'name': 'A4 4*6', 64 | 'page_width': 21.0, 'page_height': 29.7, 'margin_x': 1.5, 'margin_y': 1.5, 65 | 'width': 4.4, 'height': 4.4, 'space_x': 0.0, 'space_y': 0.0, 66 | }, 67 | 68 | { 69 | 'name': '5.5寸手机 6*10', 70 | 'page_width': 6.7, 'page_height': 12.1, 'margin_x': 0.3, 'margin_y': 0.3, 71 | 'width': 1.0, 'height': 1.0, 'space_x': 0.0, 'space_y': 0.0, 72 | }, 73 | 74 | { 75 | 'name': '5.5寸手机 4*7', 76 | 'page_width': 6.7, 'page_height': 12.1, 'margin_x': 0.3, 'margin_y': 0.1, 77 | 'width': 1.5, 'height': 1.5, 'space_x': 0.0, 'space_y': 0.0, 78 | }, 79 | 80 | { 81 | 'name': '6寸Kindle 8*10', 82 | 'page_width': 9, 'page_height': 12, 'margin_x': 0.1, 'margin_y': 0.1, 83 | 'width': 1.1, 'height': 1.1, 'space_x': 0.0, 'space_y': 0.0, 84 | }, 85 | 86 | { 87 | 'name': '6寸Kindle 6*8', 88 | 'page_width': 9, 'page_height': 12, 'margin_x': 0.2, 'margin_y': 0.1, 89 | 'width': 1.4, 'height': 1.4, 'space_x': 0.0, 'space_y': 0.0, 90 | }, 91 | 92 | 93 | ] 94 | 95 | 96 | COLOR_REPEAT = ['black'] 97 | for i in range(50): 98 | v = int(255*(1-0.3/float(i+2.0))) 99 | COLOR_REPEAT.append( '#%02X%02X%02X'% (v,v,v) ) 100 | #print COLOR_REPEAT 101 | 102 | 103 | def conv(cfg): 104 | source = cfg['input'] 105 | dirname = os.path.dirname(source) 106 | basename = os.path.basename(source) 107 | prefixname = os.path.splitext(basename)[0] 108 | outputdir = os.path.join(dirname, prefixname) 109 | pages_limit = cfg['pages_limit'] 110 | 111 | unit = svgwrite.cm 112 | paper_w = cfg['page_width'] 113 | paper_h = cfg['page_height'] 114 | margin_x = cfg['margin_x'] 115 | margin_y = cfg['margin_y'] 116 | margin_left = margin_x 117 | margin_top = margin_y 118 | margin_right = paper_w - margin_x 119 | margin_bottom = paper_h - margin_y 120 | width = cfg['width'] 121 | height = cfg['height'] 122 | space_x = cfg['space_x'] 123 | space_y = cfg['space_y'] 124 | use_pinyin = cfg['pinyin'] 125 | grid_type = cfg['grid_type'] 126 | font = cfg['font'] 127 | font_scale = cfg['font_scale'] 128 | font_base = cfg['font_base'] 129 | font_family_page = 'Sans' 130 | font_size_page = 0.3 131 | font_family_foot_notes = '楷体' 132 | font_size_foot_notes = 0.3 133 | output_page_num = cfg['output_page_num'] 134 | output_foot_notes = cfg['output_foot_notes'] 135 | foot_notes = cfg['foot_notes'] 136 | foot_notes_position = cfg['foot_notes_position'] 137 | repeat_times = cfg['repeat_times'] 138 | 139 | def read_source(fname, cfg): 140 | contents = [] 141 | raw = open(fname, 'r').read().decode(encoding='utf8', errors='strict') 142 | raw2 = [] 143 | for l in raw.split('EOL'): 144 | raw2 += list(l) 145 | raw2.append('EOL') 146 | for c in raw: 147 | #for c in raw2: 148 | if c == u'\ufeff': 149 | continue 150 | elif c == u'_': 151 | c = u' ' 152 | else: 153 | c = c.strip() 154 | if c: 155 | contents.append(c) 156 | elif cfg['layout_type'] == '抄写词语': 157 | if contents and contents[-1] != 'EOL': 158 | contents.append("EOL") 159 | print contents 160 | return contents 161 | 162 | def draw_page( fname, page_num ): 163 | dwg = svgwrite.Drawing(fname, (paper_w*unit, paper_h*unit), debug=True) 164 | 165 | height_pinyin = height * 0.3 166 | 167 | def draw_cell( x, y, w, h, grid_type='mi', color='grey' ): 168 | # append group of lines 169 | lines = dwg.add(dwg.g(stroke=color)) 170 | x0, x1, x2, y0, y1, y2 = x, x+w/2, x+w, y, y+h/2, y+h 171 | # horizontal lines 172 | l1=lines.add(dwg.line(start=(x0*unit, y0*unit), end=(x2*unit, y0*unit))) 173 | l2=lines.add(dwg.line(start=(x0*unit, y2*unit), end=(x2*unit, y2*unit))) 174 | # vertical lines 175 | if not grid_type == '上下横线': 176 | l3=lines.add(dwg.line(start=(x2*unit, y0*unit), end=(x2*unit, y2*unit))) 177 | l4=lines.add(dwg.line(start=(x0*unit, y0*unit), end=(x0*unit, y2*unit))) 178 | if grid_type == '上下横线(带分割线)': 179 | l3.dasharray([2,2]) 180 | l4.dasharray([2,2]) 181 | # center vertical/horizontal lines 182 | if grid_type in ['米字格', '田字格']: 183 | l5=lines.add(dwg.line(start=(x0*unit, y1*unit), end=(x2*unit, y1*unit))) 184 | l6=lines.add(dwg.line(start=(x1*unit, y0*unit), end=(x1*unit, y2*unit))) 185 | l5.dasharray([2,2]) 186 | l6.dasharray([2,2]) 187 | # cross lines 188 | if grid_type == '米字格': 189 | l7=lines.add(dwg.line(start=(x0*unit, y0*unit), end=(x2*unit, y2*unit))) 190 | l8=lines.add(dwg.line(start=(x0*unit, y2*unit), end=(x2*unit, y0*unit))) 191 | l7.dasharray([2,2]) 192 | l8.dasharray([2,2]) 193 | 194 | def draw_cell_pinyin( x, y, w, h, color='grey' ): 195 | # append group of lines 196 | lines = dwg.add(dwg.g(stroke=color)) 197 | x0, x1, y0, y1, y2, y3 = x, x+w, y, y+h/3, y+h*2/3, y+h 198 | # top/bottom horizontal 199 | l1=lines.add(dwg.line(start=(x0*unit, y0*unit), end=(x1*unit, y0*unit))) 200 | l2=lines.add(dwg.line(start=(x0*unit, y3*unit), end=(x1*unit, y3*unit))) 201 | # middle horizontal 202 | l3=lines.add(dwg.line(start=(x0*unit, y1*unit), end=(x1*unit, y1*unit))) 203 | l4=lines.add(dwg.line(start=(x0*unit, y2*unit), end=(x1*unit, y2*unit))) 204 | l3.dasharray([2,2]) 205 | l4.dasharray([2,2]) 206 | # left/right vertical 207 | if not grid_type == '上下横线': 208 | l5=lines.add(dwg.line(start=(x0*unit, y0*unit), end=(x0*unit, y3*unit))) 209 | l6=lines.add(dwg.line(start=(x1*unit, y0*unit), end=(x1*unit, y3*unit))) 210 | if grid_type == '上下横线(带分割线)': 211 | l5.dasharray([2,2]) 212 | l6.dasharray([2,2]) 213 | 214 | 215 | def get_new_char(): 216 | try: 217 | return contents.pop(0) 218 | except: 219 | return None 220 | 221 | def draw_text( x, y, w, h, c, color='black' ): 222 | dwg.add( dwg.text(c, insert=((x+w/2)*unit,(y+h*((1+font_scale)/2-font_base))*unit), 223 | text_anchor=u'middle', font_family=font, 224 | font_size=(h*font_scale)*unit, fill=color ) ) 225 | 226 | def draw_text_pinyin( x, y, w, h, c, color='black' ): 227 | conv = pinyin(c)[0][0] 228 | if conv == c: 229 | return 230 | dwg.add( dwg.text(conv, insert=((x+w/2)*unit,(y+h*2/3)*unit), 231 | text_anchor=u'middle', 232 | font_family=u'Sans', font_size=h*2/3*unit, fill=color ) ) 233 | 234 | def draw_page_num(num): 235 | dwg.add( dwg.text('%d'%num, insert=((paper_w/2)*unit,(margin_bottom+font_size_page)*unit), 236 | text_anchor=u'middle', font_family=font_family_page, 237 | font_size=(font_size_page)*unit, fill='black') ) 238 | 239 | def draw_foot_notes(): 240 | if foot_notes_position == '左上角': 241 | posx = margin_left 242 | posy = margin_top - font_size_foot_notes * 0.3 243 | anchor = 'start' 244 | elif foot_notes_position == '右上角': 245 | posx = margin_right 246 | posy = margin_top - font_size_foot_notes * 0.3 247 | anchor = 'end' 248 | elif foot_notes_position == '左下角': 249 | posx = margin_left 250 | posy = margin_bottom + font_size_foot_notes 251 | anchor = 'start' 252 | elif foot_notes_position == '右下角': 253 | posx = margin_right 254 | posy = margin_bottom + font_size_foot_notes 255 | anchor = 'end' 256 | else: 257 | return 258 | dwg.add( dwg.text(foot_notes, insert=(posx*unit,posy*unit), 259 | text_anchor=anchor, font_family=font_family_foot_notes, 260 | font_size=(font_size_foot_notes)*unit, fill='black') ) 261 | 262 | if output_page_num: 263 | draw_page_num( page_num ) 264 | if output_foot_notes and foot_notes: 265 | draw_foot_notes() 266 | 267 | cursor_y = margin_top 268 | while cursor_y + height < margin_bottom: 269 | cursor_x = margin_left 270 | repeat_counter = 1 271 | if cfg['layout_type'] == '抄写单字': 272 | c = get_new_char() 273 | elif cfg['layout_type'] == '抄写词语': 274 | cs = [] 275 | while True: 276 | nc = get_new_char() 277 | if nc is None or nc == 'EOL': 278 | break 279 | else: 280 | cs.append( nc ) 281 | #print cs 282 | in_word_counter = 1 283 | while cursor_x + width < margin_right: 284 | if cfg['layout_type'] == '抄写单字': 285 | if repeat_counter <= repeat_times+1: 286 | color = COLOR_REPEAT[repeat_counter-1] 287 | else: 288 | c = None 289 | repeat_counter += 1 290 | elif cfg['layout_type'] == '抄写词语': 291 | if repeat_counter <= repeat_times+1: 292 | try: 293 | c = cs[in_word_counter-1] 294 | except IndexError: 295 | c = u' ' 296 | color = COLOR_REPEAT[repeat_counter-1] 297 | else: 298 | c = None 299 | if in_word_counter >= len(cs): 300 | repeat_counter += 1 301 | in_word_counter = 1 302 | else: 303 | in_word_counter += 1 304 | else: 305 | c = get_new_char() 306 | color = 'black' 307 | #print c 308 | #lcolor = 'green' 309 | lcolor = 'grey' 310 | if use_pinyin: 311 | draw_cell_pinyin( cursor_x, cursor_y, width, height_pinyin, lcolor ) 312 | draw_cell( cursor_x, cursor_y+height_pinyin, width, height, grid_type, lcolor ) 313 | if c is not None: 314 | draw_text( cursor_x, cursor_y+height_pinyin, width, height, c, color ) 315 | draw_text_pinyin( cursor_x, cursor_y, width, height_pinyin, c, color ) 316 | #print c, 317 | else: 318 | draw_cell( cursor_x, cursor_y, width, height, grid_type, lcolor ) 319 | if c is not None: 320 | draw_text( cursor_x, cursor_y, width, height, c, color ) 321 | cursor_x += width + space_x 322 | if use_pinyin: 323 | cursor_y += height + height_pinyin + space_y 324 | else: 325 | cursor_y += height + space_y 326 | dwg.save() 327 | #print '' 328 | 329 | contents = read_source(source, cfg) 330 | page_index = 1 331 | if not os.path.isdir(outputdir): 332 | os.mkdir(outputdir) 333 | svgs, pdfs = [], [] 334 | while contents: 335 | output_svg = os.path.join(outputdir, '%d.svg'% page_index ) 336 | output_pdf = os.path.join(outputdir, '%d.pdf'% page_index ) 337 | draw_page( output_svg, page_index ) 338 | cairosvg.svg2pdf(url=output_svg, write_to=output_pdf) 339 | svgs.append( output_svg ) 340 | pdfs.append( output_pdf ) 341 | page_index += 1 342 | if pages_limit and (page_index > pages_limit): 343 | break 344 | # join pages 345 | output_joined_pdf = os.path.join(outputdir, prefixname+'.pdf') 346 | writer = pdfrw.PdfWriter() 347 | for f in pdfs: 348 | writer.addpages(pdfrw.PdfReader(f).pages) 349 | writer.write( output_joined_pdf ) 350 | # remove 351 | if not cfg['keep_tempfiles']: 352 | #cmd = u'rm %s'% (' '.join(svgs + pdfs)) 353 | #print cmd 354 | #os.system( cmd.encode(encoding='utf8') ) 355 | for f in svgs + pdfs: 356 | os.remove(f) 357 | 358 | 359 | 360 | class MainFrame(MyFrame): 361 | 362 | def __init__(self, *args, **kwds): 363 | MyFrame.__init__( self, *args, **kwds ) 364 | self.Bind(wx.EVT_CLOSE, self.OnClose, self) 365 | self.combo_box_mode.AppendItems( [i['name'] for i in MODE] ) 366 | #self.combo_box_font.AppendItems( ['楷体', '隶书'] ) 367 | self.combo_box_grid_type.AppendItems( ['米字格', '田字格', '口字格', '上下横线', 368 | '上下横线(带分割线)'] ) 369 | self.combo_box_layout_type.AppendItems( ['字帖', '抄写单字', '抄写词语'] ) 370 | self.combo_box_mode.SetValue('A4 12*18') 371 | self.combo_box_font.SetValue( '楷体' ) 372 | self.combo_box_grid_type.SetValue( '田字格' ) 373 | self.checkbox_pinyin.SetValue( False ) 374 | self.text_ctrl_font_scale.SetValue( '0.8' ) 375 | self.combo_box_layout_type.SetValue( '字帖' ) 376 | self.combo_box_foot_notes_position.AppendItems( ['左上角','右上角','左下角','右下角'] ) 377 | self.combo_box_foot_notes_position.SetValue( '右下角' ) 378 | self.text_ctrl_foot_notes.SetValue('勿忘初心 方得始终') 379 | self.doSelectMode() 380 | 381 | e = wx.FontEnumerator() 382 | e.EnumerateFacenames() 383 | filtered_fonts = [] 384 | for f in e.GetFacenames(): 385 | try: 386 | str(f) # 过滤掉ASCII名称的英文字体 387 | continue 388 | except: 389 | if f.startswith('@'): 390 | continue # 过滤掉@开头的字体(Windows下的旋转字体) 391 | pass 392 | filtered_fonts.append( f ) 393 | self.combo_box_font.AppendItems( filtered_fonts ) 394 | 395 | def OnClose(self, event): 396 | self.Destroy() 397 | event.Skip() 398 | 399 | def info( self, info, info_type=wx.ICON_WARNING ): 400 | if info: 401 | self.bar_info.ShowMessage(info, info_type) 402 | else: 403 | self.bar_info.Dismiss() 404 | 405 | def OnAbout(self, event): 406 | self.info( '' ) 407 | dlg = wx.MessageDialog(self, ABOUT_INFO, '关于', wx.OK) 408 | dlg.ShowModal() 409 | dlg.Destroy() 410 | 411 | def OnSelectInput(self, event): 412 | self.info( '' ) 413 | dlg = wx.FileDialog( self, message="选择文件", defaultDir=os.getcwd(), 414 | defaultFile='', wildcard="文本文件 (*.txt)|*.txt", style=wx.OPEN ) 415 | if dlg.ShowModal() == wx.ID_OK: 416 | fname = dlg.GetPath().strip() 417 | self.text_ctrl_input.SetValue( fname ) 418 | self.resetOutputName() 419 | dlg.Destroy() 420 | 421 | def OnInputText(self, event): 422 | self.resetOutputName() 423 | 424 | def resetOutputName(self): 425 | fname = self.text_ctrl_input.GetValue() 426 | if fname: 427 | dirname = os.path.dirname(fname) 428 | basename = os.path.basename(fname) 429 | prefixname = os.path.splitext(basename)[0] 430 | outputdir = os.path.join(dirname, prefixname) 431 | output_joined_pdf = os.path.join(outputdir, prefixname+'.pdf') 432 | self.text_ctrl_output.SetValue( output_joined_pdf ) 433 | else: 434 | self.text_ctrl_output.SetValue( '' ) 435 | 436 | 437 | def OnSelectPreMode(self, event): 438 | self.doSelectMode() 439 | 440 | def doSelectMode(self): 441 | sel = self.combo_box_mode.GetValue() 442 | for m in MODE: 443 | if m['name'] != sel: 444 | continue 445 | self.text_ctrl_page_width.SetValue( str(m['page_width']) ) 446 | self.text_ctrl_page_height.SetValue( str(m['page_height']) ) 447 | self.text_ctrl_margin_x.SetValue( str(m['margin_x']) ) 448 | self.text_ctrl_margin_y.SetValue( str(m['margin_y']) ) 449 | self.text_ctrl_width.SetValue( str(m['width']) ) 450 | self.text_ctrl_height.SetValue( str(m['height']) ) 451 | self.text_ctrl_space_x.SetValue( str(m['space_x']) ) 452 | self.text_ctrl_space_y.SetValue( str(m['space_y']) ) 453 | 454 | def OnGenerate(self, event): 455 | self.info( '' ) 456 | try: 457 | cfg = {} 458 | cfg['page_width'] = float(self.text_ctrl_page_width.GetValue()) 459 | cfg['page_height'] = float(self.text_ctrl_page_height.GetValue()) 460 | cfg['margin_x'] = float(self.text_ctrl_margin_x.GetValue()) 461 | cfg['margin_y'] = float(self.text_ctrl_margin_y.GetValue()) 462 | cfg['width'] = float(self.text_ctrl_width.GetValue()) 463 | cfg['height'] = float(self.text_ctrl_height.GetValue()) 464 | cfg['space_x'] = float(self.text_ctrl_space_x.GetValue()) 465 | cfg['space_y'] = float(self.text_ctrl_space_y.GetValue()) 466 | cfg['font'] = self.combo_box_font.GetValue() 467 | cfg['grid_type'] = self.combo_box_grid_type.GetValue() 468 | cfg['pinyin'] = self.checkbox_pinyin.GetValue() 469 | cfg['input'] = self.text_ctrl_input.GetValue() 470 | cfg['output'] = self.text_ctrl_input.GetValue() 471 | cfg['keep_tempfiles'] = self.checkbox_keep_tempfiles.GetValue() 472 | cfg['pages_limit'] = int(self.text_ctrl_pages_limit.GetValue()) 473 | cfg['layout_type'] = self.combo_box_layout_type.GetValue() 474 | cfg['font_scale'] = float(self.text_ctrl_font_scale.GetValue()) 475 | cfg['font_base'] = float(self.text_ctrl_font_base.GetValue()) 476 | cfg['output_page_num'] = self.checkbox_output_page_num.GetValue() 477 | cfg['output_foot_notes'] = self.checkbox_output_foot_notes.GetValue() 478 | cfg['foot_notes'] = self.text_ctrl_foot_notes.GetValue() 479 | cfg['foot_notes_position'] = self.combo_box_foot_notes_position.GetValue() 480 | cfg['repeat_times'] = int(self.text_ctrl_repeat_times.GetValue()) 481 | if cfg['output']: 482 | conv( cfg ) 483 | else: 484 | self.info( '请选择输入文件' ) 485 | except Exception as e: 486 | self.info( u'错误 %s'% unicode(e), wx.ICON_ERROR ) 487 | 488 | 489 | 490 | 491 | if __name__ == "__main__": 492 | gettext.install("app") 493 | app = wx.App(0) 494 | app.SetAppName( 'CopybookGeneratorApp' ) 495 | dialog_1 = MainFrame(None, wx.ID_ANY, "") 496 | app.SetTopWindow(dialog_1) 497 | dialog_1.Show() 498 | app.MainLoop() 499 | -------------------------------------------------------------------------------- /CopybookGeneratorDlg.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: UTF-8 -*- 3 | # 4 | # generated by wxGlade f172c83ff51d+ on Sat Sep 30 19:34:43 2017 5 | # 6 | 7 | import wx 8 | 9 | # begin wxGlade: dependencies 10 | import gettext 11 | # end wxGlade 12 | 13 | # begin wxGlade: extracode 14 | from wx import InfoBar 15 | # end wxGlade 16 | 17 | 18 | class MyFrame(wx.Frame): 19 | def __init__(self, *args, **kwds): 20 | # begin wxGlade: MyFrame.__init__ 21 | kwds["style"] = wx.CAPTION | wx.CLIP_CHILDREN | wx.CLOSE_BOX | wx.MINIMIZE_BOX | wx.SYSTEM_MENU 22 | wx.Frame.__init__(self, *args, **kwds) 23 | self.combo_box_mode = wx.ComboBox(self, wx.ID_ANY, choices=[], style=wx.CB_DROPDOWN) 24 | self.text_ctrl_page_width = wx.TextCtrl(self, wx.ID_ANY, "") 25 | self.text_ctrl_page_height = wx.TextCtrl(self, wx.ID_ANY, "") 26 | self.text_ctrl_margin_x = wx.TextCtrl(self, wx.ID_ANY, "") 27 | self.text_ctrl_margin_y = wx.TextCtrl(self, wx.ID_ANY, "") 28 | self.text_ctrl_width = wx.TextCtrl(self, wx.ID_ANY, "") 29 | self.text_ctrl_height = wx.TextCtrl(self, wx.ID_ANY, "") 30 | self.text_ctrl_space_x = wx.TextCtrl(self, wx.ID_ANY, "") 31 | self.text_ctrl_space_y = wx.TextCtrl(self, wx.ID_ANY, "") 32 | self.combo_box_font = wx.ComboBox(self, wx.ID_ANY, choices=[], style=wx.CB_DROPDOWN) 33 | self.text_ctrl_font_scale = wx.TextCtrl(self, wx.ID_ANY, _("0.9")) 34 | self.text_ctrl_font_base = wx.TextCtrl(self, wx.ID_ANY, _("0.1")) 35 | self.text_ctrl_pages_limit = wx.TextCtrl(self, wx.ID_ANY, _("0")) 36 | self.combo_box_grid_type = wx.ComboBox(self, wx.ID_ANY, choices=[], style=wx.CB_DROPDOWN) 37 | self.combo_box_layout_type = wx.ComboBox(self, wx.ID_ANY, choices=[], style=wx.CB_DROPDOWN) 38 | self.text_ctrl_repeat_times = wx.TextCtrl(self, wx.ID_ANY, _("1")) 39 | self.checkbox_pinyin = wx.CheckBox(self, wx.ID_ANY, _(u"\u8f93\u51fa\u62fc\u97f3")) 40 | self.checkbox_output_page_num = wx.CheckBox(self, wx.ID_ANY, _(u"\u8f93\u51fa\u9875\u7801")) 41 | self.checkbox_output_foot_notes = wx.CheckBox(self, wx.ID_ANY, _(u"\u8f93\u51fa\u811a\u6ce8\uff1a")) 42 | self.text_ctrl_foot_notes = wx.TextCtrl(self, wx.ID_ANY, "") 43 | self.combo_box_foot_notes_position = wx.ComboBox(self, wx.ID_ANY, choices=[], style=wx.CB_DROPDOWN) 44 | self.text_ctrl_input = wx.TextCtrl(self, wx.ID_ANY, "") 45 | self.button_select_input = wx.Button(self, wx.ID_ANY, _("...")) 46 | self.text_ctrl_output = wx.TextCtrl(self, wx.ID_ANY, "") 47 | self.checkbox_keep_tempfiles = wx.CheckBox(self, wx.ID_ANY, _(u"\u4fdd\u7559\u4e2d\u95f4\u6587\u4ef6")) 48 | self.bar_info = InfoBar(self, wx.ID_ANY) 49 | self.button_2 = wx.Button(self, wx.ID_ANY, _(u"\u751f\u6210")) 50 | self.button_1 = wx.Button(self, wx.ID_ANY, _(u"\u5173\u4e8e")) 51 | 52 | self.__set_properties() 53 | self.__do_layout() 54 | 55 | self.Bind(wx.EVT_COMBOBOX, self.OnSelectPreMode, self.combo_box_mode) 56 | self.Bind(wx.EVT_TEXT, self.OnInputText, self.text_ctrl_input) 57 | self.Bind(wx.EVT_BUTTON, self.OnSelectInput, self.button_select_input) 58 | self.Bind(wx.EVT_BUTTON, self.OnGenerate, self.button_2) 59 | self.Bind(wx.EVT_BUTTON, self.OnAbout, self.button_1) 60 | # end wxGlade 61 | 62 | def __set_properties(self): 63 | # begin wxGlade: MyFrame.__set_properties 64 | self.SetTitle(_(u"\u5b57\u5e16\u751f\u6210\u5668")) 65 | self.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNFACE)) 66 | self.combo_box_mode.SetMinSize((300, -1)) 67 | self.combo_box_font.SetMinSize((300, -1)) 68 | self.text_ctrl_pages_limit.SetMinSize((60, -1)) 69 | self.combo_box_grid_type.SetMinSize((200, -1)) 70 | self.text_ctrl_repeat_times.SetMinSize((60, -1)) 71 | self.checkbox_output_page_num.SetValue(1) 72 | self.checkbox_output_foot_notes.SetValue(1) 73 | self.text_ctrl_foot_notes.SetMinSize((300, -1)) 74 | self.text_ctrl_input.SetMinSize((600, -1)) 75 | self.button_select_input.SetMinSize((40, 40)) 76 | self.text_ctrl_output.SetMinSize((600, -1)) 77 | self.text_ctrl_output.Enable(False) 78 | self.button_2.SetMinSize((120, -1)) 79 | self.button_2.SetDefault() 80 | self.button_1.SetMinSize((120, -1)) 81 | # end wxGlade 82 | 83 | def __do_layout(self): 84 | # begin wxGlade: MyFrame.__do_layout 85 | sizer_1 = wx.BoxSizer(wx.VERTICAL) 86 | sizer_2 = wx.BoxSizer(wx.HORIZONTAL) 87 | sizer_3 = wx.BoxSizer(wx.VERTICAL) 88 | sizer_4 = wx.BoxSizer(wx.HORIZONTAL) 89 | sizer_5 = wx.BoxSizer(wx.VERTICAL) 90 | sizer_6 = wx.BoxSizer(wx.VERTICAL) 91 | sizer_15 = wx.BoxSizer(wx.HORIZONTAL) 92 | sizer_12 = wx.BoxSizer(wx.HORIZONTAL) 93 | sizer_7 = wx.BoxSizer(wx.HORIZONTAL) 94 | sizer_14 = wx.BoxSizer(wx.HORIZONTAL) 95 | sizer_13 = wx.BoxSizer(wx.HORIZONTAL) 96 | sizer_10 = wx.BoxSizer(wx.HORIZONTAL) 97 | sizer_9 = wx.BoxSizer(wx.HORIZONTAL) 98 | sizer_8 = wx.BoxSizer(wx.HORIZONTAL) 99 | sizer_11 = wx.BoxSizer(wx.HORIZONTAL) 100 | sizer_2.Add((20, 20), 0, 0, 0) 101 | sizer_3.Add((20, 20), 0, 0, 0) 102 | label_1 = wx.StaticText(self, wx.ID_ANY, _(u"\u9884\u8bbe\u6a21\u5f0f\uff1a")) 103 | sizer_11.Add(label_1, 0, wx.ALIGN_CENTER_VERTICAL, 0) 104 | sizer_11.Add(self.combo_box_mode, 0, wx.ALIGN_CENTER_VERTICAL, 0) 105 | sizer_11.Add((0, 0), 0, 0, 0) 106 | sizer_6.Add(sizer_11, 0, wx.EXPAND, 0) 107 | sizer_6.Add((20, 10), 0, 0, 0) 108 | label_2 = wx.StaticText(self, wx.ID_ANY, _(u"\u9875\u9762\u5bbd\uff1a")) 109 | sizer_8.Add(label_2, 0, wx.ALIGN_CENTER_VERTICAL, 0) 110 | sizer_8.Add(self.text_ctrl_page_width, 0, wx.ALIGN_CENTER_VERTICAL, 0) 111 | label_6 = wx.StaticText(self, wx.ID_ANY, _("cm")) 112 | sizer_8.Add(label_6, 0, wx.ALIGN_CENTER_VERTICAL, 0) 113 | sizer_8.Add((10, 20), 0, 0, 0) 114 | label_3 = wx.StaticText(self, wx.ID_ANY, _(u"\u9875\u9762\u9ad8\uff1a")) 115 | sizer_8.Add(label_3, 0, wx.ALIGN_CENTER_VERTICAL, 0) 116 | sizer_8.Add(self.text_ctrl_page_height, 0, wx.ALIGN_CENTER_VERTICAL, 0) 117 | label_7 = wx.StaticText(self, wx.ID_ANY, _("cm")) 118 | sizer_8.Add(label_7, 0, wx.ALIGN_CENTER_VERTICAL, 0) 119 | sizer_8.Add((10, 20), 1, 0, 0) 120 | label_4 = wx.StaticText(self, wx.ID_ANY, _(u"\u9875\u9762\u6a2a\u8fb9\u8ddd\uff1a")) 121 | sizer_8.Add(label_4, 0, wx.ALIGN_CENTER_VERTICAL, 0) 122 | sizer_8.Add(self.text_ctrl_margin_x, 0, wx.ALIGN_CENTER_VERTICAL, 0) 123 | label_8 = wx.StaticText(self, wx.ID_ANY, _("cm")) 124 | sizer_8.Add(label_8, 0, wx.ALIGN_CENTER_VERTICAL, 0) 125 | sizer_8.Add((10, 20), 0, 0, 0) 126 | label_5 = wx.StaticText(self, wx.ID_ANY, _(u"\u9875\u9762\u7eb5\u8fb9\u8ddd\uff1a")) 127 | sizer_8.Add(label_5, 0, wx.ALIGN_CENTER_VERTICAL, 0) 128 | sizer_8.Add(self.text_ctrl_margin_y, 0, wx.ALIGN_CENTER_VERTICAL, 0) 129 | label_9 = wx.StaticText(self, wx.ID_ANY, _("cm")) 130 | sizer_8.Add(label_9, 0, wx.ALIGN_CENTER_VERTICAL, 0) 131 | sizer_8.Add((0, 0), 0, 0, 0) 132 | sizer_8.Add((0, 0), 0, 0, 0) 133 | sizer_6.Add(sizer_8, 0, wx.EXPAND, 0) 134 | sizer_6.Add((20, 10), 0, 0, 0) 135 | label_10 = wx.StaticText(self, wx.ID_ANY, _(u"\u5b57\u6846\u5bbd\uff1a")) 136 | sizer_9.Add(label_10, 0, wx.ALIGN_CENTER_VERTICAL, 0) 137 | sizer_9.Add(self.text_ctrl_width, 0, wx.ALIGN_CENTER_VERTICAL, 0) 138 | label_11 = wx.StaticText(self, wx.ID_ANY, _("cm")) 139 | sizer_9.Add(label_11, 0, wx.ALIGN_CENTER_VERTICAL, 0) 140 | sizer_9.Add((10, 20), 0, 0, 0) 141 | label_12 = wx.StaticText(self, wx.ID_ANY, _(u"\u5b57\u6846\u9ad8\uff1a")) 142 | sizer_9.Add(label_12, 0, wx.ALIGN_CENTER_VERTICAL, 0) 143 | sizer_9.Add(self.text_ctrl_height, 0, wx.ALIGN_CENTER_VERTICAL, 0) 144 | label_13 = wx.StaticText(self, wx.ID_ANY, _("cm")) 145 | sizer_9.Add(label_13, 0, wx.ALIGN_CENTER_VERTICAL, 0) 146 | sizer_9.Add((10, 20), 1, 0, 0) 147 | label_14 = wx.StaticText(self, wx.ID_ANY, _(u"\u5b57\u6846\u6a2a\u95f4\u8ddd\uff1a")) 148 | sizer_9.Add(label_14, 0, wx.ALIGN_CENTER_VERTICAL, 0) 149 | sizer_9.Add(self.text_ctrl_space_x, 0, wx.ALIGN_CENTER_VERTICAL, 0) 150 | label_15 = wx.StaticText(self, wx.ID_ANY, _("cm")) 151 | sizer_9.Add(label_15, 0, wx.ALIGN_CENTER_VERTICAL, 0) 152 | sizer_9.Add((10, 20), 0, 0, 0) 153 | label_16 = wx.StaticText(self, wx.ID_ANY, _(u"\u5b57\u6846\u7eb5\u95f4\u8ddd\uff1a")) 154 | sizer_9.Add(label_16, 0, wx.ALIGN_CENTER_VERTICAL, 0) 155 | sizer_9.Add(self.text_ctrl_space_y, 0, wx.ALIGN_CENTER_VERTICAL, 0) 156 | label_17 = wx.StaticText(self, wx.ID_ANY, _("cm")) 157 | sizer_9.Add(label_17, 0, wx.ALIGN_CENTER_VERTICAL, 0) 158 | sizer_9.Add((0, 0), 0, 0, 0) 159 | sizer_6.Add(sizer_9, 0, wx.EXPAND, 0) 160 | sizer_6.Add((20, 20), 0, 0, 0) 161 | static_line_2 = wx.StaticLine(self, wx.ID_ANY) 162 | sizer_6.Add(static_line_2, 0, wx.EXPAND, 0) 163 | sizer_6.Add((20, 20), 0, 0, 0) 164 | label_18 = wx.StaticText(self, wx.ID_ANY, _(u"\u5b57\u4f53\uff1a")) 165 | sizer_10.Add(label_18, 0, wx.ALIGN_CENTER_VERTICAL, 0) 166 | sizer_10.Add(self.combo_box_font, 0, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, 0) 167 | sizer_10.Add((20, 20), 0, 0, 0) 168 | label_24 = wx.StaticText(self, wx.ID_ANY, _(u"\u5b57\u4f53\u7f29\u653e\uff1a")) 169 | sizer_10.Add(label_24, 0, wx.ALIGN_CENTER_VERTICAL, 0) 170 | sizer_10.Add(self.text_ctrl_font_scale, 0, wx.ALIGN_CENTER_VERTICAL, 0) 171 | sizer_10.Add((20, 20), 0, 0, 0) 172 | label_25 = wx.StaticText(self, wx.ID_ANY, _(u"\u5782\u76f4\u57fa\u51c6\u5fae\u8c03\uff1a")) 173 | sizer_10.Add(label_25, 0, wx.ALIGN_CENTER_VERTICAL, 0) 174 | sizer_10.Add(self.text_ctrl_font_base, 0, wx.ALIGN_CENTER_VERTICAL, 0) 175 | sizer_10.Add((0, 0), 0, 0, 0) 176 | sizer_10.Add((0, 0), 0, 0, 0) 177 | sizer_6.Add(sizer_10, 0, wx.EXPAND, 0) 178 | sizer_6.Add((20, 10), 0, 0, 0) 179 | label_22 = wx.StaticText(self, wx.ID_ANY, _(u"\u9875\u6570\u9650\u5236\uff1a")) 180 | sizer_13.Add(label_22, 0, wx.ALIGN_CENTER_VERTICAL, 0) 181 | sizer_13.Add(self.text_ctrl_pages_limit, 0, wx.ALIGN_CENTER_VERTICAL, 0) 182 | sizer_13.Add((20, 20), 0, 0, 0) 183 | label_19 = wx.StaticText(self, wx.ID_ANY, _(u"\u8fb9\u6846\u7c7b\u578b\uff1a")) 184 | sizer_13.Add(label_19, 0, wx.ALIGN_CENTER_VERTICAL, 0) 185 | sizer_13.Add(self.combo_box_grid_type, 0, wx.ALIGN_CENTER_VERTICAL, 0) 186 | sizer_13.Add((20, 20), 0, 0, 0) 187 | label_23 = wx.StaticText(self, wx.ID_ANY, _(u"\u5e03\u5c40\u7c7b\u578b\uff1a")) 188 | sizer_13.Add(label_23, 0, wx.ALIGN_CENTER_VERTICAL, 0) 189 | sizer_13.Add(self.combo_box_layout_type, 0, wx.ALIGN_CENTER_VERTICAL, 0) 190 | sizer_13.Add((20, 20), 0, 0, 0) 191 | label_27 = wx.StaticText(self, wx.ID_ANY, _(u"\u91cd\u590d\u6b21\u6570\uff1a")) 192 | sizer_13.Add(label_27, 0, wx.ALIGN_CENTER_VERTICAL, 0) 193 | sizer_13.Add(self.text_ctrl_repeat_times, 0, wx.ALIGN_CENTER_VERTICAL, 0) 194 | sizer_13.Add((0, 0), 0, 0, 0) 195 | sizer_6.Add(sizer_13, 0, wx.EXPAND, 0) 196 | sizer_6.Add((20, 10), 0, 0, 0) 197 | sizer_14.Add(self.checkbox_pinyin, 0, wx.ALIGN_CENTER_VERTICAL, 0) 198 | sizer_14.Add((20, 20), 0, 0, 0) 199 | sizer_14.Add(self.checkbox_output_page_num, 0, wx.ALIGN_CENTER_VERTICAL, 0) 200 | sizer_14.Add((20, 20), 0, 0, 0) 201 | sizer_14.Add(self.checkbox_output_foot_notes, 0, wx.ALIGN_CENTER_VERTICAL, 0) 202 | sizer_14.Add(self.text_ctrl_foot_notes, 0, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, 0) 203 | sizer_14.Add((10, 20), 0, 0, 0) 204 | label_26 = wx.StaticText(self, wx.ID_ANY, _(u"\u4f4d\u7f6e\uff1a")) 205 | sizer_14.Add(label_26, 0, wx.ALIGN_CENTER_VERTICAL, 0) 206 | sizer_14.Add(self.combo_box_foot_notes_position, 0, wx.ALIGN_CENTER_VERTICAL, 0) 207 | sizer_14.Add((0, 0), 0, 0, 0) 208 | sizer_6.Add(sizer_14, 0, wx.EXPAND, 0) 209 | sizer_6.Add((20, 10), 0, 0, 0) 210 | static_line_1 = wx.StaticLine(self, wx.ID_ANY) 211 | sizer_6.Add(static_line_1, 0, wx.EXPAND, 0) 212 | sizer_6.Add((20, 10), 0, 0, 0) 213 | label_20 = wx.StaticText(self, wx.ID_ANY, _(u"\u8f93\u5165\u6587\u4ef6\uff1a")) 214 | sizer_7.Add(label_20, 0, wx.ALIGN_CENTER_VERTICAL, 0) 215 | sizer_7.Add(self.text_ctrl_input, 0, wx.ALIGN_CENTER_VERTICAL, 0) 216 | sizer_7.Add((5, 20), 0, 0, 0) 217 | sizer_7.Add(self.button_select_input, 0, wx.ALIGN_CENTER_VERTICAL, 0) 218 | sizer_7.Add((0, 0), 0, 0, 0) 219 | sizer_6.Add(sizer_7, 0, wx.EXPAND, 0) 220 | sizer_6.Add((20, 10), 0, 0, 0) 221 | label_21 = wx.StaticText(self, wx.ID_ANY, _(u"\u8f93\u51fa\u6587\u4ef6\uff1a")) 222 | sizer_12.Add(label_21, 0, wx.ALIGN_CENTER_VERTICAL, 0) 223 | sizer_12.Add(self.text_ctrl_output, 0, wx.ALIGN_CENTER_VERTICAL, 0) 224 | sizer_12.Add((10, 20), 0, 0, 0) 225 | sizer_12.Add(self.checkbox_keep_tempfiles, 0, 0, 0) 226 | sizer_12.Add((0, 0), 0, 0, 0) 227 | sizer_6.Add(sizer_12, 0, wx.EXPAND, 0) 228 | sizer_6.Add((20, 20), 0, wx.EXPAND, 0) 229 | sizer_15.Add(self.bar_info, 1, wx.EXPAND, 0) 230 | sizer_15.Add((20, 32), 0, 0, 0) 231 | sizer_6.Add(sizer_15, 1, wx.EXPAND, 0) 232 | sizer_4.Add(sizer_6, 1, wx.EXPAND, 0) 233 | sizer_4.Add((20, 357), 0, 0, 0) 234 | sizer_5.Add(self.button_2, 2, 0, 0) 235 | sizer_5.Add((20, 20), 0, 0, 0) 236 | sizer_5.Add(self.button_1, 1, 0, 0) 237 | sizer_4.Add(sizer_5, 0, wx.EXPAND, 0) 238 | sizer_3.Add(sizer_4, 1, wx.EXPAND, 0) 239 | sizer_3.Add((20, 20), 0, 0, 0) 240 | sizer_2.Add(sizer_3, 1, wx.EXPAND, 0) 241 | sizer_2.Add((20, 20), 0, 0, 0) 242 | sizer_1.Add(sizer_2, 1, wx.EXPAND, 0) 243 | self.SetSizer(sizer_1) 244 | sizer_1.Fit(self) 245 | self.Layout() 246 | self.Centre() 247 | # end wxGlade 248 | 249 | def OnSelectPreMode(self, event): # wxGlade: MyFrame. 250 | print("Event handler 'OnSelectPreMode' not implemented!") 251 | event.Skip() 252 | 253 | def OnInputText(self, event): # wxGlade: MyFrame. 254 | print("Event handler 'OnInputText' not implemented!") 255 | event.Skip() 256 | 257 | def OnSelectInput(self, event): # wxGlade: MyFrame. 258 | print("Event handler 'OnSelectInput' not implemented!") 259 | event.Skip() 260 | 261 | def OnGenerate(self, event): # wxGlade: MyFrame. 262 | print("Event handler 'OnGenerate' not implemented!") 263 | event.Skip() 264 | 265 | def OnAbout(self, event): # wxGlade: MyFrame. 266 | print("Event handler 'OnAbout' not implemented!") 267 | event.Skip() 268 | 269 | # end of class MyFrame 270 | -------------------------------------------------------------------------------- /CopybookGeneratorDlg.wxg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | wxSYS_COLOUR_BTNFACE 7 | 字帖生成器 8 | 9 | 1 10 | 11 | wxVERTICAL 12 | 13 | 14 | 0 15 | wxEXPAND 16 | 17 | wxHORIZONTAL 18 | 19 | 20 | 0 21 | 22 | 20 23 | 20 24 | 25 | 26 | 27 | 28 | 0 29 | wxEXPAND 30 | 31 | wxVERTICAL 32 | 33 | 34 | 0 35 | 36 | 20 37 | 20 38 | 39 | 40 | 41 | 42 | 0 43 | wxEXPAND 44 | 45 | wxHORIZONTAL 46 | 47 | 48 | 0 49 | wxEXPAND 50 | 51 | wxVERTICAL 52 | 53 | 54 | 0 55 | wxEXPAND 56 | 57 | wxHORIZONTAL 58 | 59 | 60 | 0 61 | wxALIGN_CENTER_VERTICAL 62 | 63 | 64 | 65 | 66 | 67 | 68 | 0 69 | wxALIGN_CENTER_VERTICAL 70 | 71 | 72 | OnSelectPreMode 73 | 74 | 300, -1 75 | -1 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 0 86 | 87 | 20 88 | 10 89 | 90 | 91 | 92 | 93 | 0 94 | wxEXPAND 95 | 96 | wxHORIZONTAL 97 | 98 | 99 | 0 100 | wxALIGN_CENTER_VERTICAL 101 | 102 | 103 | 104 | 105 | 106 | 107 | 0 108 | wxALIGN_CENTER_VERTICAL 109 | 110 | 111 | 112 | 113 | 114 | 0 115 | wxALIGN_CENTER_VERTICAL 116 | 117 | 118 | 119 | 120 | 121 | 122 | 0 123 | 124 | 10 125 | 20 126 | 127 | 128 | 129 | 130 | 0 131 | wxALIGN_CENTER_VERTICAL 132 | 133 | 134 | 135 | 136 | 137 | 138 | 0 139 | wxALIGN_CENTER_VERTICAL 140 | 141 | 142 | 143 | 144 | 145 | 0 146 | wxALIGN_CENTER_VERTICAL 147 | 148 | 149 | 150 | 151 | 152 | 153 | 0 154 | 155 | 10 156 | 20 157 | 158 | 159 | 160 | 161 | 0 162 | wxALIGN_CENTER_VERTICAL 163 | 164 | 165 | 166 | 167 | 168 | 169 | 0 170 | wxALIGN_CENTER_VERTICAL 171 | 172 | 173 | 174 | 175 | 176 | 0 177 | wxALIGN_CENTER_VERTICAL 178 | 179 | 180 | 181 | 182 | 183 | 184 | 0 185 | 186 | 10 187 | 20 188 | 189 | 190 | 191 | 192 | 0 193 | wxALIGN_CENTER_VERTICAL 194 | 195 | 196 | 197 | 198 | 199 | 200 | 0 201 | wxALIGN_CENTER_VERTICAL 202 | 203 | 204 | 205 | 206 | 207 | 0 208 | wxALIGN_CENTER_VERTICAL 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 0 220 | 221 | 20 222 | 10 223 | 224 | 225 | 226 | 227 | 0 228 | wxEXPAND 229 | 230 | wxHORIZONTAL 231 | 232 | 233 | 0 234 | wxALIGN_CENTER_VERTICAL 235 | 236 | 237 | 238 | 239 | 240 | 241 | 0 242 | wxALIGN_CENTER_VERTICAL 243 | 244 | 245 | 246 | 247 | 248 | 0 249 | wxALIGN_CENTER_VERTICAL 250 | 251 | 252 | 253 | 254 | 255 | 256 | 0 257 | 258 | 10 259 | 20 260 | 261 | 262 | 263 | 264 | 0 265 | wxALIGN_CENTER_VERTICAL 266 | 267 | 268 | 269 | 270 | 271 | 272 | 0 273 | wxALIGN_CENTER_VERTICAL 274 | 275 | 276 | 277 | 278 | 279 | 0 280 | wxALIGN_CENTER_VERTICAL 281 | 282 | 283 | 284 | 285 | 286 | 287 | 0 288 | 289 | 10 290 | 20 291 | 292 | 293 | 294 | 295 | 0 296 | wxALIGN_CENTER_VERTICAL 297 | 298 | 299 | 300 | 301 | 302 | 303 | 0 304 | wxALIGN_CENTER_VERTICAL 305 | 306 | 307 | 308 | 309 | 310 | 0 311 | wxALIGN_CENTER_VERTICAL 312 | 313 | 314 | 315 | 316 | 317 | 318 | 0 319 | 320 | 10 321 | 20 322 | 323 | 324 | 325 | 326 | 0 327 | wxALIGN_CENTER_VERTICAL 328 | 329 | 330 | 331 | 332 | 333 | 334 | 0 335 | wxALIGN_CENTER_VERTICAL 336 | 337 | 338 | 339 | 340 | 341 | 0 342 | wxALIGN_CENTER_VERTICAL 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 0 353 | 354 | 20 355 | 20 356 | 357 | 358 | 359 | 360 | 0 361 | wxEXPAND 362 | 363 | 364 | 365 | 366 | 367 | 368 | 0 369 | 370 | 20 371 | 20 372 | 373 | 374 | 375 | 376 | 0 377 | wxEXPAND 378 | 379 | wxHORIZONTAL 380 | 381 | 382 | 0 383 | wxALIGN_CENTER_VERTICAL 384 | 385 | 386 | 387 | 388 | 389 | 390 | 0 391 | wxEXPAND|wxALIGN_CENTER_VERTICAL 392 | 393 | 300, -1 394 | 395 | -1 396 | 397 | 398 | 399 | 400 | 401 | 402 | 0 403 | 404 | 20 405 | 20 406 | 407 | 408 | 409 | 410 | 0 411 | wxALIGN_CENTER_VERTICAL 412 | 413 | 414 | 415 | 416 | 417 | 418 | 0 419 | wxALIGN_CENTER_VERTICAL 420 | 421 | 0.9 422 | 423 | 424 | 425 | 426 | 0 427 | 428 | 20 429 | 20 430 | 431 | 432 | 433 | 434 | 0 435 | wxALIGN_CENTER_VERTICAL 436 | 437 | 438 | 439 | 440 | 441 | 442 | 0 443 | wxALIGN_CENTER_VERTICAL 444 | 445 | 0.1 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 0 455 | 456 | 20 457 | 10 458 | 459 | 460 | 461 | 462 | 0 463 | wxEXPAND 464 | 465 | wxHORIZONTAL 466 | 467 | 468 | 0 469 | wxALIGN_CENTER_VERTICAL 470 | 471 | 472 | 473 | 474 | 475 | 476 | 0 477 | wxALIGN_CENTER_VERTICAL 478 | 479 | 60, -1 480 | 0 481 | 482 | 483 | 484 | 485 | 0 486 | 487 | 20 488 | 20 489 | 490 | 491 | 492 | 493 | 0 494 | wxALIGN_CENTER_VERTICAL 495 | 496 | 497 | 498 | 499 | 500 | 501 | 0 502 | wxALIGN_CENTER_VERTICAL 503 | 504 | 200, -1 505 | -1 506 | 507 | 508 | 509 | 510 | 511 | 512 | 0 513 | 514 | 20 515 | 20 516 | 517 | 518 | 519 | 520 | 0 521 | wxALIGN_CENTER_VERTICAL 522 | 523 | 524 | 525 | 526 | 527 | 528 | 0 529 | wxALIGN_CENTER_VERTICAL 530 | 531 | -1 532 | 533 | 534 | 535 | 536 | 537 | 538 | 0 539 | 540 | 20 541 | 20 542 | 543 | 544 | 545 | 546 | 0 547 | wxALIGN_CENTER_VERTICAL 548 | 549 | 550 | 551 | 552 | 553 | 554 | 0 555 | wxALIGN_CENTER_VERTICAL 556 | 557 | 60, -1 558 | 1 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 0 567 | 568 | 20 569 | 10 570 | 571 | 572 | 573 | 574 | 0 575 | wxEXPAND 576 | 577 | wxHORIZONTAL 578 | 579 | 580 | 0 581 | wxALIGN_CENTER_VERTICAL 582 | 583 | 584 | 585 | 586 | 587 | 588 | 0 589 | 590 | 20 591 | 20 592 | 593 | 594 | 595 | 596 | 0 597 | wxALIGN_CENTER_VERTICAL 598 | 599 | 600 | 1 601 | 602 | 603 | 604 | 605 | 0 606 | 607 | 20 608 | 20 609 | 610 | 611 | 612 | 613 | 0 614 | wxALIGN_CENTER_VERTICAL 615 | 616 | 617 | 1 618 | 619 | 620 | 621 | 622 | 0 623 | wxEXPAND|wxALIGN_CENTER_VERTICAL 624 | 625 | 300, -1 626 | 627 | 628 | 629 | 630 | 0 631 | 632 | 10 633 | 20 634 | 635 | 636 | 637 | 638 | 0 639 | wxALIGN_CENTER_VERTICAL 640 | 641 | 642 | 643 | 644 | 645 | 646 | 0 647 | wxALIGN_CENTER_VERTICAL 648 | 649 | 0 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 0 660 | 661 | 20 662 | 10 663 | 664 | 665 | 666 | 667 | 0 668 | wxEXPAND 669 | 670 | 671 | 672 | 673 | 674 | 675 | 0 676 | 677 | 20 678 | 10 679 | 680 | 681 | 682 | 683 | 0 684 | wxEXPAND 685 | 686 | wxHORIZONTAL 687 | 688 | 689 | 0 690 | wxALIGN_CENTER_VERTICAL 691 | 692 | 693 | 694 | 695 | 696 | 697 | 0 698 | wxALIGN_CENTER_VERTICAL 699 | 700 | 701 | OnInputText 702 | 703 | 600, -1 704 | 705 | 706 | 707 | 708 | 0 709 | 710 | 5 711 | 20 712 | 713 | 714 | 715 | 716 | 0 717 | wxALIGN_CENTER_VERTICAL 718 | 719 | 720 | OnSelectInput 721 | 722 | 40, 40 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 0 732 | 733 | 20 734 | 10 735 | 736 | 737 | 738 | 739 | 0 740 | wxEXPAND 741 | 742 | wxHORIZONTAL 743 | 744 | 745 | 0 746 | wxALIGN_CENTER_VERTICAL 747 | 748 | 749 | 750 | 751 | 752 | 753 | 0 754 | wxALIGN_CENTER_VERTICAL 755 | 756 | 600, -1 757 | 1 758 | 759 | 760 | 761 | 762 | 0 763 | 764 | 10 765 | 20 766 | 767 | 768 | 769 | 770 | 0 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 0 781 | wxEXPAND 782 | 783 | 20 784 | 20 785 | 786 | 787 | 788 | 789 | 0 790 | wxEXPAND 791 | 792 | wxHORIZONTAL 793 | 794 | 795 | 0 796 | wxEXPAND 797 | 798 | from wx import InfoBar 799 | 800 | $parent 801 | $id 802 | 803 | 804 | 805 | 806 | 807 | 0 808 | 809 | 20 810 | 32 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 0 820 | 821 | 20 822 | 357 823 | 824 | 825 | 826 | 827 | 0 828 | wxEXPAND 829 | 830 | wxVERTICAL 831 | 832 | 833 | 0 834 | 835 | 836 | OnGenerate 837 | 838 | 120, -1 839 | 840 | 1 841 | 842 | 843 | 844 | 845 | 0 846 | 847 | 20 848 | 20 849 | 850 | 851 | 852 | 853 | 0 854 | 855 | 856 | OnAbout 857 | 858 | 120, -1 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 0 869 | 870 | 20 871 | 20 872 | 873 | 874 | 875 | 876 | 877 | 878 | 0 879 | 880 | 20 881 | 20 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 字帖生成器 2 | ========== 3 | 4 | 运行环境 5 | -------- 6 | 7 | * linux 8 | * svgwrite库生成svg模板 9 | * cairosvg转换成单页pdf 10 | * pdfrw合成整体pdf 11 | * pypinyin库合成拼音 12 | * wxPython生成界面 13 | 14 | 15 | 截图 16 | ---- 17 | 18 | 主界面 19 | 20 | * ![](snapshots/demo.png) 21 | 22 | 生成 23 | * ![](snapshots/print1.png) 24 | * ![](snapshots/print2.png) 25 | 26 | 27 | URL: 28 | 29 | Peng Shulin 2017 30 | 31 | -------------------------------------------------------------------------------- /app_dist/copybook_generator_setup_v1.1.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/app_dist/copybook_generator_setup_v1.1.exe -------------------------------------------------------------------------------- /build_copybook_generator_app.bat: -------------------------------------------------------------------------------- 1 | h: 2 | cd \src\github.copybook_generator\ 3 | 4 | python setup_CopybookGeneratorApp.py py2exe 5 | "c:\Program Files\Inno Setup 5\Compil32.exe" /cc CopybookGeneratorApp.iss 6 | 7 | pause 8 | -------------------------------------------------------------------------------- /msvcp90.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/msvcp90.dll -------------------------------------------------------------------------------- /setup_CopybookGeneratorApp.py: -------------------------------------------------------------------------------- 1 | #coding:utf-8 2 | from distutils.core import setup 3 | import py2exe 4 | 5 | setup( 6 | name=u'Copybook Generator', 7 | version='1.1', 8 | description='automatically generate copybooks', 9 | author='Peng Shulin', 10 | windows = [ 11 | { 12 | "script": "CopybookGeneratorApp.py", 13 | } 14 | ], 15 | options = { 16 | "py2exe": { 17 | "compressed": 1, 18 | "optimize": 2, 19 | "dist_dir": "dist", 20 | } 21 | }, 22 | ) 23 | -------------------------------------------------------------------------------- /snapshots/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/snapshots/demo.png -------------------------------------------------------------------------------- /snapshots/print1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/snapshots/print1.png -------------------------------------------------------------------------------- /snapshots/print2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/snapshots/print2.png -------------------------------------------------------------------------------- /三字经.txt: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /三字经/三字经(Kindle).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/三字经/三字经(Kindle).pdf -------------------------------------------------------------------------------- /三字经/三字经(中).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/三字经/三字经(中).pdf -------------------------------------------------------------------------------- /三字经/三字经(手机).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/三字经/三字经(手机).pdf -------------------------------------------------------------------------------- /三字经/三字经(抄写词语).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/三字经/三字经(抄写词语).pdf -------------------------------------------------------------------------------- /千字文.txt: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /千字文/千字文(Kindle).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/千字文/千字文(Kindle).pdf -------------------------------------------------------------------------------- /千字文/千字文(中).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/千字文/千字文(中).pdf -------------------------------------------------------------------------------- /千字文/千字文(大).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/千字文/千字文(大).pdf -------------------------------------------------------------------------------- /千字文/千字文(小).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/千字文/千字文(小).pdf -------------------------------------------------------------------------------- /千字文/千字文(手机).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/千字文/千字文(手机).pdf -------------------------------------------------------------------------------- /千字文/千字文(抄写单字).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/千字文/千字文(抄写单字).pdf -------------------------------------------------------------------------------- /千字文/千字文(抄写词语).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/千字文/千字文(抄写词语).pdf -------------------------------------------------------------------------------- /千字文/千字文(拼音).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/千字文/千字文(拼音).pdf -------------------------------------------------------------------------------- /千字文/千字文(极小).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/千字文/千字文(极小).pdf -------------------------------------------------------------------------------- /千字文_繁体.txt: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /千字文_繁体/千字文_繁体(手机).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/千字文_繁体/千字文_繁体(手机).pdf -------------------------------------------------------------------------------- /弟子规.txt: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /弟子规/弟子规(中).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/弟子规/弟子规(中).pdf -------------------------------------------------------------------------------- /弟子规/弟子规(手机).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/弟子规/弟子规(手机).pdf -------------------------------------------------------------------------------- /弟子规/弟子规(抄写词语).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/弟子规/弟子规(抄写词语).pdf -------------------------------------------------------------------------------- /百家姓.txt: -------------------------------------------------------------------------------- 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 | 董 128 | 梁 129 | 杜 130 | 阮 131 | 蓝 132 | 闵 133 | 席 134 | 季 135 | 麻 136 | 强 137 | 贾 138 | 路 139 | 娄 140 | 危 141 | 江 142 | 童 143 | 颜 144 | 郭 145 | 梅 146 | 盛 147 | 林 148 | 刁 149 | 钟 150 | 丘 151 | 徐 152 | 邱 153 | 骆 154 | 高 155 | 夏 156 | 蔡 157 | 田 158 | 樊 159 | 胡 160 | 凌 161 | 霍 162 | 虞 163 | 万 164 | 支 165 | 柯 166 | 昝 167 | 管 168 | 卢 169 | 莫 170 | 经 171 | 房 172 | 裘 173 | 缪 174 | 干 175 | 解 176 | 应 177 | 宗 178 | 丁 179 | 宣 180 | 贲 181 | 邓 182 | 单 183 | 杭 184 | 洪 185 | 包 186 | 诸 187 | 左 188 | 石 189 | 崔 190 | 吉 191 | 钮 192 | 龚 193 | 程 194 | 嵇 195 | 邢 196 | 滑 197 | 裴 198 | 陆 199 | 荣 200 | 翁 201 | 荀 202 | 羊 203 | 於 204 | 惠 205 | 甄 206 | 曲 207 | 家 208 | 封 209 | 芮 210 | 羿 211 | 储 212 | 靳 213 | 汲 214 | 邴 215 | 糜 216 | 松 217 | 井 218 | 段 219 | 富 220 | 巫 221 | 乌 222 | 焦 223 | 巴 224 | 弓 225 | 牧 226 | 隗 227 | 山 228 | 谷 229 | 车 230 | 侯 231 | 宓 232 | 蓬 233 | 全 234 | 郗 235 | 班 236 | 仰 237 | 秋 238 | 仲 239 | 伊 240 | 宫 241 | 宁 242 | 仇 243 | 栾 244 | 暴 245 | 甘 246 | 钭 247 | 厉 248 | 戎 249 | 祖 250 | 武 251 | 符 252 | 刘 253 | 景 254 | 詹 255 | 束 256 | 龙 257 | 叶 258 | 幸 259 | 司 260 | 韶 261 | 郜 262 | 黎 263 | 蓟 264 | 薄 265 | 印 266 | 宿 267 | 白 268 | 怀 269 | 蒲 270 | 台 271 | 从 272 | 鄂 273 | 索 274 | 咸 275 | 籍 276 | 赖 277 | 卓 278 | 蔺 279 | 屠 280 | 蒙 281 | 池 282 | 乔 283 | 阴 284 | 郁 285 | 胥 286 | 能 287 | 苍 288 | 双 289 | 闻 290 | 莘 291 | 党 292 | 翟 293 | 谭 294 | 贡 295 | 劳 296 | 逢 297 | 逄 298 | 姬 299 | 申 300 | 扶 301 | 堵 302 | 冉 303 | 宰 304 | 郦 305 | 雍 306 | 郤 307 | 璩 308 | 桑 309 | 桂 310 | 濮 311 | 牛 312 | 寿 313 | 通 314 | 边 315 | 扈 316 | 燕 317 | 冀 318 | 郏 319 | 浦 320 | 尚 321 | 农 322 | 温 323 | 别 324 | 庄 325 | 晏 326 | 柴 327 | 瞿 328 | 阎 329 | 充 330 | 慕 331 | 连 332 | 茹 333 | 习 334 | 宦 335 | 艾 336 | 鱼 337 | 容 338 | 向 339 | 古 340 | 易 341 | 慎 342 | 戈 343 | 廖 344 | 庚 345 | 终 346 | 暨 347 | 居 348 | 衡 349 | 步 350 | 都 351 | 耿 352 | 满 353 | 弘 354 | 匡 355 | 国 356 | 文 357 | 寇 358 | 广 359 | 禄 360 | 阙 361 | 东 362 | 欧 363 | 殳 364 | 沃 365 | 利 366 | 蔚 367 | 越 368 | 夔 369 | 隆 370 | 师 371 | 巩 372 | 厍 373 | 聂 374 | 晁 375 | 勾 376 | 敖 377 | 融 378 | 冷 379 | 訾 380 | 辛 381 | 阚 382 | 那 383 | 简 384 | 饶 385 | 空 386 | 曾 387 | 毋 388 | 沙 389 | 乜 390 | 养 391 | 鞠 392 | 须 393 | 丰 394 | 巢 395 | 关 396 | 蒯 397 | 相 398 | 查 399 | 荆 400 | 红 401 | 游 402 | 竺 403 | 权 404 | 逯 405 | 盖 406 | 益 407 | 桓 408 | 公 409 | 万俟 410 | 司马 411 | 上官 412 | 欧阳 413 | 夏侯 414 | 诸葛 415 | 闻人 416 | 东方 417 | 赫连 418 | 皇甫 419 | 尉迟 420 | 公羊 421 | 澹台 422 | 公冶 423 | 宗政 424 | 濮阳 425 | 淳于 426 | 单于 427 | 太叔 428 | 申屠 429 | 公孙 430 | 仲孙 431 | 轩辕 432 | 令狐 433 | 钟离 434 | 宇文 435 | 长孙 436 | 慕容 437 | 鲜于 438 | 闾丘 439 | 司徒 440 | 司空 441 | 亓官 442 | 司寇 443 | 仉督 444 | 子车 445 | 颛孙 446 | 端木 447 | 巫马 448 | 公西 449 | 漆雕 450 | 乐正 451 | 壤驷 452 | 公良 453 | 拓拔 454 | 夹谷 455 | 宰父 456 | 谷粱 457 | 晋 458 | 楚 459 | 阎 460 | 法 461 | 汝 462 | 鄢 463 | 涂 464 | 钦 465 | 段干 466 | 百里 467 | 东郭 468 | 南门 469 | 呼延 470 | 归 471 | 海 472 | 羊舌 473 | 微生 474 | 岳 475 | 帅 476 | 缑 477 | 亢 478 | 况 479 | 后 480 | 有 481 | 琴 482 | 梁丘 483 | 左丘 484 | 东门 485 | 西门 486 | 商 487 | 牟 488 | 佘 489 | 佴 490 | 伯 491 | 赏 492 | 南宫 493 | 墨 494 | 哈 495 | 谯 496 | 笪 497 | 年 498 | 爱 499 | 阳 500 | 佟 501 | 第五 502 | 言 503 | 福 504 | -------------------------------------------------------------------------------- /百家姓/百家姓(手机).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/百家姓/百家姓(手机).pdf -------------------------------------------------------------------------------- /百家姓/百家姓(拼音).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/百家姓/百家姓(拼音).pdf -------------------------------------------------------------------------------- /空白模板.txt: -------------------------------------------------------------------------------- 1 | _ -------------------------------------------------------------------------------- /空白模板/空白模板(中).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/空白模板/空白模板(中).pdf -------------------------------------------------------------------------------- /空白模板/空白模板(大).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/空白模板/空白模板(大).pdf -------------------------------------------------------------------------------- /空白模板/空白模板(小).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/空白模板/空白模板(小).pdf -------------------------------------------------------------------------------- /空白模板/空白模板(拼音).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pengshulin/copybook_generator/55d432771e47928ccab7d17c2b051808494cb6b9/空白模板/空白模板(拼音).pdf --------------------------------------------------------------------------------