##// END OF EJS Templates
Change default display mode for PDF Export to OneColumn (#19546)....
Jean-Philippe Lang -
r13917:03c87f3db142
parent child
Show More
@@ -1,152 +1,153
1 # encoding: utf-8
1 # encoding: utf-8
2 #
2 #
3 # Redmine - project management software
3 # Redmine - project management software
4 # Copyright (C) 2006-2015 Jean-Philippe Lang
4 # Copyright (C) 2006-2015 Jean-Philippe Lang
5 #
5 #
6 # This program is free software; you can redistribute it and/or
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License
7 # modify it under the terms of the GNU General Public License
8 # as published by the Free Software Foundation; either version 2
8 # as published by the Free Software Foundation; either version 2
9 # of the License, or (at your option) any later version.
9 # of the License, or (at your option) any later version.
10 #
10 #
11 # This program is distributed in the hope that it will be useful,
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
14 # GNU General Public License for more details.
15 #
15 #
16 # You should have received a copy of the GNU General Public License
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
19
20 require 'rbpdf'
20 require 'rbpdf'
21
21
22 module Redmine
22 module Redmine
23 module Export
23 module Export
24 module PDF
24 module PDF
25 class ITCPDF < RBPDF
25 class ITCPDF < RBPDF
26 include Redmine::I18n
26 include Redmine::I18n
27 attr_accessor :footer_date
27 attr_accessor :footer_date
28
28
29 def initialize(lang, orientation='P')
29 def initialize(lang, orientation='P')
30 @@k_path_cache = Rails.root.join('tmp', 'pdf')
30 @@k_path_cache = Rails.root.join('tmp', 'pdf')
31 FileUtils.mkdir_p @@k_path_cache unless File::exist?(@@k_path_cache)
31 FileUtils.mkdir_p @@k_path_cache unless File::exist?(@@k_path_cache)
32 set_language_if_valid lang
32 set_language_if_valid lang
33 super(orientation, 'mm', 'A4')
33 super(orientation, 'mm', 'A4')
34 set_print_header(false)
34 set_print_header(false)
35 set_rtl(l(:direction) == 'rtl')
35 set_rtl(l(:direction) == 'rtl')
36
36
37 @font_for_content = l(:general_pdf_fontname)
37 @font_for_content = l(:general_pdf_fontname)
38 @font_for_footer = l(:general_pdf_fontname)
38 @font_for_footer = l(:general_pdf_fontname)
39 set_creator(Redmine::Info.app_name)
39 set_creator(Redmine::Info.app_name)
40 set_font(@font_for_content)
40 set_font(@font_for_content)
41
41
42 set_header_font([@font_for_content, '', 10])
42 set_header_font([@font_for_content, '', 10])
43 set_footer_font([@font_for_content, '', 8])
43 set_footer_font([@font_for_content, '', 8])
44 set_default_monospaced_font(@font_for_content)
44 set_default_monospaced_font(@font_for_content)
45 set_display_mode('default', 'OneColumn')
45 end
46 end
46
47
47 def SetFontStyle(style, size)
48 def SetFontStyle(style, size)
48 set_font(@font_for_content, style, size)
49 set_font(@font_for_content, style, size)
49 end
50 end
50
51
51 def SetFont(family, style='', size=0, fontfile='')
52 def SetFont(family, style='', size=0, fontfile='')
52 # FreeSerif Bold Thai font has problem.
53 # FreeSerif Bold Thai font has problem.
53 style.delete!('B') if l(:general_pdf_fontname) == 'freeserif'
54 style.delete!('B') if l(:general_pdf_fontname) == 'freeserif'
54 # DejaVuSans Italic Arabic and Persian font has problem.
55 # DejaVuSans Italic Arabic and Persian font has problem.
55 style.delete!('I') if l(:general_pdf_fontname) == 'DejaVuSans'
56 style.delete!('I') if l(:general_pdf_fontname) == 'DejaVuSans'
56 super(family, style, size, fontfile)
57 super(family, style, size, fontfile)
57 end
58 end
58 alias_method :set_font, :SetFont
59 alias_method :set_font, :SetFont
59
60
60 def fix_text_encoding(txt)
61 def fix_text_encoding(txt)
61 RDMPdfEncoding::rdm_from_utf8(txt, "UTF-8")
62 RDMPdfEncoding::rdm_from_utf8(txt, "UTF-8")
62 end
63 end
63
64
64 def formatted_text(text)
65 def formatted_text(text)
65 Redmine::WikiFormatting.to_html(Setting.text_formatting, text)
66 Redmine::WikiFormatting.to_html(Setting.text_formatting, text)
66 end
67 end
67
68
68 def RDMCell(w ,h=0, txt='', border=0, ln=0, align='', fill=0, link='')
69 def RDMCell(w ,h=0, txt='', border=0, ln=0, align='', fill=0, link='')
69 cell(w, h, txt, border, ln, align, fill, link)
70 cell(w, h, txt, border, ln, align, fill, link)
70 end
71 end
71
72
72 def RDMMultiCell(w, h=0, txt='', border=0, align='', fill=0, ln=1)
73 def RDMMultiCell(w, h=0, txt='', border=0, align='', fill=0, ln=1)
73 multi_cell(w, h, txt, border, align, fill, ln)
74 multi_cell(w, h, txt, border, align, fill, ln)
74 end
75 end
75
76
76 def RDMwriteFormattedCell(w, h, x, y, txt='', attachments=[], border=0, ln=1, fill=0)
77 def RDMwriteFormattedCell(w, h, x, y, txt='', attachments=[], border=0, ln=1, fill=0)
77 @attachments = attachments
78 @attachments = attachments
78
79
79 css_tag = ' <style>
80 css_tag = ' <style>
80 table, td {
81 table, td {
81 border: 2px #ff0000 solid;
82 border: 2px #ff0000 solid;
82 }
83 }
83 th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; text-align: center; font-style: bold;}
84 th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; text-align: center; font-style: bold;}
84 pre {
85 pre {
85 background-color: #fafafa;
86 background-color: #fafafa;
86 }
87 }
87 </style>'
88 </style>'
88
89
89 # Strip {{toc}} tags
90 # Strip {{toc}} tags
90 txt.gsub!(/<p>\{\{([<>]?)toc\}\}<\/p>/i, '')
91 txt.gsub!(/<p>\{\{([<>]?)toc\}\}<\/p>/i, '')
91 writeHTMLCell(w, h, x, y, css_tag + txt, border, ln, fill)
92 writeHTMLCell(w, h, x, y, css_tag + txt, border, ln, fill)
92 end
93 end
93
94
94 def RDMwriteHTMLCell(w, h, x, y, txt='', attachments=[], border=0, ln=1, fill=0)
95 def RDMwriteHTMLCell(w, h, x, y, txt='', attachments=[], border=0, ln=1, fill=0)
95 txt = formatted_text(txt)
96 txt = formatted_text(txt)
96 RDMwriteFormattedCell(w, h, x, y, txt, attachments, border, ln, fill)
97 RDMwriteFormattedCell(w, h, x, y, txt, attachments, border, ln, fill)
97 end
98 end
98
99
99 def get_image_filename(attrname)
100 def get_image_filename(attrname)
100 atta = RDMPdfEncoding.attach(@attachments, attrname, "UTF-8")
101 atta = RDMPdfEncoding.attach(@attachments, attrname, "UTF-8")
101 if atta
102 if atta
102 return atta.diskfile
103 return atta.diskfile
103 else
104 else
104 return nil
105 return nil
105 end
106 end
106 end
107 end
107
108
108 def get_sever_url(url)
109 def get_sever_url(url)
109 if !empty_string(url) and (url[0, 1] == '/')
110 if !empty_string(url) and (url[0, 1] == '/')
110 Setting.host_name.split('/')[0] + url
111 Setting.host_name.split('/')[0] + url
111 else
112 else
112 url
113 url
113 end
114 end
114 end
115 end
115
116
116 def Footer
117 def Footer
117 set_font(@font_for_footer, 'I', 8)
118 set_font(@font_for_footer, 'I', 8)
118 set_x(15)
119 set_x(15)
119 if get_rtl
120 if get_rtl
120 RDMCell(0, 5, @footer_date, 0, 0, 'R')
121 RDMCell(0, 5, @footer_date, 0, 0, 'R')
121 else
122 else
122 RDMCell(0, 5, @footer_date, 0, 0, 'L')
123 RDMCell(0, 5, @footer_date, 0, 0, 'L')
123 end
124 end
124 set_x(-30)
125 set_x(-30)
125 RDMCell(0, 5, get_alias_num_page() + '/' + get_alias_nb_pages(), 0, 0, 'C')
126 RDMCell(0, 5, get_alias_num_page() + '/' + get_alias_nb_pages(), 0, 0, 'C')
126 end
127 end
127 end
128 end
128
129
129 class RDMPdfEncoding
130 class RDMPdfEncoding
130 def self.rdm_from_utf8(txt, encoding)
131 def self.rdm_from_utf8(txt, encoding)
131 txt ||= ''
132 txt ||= ''
132 txt = Redmine::CodesetUtil.from_utf8(txt, encoding)
133 txt = Redmine::CodesetUtil.from_utf8(txt, encoding)
133 txt.force_encoding('ASCII-8BIT')
134 txt.force_encoding('ASCII-8BIT')
134 txt
135 txt
135 end
136 end
136
137
137 def self.attach(attachments, filename, encoding)
138 def self.attach(attachments, filename, encoding)
138 filename_utf8 = Redmine::CodesetUtil.to_utf8(filename, encoding)
139 filename_utf8 = Redmine::CodesetUtil.to_utf8(filename, encoding)
139 atta = nil
140 atta = nil
140 if filename_utf8 =~ /^[^\/"]+\.(gif|jpg|jpe|jpeg|png)$/i
141 if filename_utf8 =~ /^[^\/"]+\.(gif|jpg|jpe|jpeg|png)$/i
141 atta = Attachment.latest_attach(attachments, filename_utf8)
142 atta = Attachment.latest_attach(attachments, filename_utf8)
142 end
143 end
143 if atta && atta.readable? && atta.visible?
144 if atta && atta.readable? && atta.visible?
144 return atta
145 return atta
145 else
146 else
146 return nil
147 return nil
147 end
148 end
148 end
149 end
149 end
150 end
150 end
151 end
151 end
152 end
152 end
153 end
General Comments 0
You need to be logged in to leave comments. Login now