Ticket #3481: wiki_to_pdf_clean_and_fix.patch
| File wiki_to_pdf_clean_and_fix.patch, 15.7 kB (added by airadier, 5 months ago) |
|---|
-
docs/cover/cover.html
old new 53 53 </P> 54 54 <P CLASS="western" ALIGN=JUSTIFY STYLE="margin-bottom: 0cm"><IMG SRC="/path/to/cover/logo.png" NAME="figura2" ALIGN=RIGHT BORDER=0 width="230px" height="72px"><BR CLEAR=LEFT><BR> 55 55 </P> 56 <P CLASS="western" ALIGN=RIGHT STYLE="margin-bottom: 0cm"><FONT FACE="Century Schoolbook L, serif"><FONT SIZE=2 STYLE="font-size: 11pt">#VERS AO#57 #DAT A#</FONT></FONT></P>56 <P CLASS="western" ALIGN=RIGHT STYLE="margin-bottom: 0cm"><FONT FACE="Century Schoolbook L, serif"><FONT SIZE=2 STYLE="font-size: 11pt">#VERSION# 57 #DATE#</FONT></FONT></P> 58 58 <P CLASS="western" ALIGN=JUSTIFY STYLE="margin-bottom: 0cm"><BR><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> 59 59 <P CLASS="western" ALIGN=JUSTIFY STYLE="margin-bottom: 0cm"><BR> 60 60 </P> -
setup.py
old new 7 7 8 8 setup( 9 9 name = 'TracWikiToPdfPlugin', 10 version = '2. 0',10 version = '2.1', 11 11 packages = ['wikitopdf'], 12 12 package_data={ 'wikitopdf' : [ 'templates/*.cs', 'htdocs/js/*.js' ] }, 13 13 author = "Diorgenes Felipe Grzesiuk", -
wikitopdf/formats.py
old new 21 21 import urllib2 22 22 import base64 23 23 24 from api import IWikiToPdfFormat 24 from api import IWikiToPdfFormat 25 from wikitopdf import wiki_to_pdf, html_to_pdf 25 26 26 27 EXCLUDE_RES = [ 27 28 re.compile(r'\[\[PageOutline([^]]*)\]\]'), … … 36 37 37 38 def wikitopdf_formats(self, req): 38 39 yield 'pdf', 'PDF' 39 # yield 'ps', 'PS'40 40 41 41 def process_wikitopdf(self, req, format, title, subject, pages, version, date, pdfname): 42 42 43 43 os.system("rm -f /tmp/tmp*wikitopdf") 44 44 45 # Dump all pages to HTML files46 files = [self._page_to_file('', req, p) for p in pages]45 # Dump all pages to HTML files 46 files = [self._page_to_file('', req, p) for p in pages] 47 47 48 48 #Setup the title and license pages 49 49 title_template = self.env.config.get('wikitopdf', 'titlefile') 50 titlefile = self.get_titlepage(title_template, title, subject, date, version)50 titlefile = title_template and self.get_titlepage(title_template, title, subject, date, version) or None 51 51 52 # File to write PDF to 53 pfile, pfilename = mkstemp('wikitopdf') 54 os.close(pfile) 52 # Prepare html doc arguments 53 codepage = self.env.config.get('trac', 'charset', 'iso-8859-1') 55 54 56 # Render 57 os.environ["HTMLDOC_NOCGI"] = 'yes' 58 codepage = self.env.config.get('trac', 'charset', 'iso-8859-1') 55 htmldoc_args = { 'book': '', 'format': 'pdf14', 'charset': codepage } 56 57 if titlefile: htmldoc_args['titlefile'] = titlefile 58 else: htmldoc_args['no-title'] = '' 59 59 60 htmldoc_format = {'pdf': 'pdf14', 'ps':'ps3'}[format] 60 htmldoc_args.update(dict(self.env.config.options('wikitopdf-admin'))) 61 62 #render 63 out = html_to_pdf(self.env, htmldoc_args, files) 61 64 62 htmldoc_args = { 'book': None, 'format': htmldoc_format, 'titlefile': titlefile, 'charset': codepage }63 64 htmldoc_args.update(dict(self.env.config.options('wikitopdf-admin')))65 66 args_string = ' '.join(['--%s %s' % (arg, value or '') for arg, value67 in htmldoc_args.iteritems()])68 69 cmd_string = 'htmldoc %s %s -f %s'%(args_string, ' '.join(files), pfilename)70 71 self.log.info('WikiToPdf: Running %r', cmd_string)72 os.system(cmd_string.encode('latin-1'))73 74 out = open(pfilename, 'rb').read()75 76 65 # Clean up 77 os.unlink(pfilename) 78 for f in files: 79 os.unlink(f) 66 if titlefile: os.unlink(titlefile) 67 for f in files: os.unlink(f) 80 68 81 69 # Send the output 82 70 req.send_response(200) 83 71 req.send_header('Content-Type', {'pdf':'application/pdf', 'ps':'application/postscript'}[format]) 84 req.send_header('Content-Disposition', 'attachment; filename=' + pdfname + '.pdf')72 #req.send_header('Content-Disposition', 'attachment; filename=' + pdfname + '.pdf') 85 73 req.send_header('Content-Length', len(out)) 86 74 req.end_headers() 87 75 req.write(out) 88 raise RequestDone 76 raise RequestDone 77 89 78 90 def _page_to_file(self, header, req, pagename , text=None):79 def _page_to_file(self, header, req, pagename): 91 80 """Slight modification of some code from Alec's PageToPdf plugin.""" 92 93 hfile, hfilename = mkstemp('wikitopdf') 94 codepage = self.env.config.get('trac', 'charset', 'iso-8859-1') 95 81 82 # htmldoc doesn't support utf-8, we need to use some other input encoding 83 codepage = self.env.config.get('trac', 'charset', 'iso-8859-1') 96 84 base_dir = self.env.config.get('wikitopdf', 'base_dir') 97 85 98 self.log.debug('WikiToPdf => Writting %s to %s using encoding %s', pagename, hfilename, codepage) 99 100 page = text 101 if text is None: 102 text = WikiPage(self.env, pagename).text 103 for r in EXCLUDE_RES: 104 text = r.sub('', text) 105 page = wiki_to_html(text, self.env, req).encode(codepage, 'replace') 106 107 self.log.debug('WikiToPdf => Page text is: %r', page) 108 109 imgpos = page.find('<img') 110 while imgpos != -1: 111 addrpos = page.find('src=', imgpos) 112 base_dir = base_dir.encode('ascii') 113 page = page[:addrpos+5] + base_dir + page[addrpos+5:] 114 imgpos = page.find('<img', addrpos) 115 116 page = page.replace('raw-attachment', 'attachments') 117 page = page.replace('?format=raw','') 118 page = page.replace('<pre class="wiki">', '<table align="center" width="95%" border="1" bordercolor="#d7d7d7"><tr>' 119 + '<td bgcolor="#f7f7f7"><pre class="wiki">') 120 page = page.replace('</pre>', '</pre></td></tr></table>') 121 page = page.replace('<table class="wiki">', '<table class="wiki" border="1" width="100%">') 122 123 self.log.debug('WikiToPdf => Page change text is: %r', page) 124 125 meta = ('<meta http-equiv="Content-Type" content="text/html; charset=%s"/>' % codepage).encode(codepage) 126 os.write(hfile, '<html><head>' + meta + '</head><body>' + page + '</body></html>') 86 page = wiki_to_pdf(WikiPage(self.env, pagename).text, self.env, req, base_dir, codepage) 87 88 hfile, hfilename = mkstemp('wikitopdf') 89 self.log.debug('WikiToPdf => Writting %s to %s using encoding %s', pagename, hfilename, codepage) 90 os.write(hfile, page) 127 91 os.close(hfile) 128 92 return hfilename 129 93 94 130 95 def get_titlepage(self, template_path, title, subject, version, date): 131 96 132 hfile, hfilename = mkstemp('wikitopdf') 133 codepage = Mimeview(self.env).default_charset 134 135 file_page = open(template_path, 'r') 136 string_page = file_page.read() 137 string_page = string_page.replace('#TITLE#', title) 138 string_page = string_page.replace('#SUBJECT#', subject) 139 string_page = string_page.replace('#VERSAO#', version) 140 string_page = string_page.replace('#DATA#', date) 141 os.write(hfile, string_page) 142 os.close(hfile) 143 return hfilename 144 97 hfile, hfilename = mkstemp('wikitopdf') 98 codepage = Mimeview(self.env).default_charset 99 100 try: 101 file_page = open(template_path, 'r') 102 string_page = file_page.read() 103 string_page = string_page.replace('#TITLE#', title) 104 string_page = string_page.replace('#SUBJECT#', subject) 105 string_page = string_page.replace('#VERSION#', version) 106 string_page = string_page.replace('#DATE#', date) 107 except: 108 os.close(hfile) 109 return None 110 111 os.write(hfile, string_page) 112 os.close(hfile) 113 114 return hfilename 115 -
wikitopdf/web_ui.py
old new 32 32 33 33 def get_htdocs_dirs(self): 34 34 from pkg_resources import resource_filename 35 return [('wikitopdf', resource_filename(__name__, 'htdocs'))]35 return [('wikitopdf', resource_filename(__name__, 'htdocs'))] 36 36 #return [] 37 37 38 38 # IAdminPanelsProvider methods … … 45 45 return handler 46 46 47 47 def post_process_request(self, req, template, data, content_type): 48 return template, data, content_type48 return template, data, content_type 49 49 50 50 def process_admin_request(self, req, cat, page, path_info): 51 51 allpages = list(WikiSystem(self.env).get_pages()) … … 62 62 if req.method == 'POST': 63 63 rightpages = req.args.get('rightpages_all') 64 64 title = req.args.get('title').encode('latin-1') or self.env.project_name.encode('latin-1') 65 subject = req.args.get('subject').encode('latin-1')65 subject = req.args.get('subject').encode('latin-1') 66 66 date = req.args.get('date').encode('latin-1'); 67 67 version = req.args.get('version').encode('latin-1'); 68 toctitle = req.args.get('toctitle')69 req.session['wikitopdf_rightpages'] = rightpages68 toctitle = req.args.get('toctitle') 69 req.session['wikitopdf_rightpages'] = rightpages 70 70 rightpages = rightpages.split(',') 71 71 format = req.args.get('format') 72 72 … … 85 85 req.hdf['wikitopdf.formats'] = formats 86 86 req.hdf['wikitopdf.default_format'] = formats.iterkeys().next() 87 87 88 add_script(req, 'wikitopdf/js/admin_wikitopdf.js')88 add_script(req, 'wikitopdf/js/admin_wikitopdf.js') 89 89 90 90 return 'admin_wikitopdf.cs', None 91 91 -
wikitopdf/wikitopdf.py
old new 12 12 import re 13 13 14 14 EXCLUDE_RES = [ 15 re.compile(r'\[\[PageOutline([^]]*)\]\]'),16 re.compile(r'\[\[TracGuideToc([^]]*)\]\]'),17 re.compile(r'----(\r)?$\n^Back up: \[\[ParentWiki\]\]', re.M|re.I)15 re.compile(r'\[\[PageOutline([^]]*)\]\]'), 16 re.compile(r'\[\[TracGuideToc([^]]*)\]\]'), 17 re.compile(r'----(\r)?$\n^Back up: \[\[ParentWiki\]\]', re.M|re.I) 18 18 ] 19 20 21 def wiki_to_pdf(text, env, req, base_dir, codepage): 22 23 #Remove exclude expressions 24 for r in EXCLUDE_RES: 25 text = r.sub('', text) 26 27 env.log.debug('WikiToPdf => Wiki intput for WikiToPdf: %r' % text) 28 29 page = wiki_to_html(text, env, req).encode(codepage, 'replace') 30 31 page = page.replace('attachment', 'attachments') 32 page = page.replace('?format=raw','') 33 page = page.replace('<pre class="wiki">', '<table align="center" width="95%" border="1" bordercolor="#d7d7d7">' 34 + '<tr><td bgcolor="#f7f7f7"><pre class="wiki">') 35 page = page.replace('</pre>', '</pre></td></tr></table>') 36 page = page.replace('<table class="wiki">', '<table class="wiki" border="1" width="100%">') 37 38 imgpos = page.find('<img') 39 40 while imgpos != -1: 41 addrpos = page.find('src=',imgpos) 42 page = page[:addrpos+5] + base_dir + page[addrpos+5:] 43 imgpos = page.find('<img', addrpos) 44 45 meta = ('<meta http-equiv="Content-Type" content="text/html; charset=%s"/>' % codepage).encode(codepage) 46 47 page = '<html><head>' + meta + '</head><body>' + page + '</body></html>' 48 49 env.log.debug('WikiToPdf => HTML output for WikiToPdf in charset %s is: %r' % (codepage, page)) 50 51 return page 52 53 def html_to_pdf(env, htmldoc_args, files): 54 os.environ["HTMLDOC_NOCGI"] = 'yes' 55 56 args_string = ' '.join(['--%s %s' % (arg, value or '') for arg, value 57 in htmldoc_args.iteritems() if value != None]) 58 59 pfile, pfilename = mkstemp('wikitopdf') 60 os.close(pfile) 61 62 cmd_string = 'htmldoc %s -f %s %s' % (args_string, pfilename, ' '.join(files)) 63 env.log.debug('WikiToPdf => Htmldoc command line: %s' % cmd_string) 64 os.system(cmd_string) 65 66 infile = open(pfilename, 'rb') 67 out = infile.read() 68 infile.close() 69 70 os.unlink(pfilename) 71 72 return out 73 74 19 75 20 76 class WikiToPdfPage(Component): 21 77 """Convert Wiki pages to PDF using HTMLDOC (http://www.htmldoc.org/).""" 22 78 implements(IContentConverter) 23 79 80 24 81 # IContentConverter methods 25 82 def get_supported_conversions(self): 26 yield ('pdf', 'WikiToPdf', 'pdf', 'text/x-trac-wiki', 'application/pdf', 7) 83 yield ('pdf', 'WikiToPdf', 'pdf', 'text/x-trac-wiki', 'application/pdf', 7) 27 84 28 85 def convert_content(self, req, input_type, text, output_type): 29 86 30 os.system("rm -f /tmp/tmp*wikitopdf") 87 # htmldoc doesn't support utf-8, we need to use some other input encoding 88 codepage = self.env.config.get('trac', 'charset', 'iso-8859-1') 89 base_dir = self.env.config.get('wikitopdf', 'base_dir') 90 91 page = wiki_to_pdf(text, self.env, req, base_dir, codepage) 31 92 32 base_dir = self.env.config.get('wikitopdf', 'base_dir') 33 34 hfile, hfilename = mkstemp('wikitopdf') 35 # htmldoc doesn't support utf-8, we need to use some other input encoding 36 37 codepage = self.env.config.get('trac', 'charset', 'iso-8859-1') 38 39 for r in EXCLUDE_RES: 40 text = r.sub('', text) 41 42 page = wiki_to_html(text, self.env, req).encode(codepage, 'replace') 43 44 self.env.log.debug('WikiToPdf => HTML output for WikiToPdf in charset: %s' % codepage) 45 self.env.log.debug('WikiToPdf => HTML intput for WikiToPdf: %s' % text) 46 47 page = page.replace('attachment', 'attachments') 48 page = page.replace('?format=raw','') 49 page = page.replace('<pre class="wiki">', '<table align="center" width="95%" border="1" bordercolor="#d7d7d7">' 50 + '<tr><td bgcolor="#f7f7f7"><pre class="wiki">') 51 page = page.replace('</pre>', '</pre></td></tr></table>') 52 page = page.replace('<table class="wiki">', '<table class="wiki" border="1" width="100%">') 53 54 imgpos = page.find('<img') 55 56 while imgpos != -1: 57 addrpos = page.find('src=',imgpos) 58 base_dir = base_dir.encode('ascii') 59 page = page[:addrpos+5] + base_dir + page[addrpos+5:] 60 imgpos = page.find('<img', addrpos) 61 62 self.env.log.debug('WikiToPdf => Html code: %r' % page) 63 64 meta = ('<meta http-equiv="Content-Type" content="text/html; charset=%s"/>' % codepage).encode(codepage) 65 66 os.write(hfile, '<html><head>' + meta + '</head><body>' + page + '</body></html>') 93 hfile, hfilename = mkstemp('wikitopdf') 94 os.write(hfile, page) 67 95 os.close(hfile) 68 96 69 pfile, pfilename = mkstemp('wikitopdf') 70 os.close(pfile) 97 htmldoc_args = { 'webpage': '', 'format': 'pdf14', 'charset': codepage } 98 htmldoc_args.update(dict(self.env.config.options('wikitopdf-page'))) 99 100 out = html_to_pdf(self.env, htmldoc_args, [hfilename]) 101 os.unlink(hfilename) 71 102 72 os.environ["HTMLDOC_NOCGI"] = 'yes'73 htmldoc_args = { 'webpage': None, 'format': 'pdf14', 'charset': codepage }74 75 htmldoc_args.update(dict(self.env.config.options('wikitopdf-page')))76 77 args_string = ' '.join(['--%s %s' % (arg, value or '') for arg, value78 in htmldoc_args.iteritems()])79 80 self.env.log.debug('WikiToPdf => Htmldoc code out: %s' % args_string)81 82 os.system('htmldoc %s %s -f %s' % (args_string, hfilename, pfilename))83 84 out = open(pfilename, 'rb').read()85 os.unlink(pfilename)86 os.unlink(hfilename)87 103 return (out, 'application/pdf')
