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