pdf_writing_tools 0.0.13 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8a14c40e1817a741cae4260b4e37b76bbcd86bc8e079414756794eea8ad0f0ce
4
- data.tar.gz: fdecb3e874950d20978c58048126d88c2c52c14021925cfaec09b7f702c4c574
3
+ metadata.gz: abc0c5dd8900c730c7f016b794bafa2da0fd3bb107e381f62289517c64c3d7ad
4
+ data.tar.gz: e73fe29e7dc36b1c743709bfa1d18e4af47775b740960b895346f07f10484810
5
5
  SHA512:
6
- metadata.gz: 4e8cff4cb4d7cae857f1abbd87a8509ff13ec0ed6b3c04880851cbacaede5057dd2f5222c2fd2bcc9bb0ed485b3d9d67abdfd1c090e38265c0fa35af92c3fcf3
7
- data.tar.gz: e1b38b8925c34e2b148e4b32ba3b47ed83d10c69ffc36ea279ff54206b154b173597768ed5d28e0bc51c8943a89a052354a9b3f6750ab266e7f339933cb24f31
6
+ metadata.gz: ce5ef7db92f5d41bd438f3d6119b6761c1b96dd248f6fa5a712c898af3a2827cdad2e3b097d40c10ab0b9f61185d80675805458af4ae8423d6ddc40a7739bca9
7
+ data.tar.gz: d4ce2bef3b3eef7f8b2919f4dfb6a40ff95b4fc75520777e7aed312b5cc9c82095a42f46ceeef62e242d5c2e24af5fe4950b290916d7884d5bf9af8759b078f4
@@ -14,16 +14,16 @@ module PdfWritingTools
14
14
  # span
15
15
  # Altri tag non in elenco, vengono ignorati o causano errore
16
16
  # Il tag <nothtml> ha lo scopo di sottolineare, che questo markup language non è html, anche
17
- # se programmando, cerco di renderlo il più simile possibile all'html.
18
-
17
+ # se programmando, cerco di renderlo il più simile possibile all'html.
18
+
19
19
  # L'oggetto xml, viene letto ricorsivamente. Si crea una lista, contenente
20
20
  # dei dizionari. Ciascun dizionario contiene:
21
- # Il nome di un'azione: :action_name
21
+ # Il nome di un'azione: :action_name
22
22
  # Una lista "data", contenente un dizionario con al suo interno le specifiche
23
23
  # da dare a prawn, per "disegnare" del testo o per disegnare un'immagine
24
24
  #
25
25
  # Le p
26
-
26
+
27
27
  def self.draw_xml_object(pdf, xml_object)
28
28
  # Ottengo una lista di azioni, ciascuna delle quali, quando eseguita,
29
29
  # permette di disegnare una parte del documento xml all'interno del pdf
@@ -42,7 +42,7 @@ module PdfWritingTools
42
42
  actions_list += PdfWritingToolsProcess.process_xml_obj(child, [])
43
43
  end
44
44
  end
45
- actions_list
45
+ actions_list + PdfWritingToolsActions.tr_action + PdfWritingToolsActions.tr_action + actions_list + actions_list
46
46
  end
47
47
 
48
48
 
@@ -55,11 +55,11 @@ module PdfWritingTools
55
55
  # x e y, indicano rispettivamente le coordinate x e y del vertice in alto a
56
56
  # sinistra del box.
57
57
  # Il vertice è relativo al margine superiore del pdf, contrariamente a quanto
58
- # accade quando si utilizzano le primitive prawn (dove il margine di riferimento è
58
+ # accade quando si utilizzano le primitive prawn (dove il margine di riferimento è
59
59
  # quello basso della pagina).
60
60
  # Bisogna pertanto prestare attenzione quando si dovessero mischiare primitive prawn
61
61
  # con queste funzioni.
62
- def self.draw_cell_fixed_height(pdf, x, y, w, h, t, opts={})
62
+ def self.draw_cell_fixed_height(pdf, x, y, w, h, t, opts={}, auto_y=false, no_background=false)
63
63
  t = (t.class == String ? [{text: t}] : t)
64
64
  font_size = opts[:font_size] || 10
65
65
  style = opts[:style] || :normal
@@ -76,6 +76,8 @@ module PdfWritingTools
76
76
  pdf_width = opts[:pdf_width] || 21.cm
77
77
 
78
78
  result = ''
79
+ y_pos1 = auto_y ? pdf.cursor : (pdf_height - y)
80
+ y_pos2 = auto_y ? pdf.cursor - top_padding : (pdf_height - y - top_padding)
79
81
 
80
82
  pdf.canvas do
81
83
  pdf.line_width = 0.5
@@ -84,35 +86,21 @@ module PdfWritingTools
84
86
  pdf.fill_color(background_color)
85
87
 
86
88
  # Disegna lo sfondo della cella
87
- pdf.fill_rectangle([x, pdf_height - y], w, h)
89
+ if no_background
90
+ else
91
+ pdf.fill_rectangle([x, y_pos1], w, h)
92
+ end
88
93
 
89
94
  pdf.stroke_color border_color
90
- pdf.stroke_rectangle([x, pdf_height - y], w, h)
95
+ pdf.stroke_rectangle([x, y_pos1], w, h)
91
96
 
92
97
  # Colore del testo nella cella
93
98
  pdf.fill_color(font_color)
94
- # Disegno il testo contenuto nella cella
95
- if false
96
- result = pdf.text_box(
97
- t,
98
- at: [x + left_padding, pdf_height - y - top_padding],
99
- width: w - left_padding - right_padding,
100
- height: h - top_padding - bottom_padding,
101
- size: font_size,
102
- style: style,
103
- align: align,
104
- valign: valign
105
- )
106
- end
107
-
108
- if true
109
- at = [x + left_padding, pdf_height - y - top_padding]
110
- width = w - left_padding - right_padding
111
- height = h - top_padding - bottom_padding + 1.cm
112
-
113
- pdf.formatted_text_box(t, width: width, height: height, at: at)
114
- end
115
99
 
100
+ at = [x + left_padding, y_pos2]
101
+ width = w - left_padding - right_padding
102
+ height = h - top_padding - bottom_padding + 1.cm
103
+ result = pdf.formatted_text_box(t, width: width, height: height, at: at, size: font_size, style: style, align: align, valign: valign)
116
104
  end
117
105
 
118
106
  result
@@ -124,64 +112,79 @@ module PdfWritingTools
124
112
  # della funzione).
125
113
  # Produce un dizionario, con l'altezza della cella disegnata ed eventuale testo non disegnato
126
114
  # (es. nel caso di sopraggiunto fine pagina).
127
- # Il campo draw_simulation, serve ad evitare che la cella venga realmente disegnata nel pdf.
115
+ # Il campo draw_simulation, serve ad evitare che la cella venga realmente disegnata nel pdf.
128
116
  # In questo modo, posso ottenere l'altezza, eventuale testo "avanzato" e prendere decisioni che
129
- # non dipendano da un'unica cella, ma da un gruppo di celle, come ad esempio quando devo
130
- # disegnare la riga di una tabella che essendo composta da più celle, ha un altezza
117
+ # non dipendano da un'unica cella, ma da un gruppo di celle, come ad esempio quando devo
118
+ # disegnare la riga di una tabella che essendo composta da più celle, ha un altezza
131
119
  # che dipende dall'altezza massima delle celle "autoridimensionanti" che la compongono.
132
- def self.draw_cell_auto_height(pdf, draw_simulation, x, y, w, t, opts={})
120
+ def self.draw_cell_auto_height(pdf, draw_simulation, x, y, w, t, opts={}, auto_y=false, no_background=false)
133
121
  font_size = opts[:font_size] || 10
134
122
  style = opts[:style] || :normal
135
123
  align = opts[:align] || :left
136
- valign = opts[:align] || :top
124
+ valign = opts[:valign] || :top
137
125
  font_color = opts[:font_color] || "000000"
138
126
  border_color = opts[:border_color] || "000000"
139
127
  background_color = opts[:background_color] || "FFFFFF"
140
- left_padding = opts[:left_padding] || 5
141
- right_padding = opts[:right_padding] || 5
142
- top_padding = opts[:top_padding] || 5
143
- bottom_padding = opts[:bottom_padding] || 5
144
- pdf_height = opts[:pdf_height] || 297.mm
145
- pdf_width = opts[:pdf_width] || 21.cm
146
-
128
+ left_padding = opts[:left_padding] || 5#
129
+ right_padding = opts[:right_padding] || 5#
130
+ top_padding = opts[:top_padding] || 5#
131
+ bottom_padding = opts[:bottom_padding] || 5#
132
+ pdf_height = opts[:pdf_height] || 297.mm #
133
+ pdf_width = opts[:pdf_width] || 21.cm #
134
+
135
+ t = (t.class == String ? [{text: t, size: font_size, color: font_color}] : t)
136
+
137
+
138
+
147
139
  result = 0
148
-
140
+ y_pos1 = auto_y ? (pdf.cursor - top_padding) : (pdf_height - y - top_padding)
141
+ y_pos2 = auto_y ? pdf.cursor : (pdf_height - y)
142
+
149
143
  pdf.canvas do
150
- # Non utilizzo l'helper (pdf.text_box), in quanto scriverebbe direttamente nel pdf
151
- # ma io ho bisogno di conoscere l'altezza del box di testo, prima di scriverlo, in
144
+ # Non utilizzo l'helper (pdf.formatted_text_box), in quanto scriverebbe direttamente nel pdf
145
+ # ma io ho bisogno di conoscere l'altezza del box di testo formattato, prima di scriverlo, in
152
146
  # modo da poter disegnare PRIMA lo sfondo
153
- b = Prawn::Text::Box.new(
154
- t || "",
155
- {:at => [x + left_padding, pdf_height - y - top_padding],
147
+
148
+
149
+ b = Prawn::Text::Formatted::Box.new(
150
+ t,
151
+ {:at => [x + left_padding, y_pos1 ],
156
152
  :width => w - left_padding-right_padding,
157
153
  :size => font_size,
158
154
  :style => style,
159
155
  :overflow => :expand,
160
- :document => pdf})
161
-
156
+ :document => pdf,
157
+ :align => align,
158
+ :valign => valign}) #valign ha un comportamento da indagare, mi fa uscire il testo fuori dal box
159
+
162
160
  # Effettuo il render, ma in modalità "prova" (dry_run = true), così posso conoscere quale sarà
163
161
  # l'altezza del box prima di disegnarlo
164
-
162
+
165
163
  text_overflow = b.render(:dry_run => true)
166
-
164
+ #text_overflow = text_overflow[:text] #### Temporaneo
165
+
167
166
  # Altezza del box, non ancora disegnato
168
167
  h = b.height
169
-
168
+
170
169
  if not draw_simulation
171
170
  # Se non sono in simulazione...
172
171
  # ... ora che conosco quale sarà l'altezza del box di testo, posso disegnare lo sfondo
173
172
  pdf.fill_color(background_color) # colore dello sfondo
174
173
  pdf.stroke_color(border_color) # Colore del bordo
175
-
176
- pdf.fill_and_stroke_rectangle([x,pdf_height-y], (w + left_padding + right_padding), (h+top_padding+bottom_padding))
177
-
174
+
175
+
176
+
177
+ if no_background
178
+ else
179
+ pdf.fill_and_stroke_rectangle([x, y_pos2], (w + left_padding + right_padding), (h+top_padding+bottom_padding))
180
+ end
178
181
  # ... e infine, sopra lo sfondo disegno il testo
179
182
  pdf.fill_color(font_color) # colore del testo
180
- text_overflow = b.render()
183
+ text_overflow = b.render()
181
184
 
182
185
  # text_overflow è l'eventuale testo avanzato
183
186
  end
184
-
187
+
185
188
  # La cella potrebbe non riuscire ad espandersi a sufficienza (troppo vicina al
186
189
  # fine pagine, quindi può essere che del testo "avanzi" )
187
190
  result = {height: h + top_padding + bottom_padding, overflow: text_overflow}
@@ -191,7 +194,7 @@ module PdfWritingTools
191
194
  end
192
195
 
193
196
 
194
- def self.draw_row_fixed_height(pdf, x, y, widths, height, texts, opts={})
197
+ def self.draw_row_fixed_height(pdf, x, y, widths, height, texts, opts={}, auto_y=false)
195
198
  font_sizes = opts[:font_sizes] || [10]
196
199
  styles = opts[:styles] || [:normal]
197
200
  alignments = opts[:alignments] || [:left]
@@ -202,7 +205,7 @@ module PdfWritingTools
202
205
  paddings = opts[:paddings] || [{left_padding: 5, right_padding: 5, top_padding: 5, bottom_padding: 5}]
203
206
  pdf_height = opts[:pdf_height] || 297.mm
204
207
  pdf_width = opts[:pdf_width] || 21.cm
205
-
208
+
206
209
  offset = 0
207
210
 
208
211
  widths.each_with_index do |width, i|
@@ -231,14 +234,15 @@ module PdfWritingTools
231
234
  cell_opts[:pdf_width] = 21.cm
232
235
  cell_opts[:pdf_height] = 297.mm
233
236
 
234
- draw_cell_fixed_height( pdf, x+offset, y, width, height, texts[i], cell_opts)
237
+ draw_cell_fixed_height( pdf, x+offset, y, width, height, texts[i], cell_opts, auto_y)
235
238
 
236
239
  offset += width
237
240
  end
241
+ pdf.cursor = pdf.cursor - height
238
242
  end
239
243
 
240
- # Produce la y su pdf, dove disegnare la prossima riga
241
- def self.draw_row_auto_height(pdf, draw_simulation, x, y, widths, texts, opts = {})
244
+ # Produce la y su pdf, dove disegnare la prossima riga
245
+ def self.draw_row_auto_height(pdf, draw_simulation, x, y, widths, texts, opts = {}, auto_y)
242
246
  font_sizes = opts[:font_sizes] || [10]
243
247
  styles = opts[:styles] || [:normal]
244
248
  alignments = opts[:alignments] || [:left]
@@ -290,7 +294,7 @@ module PdfWritingTools
290
294
  cell_opts[:pdf_height] = 297.mm
291
295
  cell_opts[:pdf_weigth] = 21.cm
292
296
 
293
- r = draw_cell_auto_height(pdf, draw_simulation = true, x+offset, y, width, texts[i], cell_opts)
297
+ r = draw_cell_auto_height(pdf, draw_simulation = true, x+offset, y, width, texts[i], cell_opts, auto_y)
294
298
 
295
299
  if r[:height] > max_cell_height
296
300
  max_cell_height = r[:height]
@@ -299,6 +303,8 @@ module PdfWritingTools
299
303
  offset += width
300
304
  end
301
305
 
306
+ # Non voglio che la riga ecceda il margine di pagina, quindi se così fosse
307
+ # ricalcolo l'altezza di riga per non superare tale margine
302
308
  if y + max_cell_height > pdf_height - pdf_margin_bottom
303
309
  max_cell_height = pdf_height - pdf_margin_bottom - y
304
310
  end
@@ -334,7 +340,7 @@ module PdfWritingTools
334
340
 
335
341
  # ...disegno le celle vere e proprie ad altezza fissa, con l'altezza
336
342
  # ricavata dal passo precedente.
337
- r = draw_cell_fixed_height(pdf, x+offset, y, width, max_cell_height, texts[i], opts)
343
+ r = draw_cell_fixed_height(pdf, x+offset, y, width, max_cell_height, texts[i], opts, auto_y)
338
344
 
339
345
  # Gli eventuali "testi residui" (es. raggiunto fine pagina) li raccolgo
340
346
  # nel seguente array
@@ -357,19 +363,24 @@ module PdfWritingTools
357
363
  end
358
364
  end
359
365
 
366
+ pdf.cursor = pdf_height - new_y
367
+
360
368
  return new_y
361
369
  end
362
370
 
371
+ # Se tutte le stringhe nella lista sono "" (stringa vuota) produce false
372
+ # altrimenti produce true.
363
373
  def self.check_no_empty_string_presence(string_list)
364
- string_list.each do |string_element|
365
- if string_element != ""
374
+ string_list.each do |string_element|
375
+ if string_element != "" and string_element != []
366
376
  return true
367
377
  end
368
378
  end
379
+
369
380
  return false
370
381
  end
371
382
 
372
- # Dato il percorso file_path, genera un documento xml, a cui sono stati rimossi gli
383
+ # Dato il percorso file_path, genera un documento xml, a cui sono stati rimossi gli
373
384
  # a capo e gli spazi multipli
374
385
  def self.get_cleaned_xml_from_file(file_path)
375
386
  text = File.read(file_path)
@@ -380,6 +391,6 @@ module PdfWritingTools
380
391
  # Rimuove le spaziature multiple sostituendole con uno spazio
381
392
  text = text.gsub(/\s+/, ' ')
382
393
 
383
- Nokogiri::XML(text)
394
+ Nokogiri::XML(text)
384
395
  end
385
396
  end
@@ -1,26 +1,28 @@
1
- # Questo modulo, si occupa di
1
+ # Questo modulo, si occupa di
2
2
 
3
3
 
4
4
  # Le action, definiscono, cosa deve essere fatto (scritto, colorato, disegnato) nel pdf
5
5
  # La forma di una action è una coppia (nome_action, dati_per_la_action)
6
6
  # L'esecuzione di una action consiste nel realizzare la action usando i dati ad essa associati
7
- # Quando l'oggetto xml che rappresenta il mio documento pdf da realizzare viene processato,
8
- # viene creata una catena (lista) di action.
9
- # Alcune action consecutive, possono essere "fuse" tra loro in un'unica action, così da
10
- # efficientare il processo di scrittura del file pdf.
7
+ # Quando l'oggetto xml che rappresenta il mio documento pdf da realizzare viene processato,
8
+ # viene creata una catena (lista) di action.
9
+ # Alcune action consecutive, possono essere "fuse" tra loro in un'unica action, così da
10
+ # efficientare il processo di scrittura del file pdf (eseguire singolarmente le action di
11
+ # scrittura testo ad esempio, rallenta molto la scrittura del pdf).
11
12
  # Ogni singola action, viene poi eseguita, utilizzando le funzioni di prawn.
12
13
 
13
- # Nella parte PUBLIC di questa classe, inserire solo metodi che generino action
14
- # La classe PdfWritingToolsProcess, userà i metodi pubblic di questa classe per generare
15
- # una list di action. Fornendo la lista di actions al metodo
14
+ # Nella parte PUBLIC di questa classe, inserire solo metodi che generino action (ma non le eseguono)
15
+ # La classe PdfWritingToolsProcess, userà i metodi pubblic di questa classe per generare
16
+ # una list di action. Fornendo la lista di actions al metodo
16
17
  # PdfWritingToolsActions.execute_actions, verrà dato il via all'esecuzione delle actions...
17
18
 
18
- # Nella parte PRIVATE di questa classe, inserire solo metodi che eseguano le action
19
+ # Nella parte PRIVATE di questa classe, inserire solo metodi che eseguano le action (
20
+ # ossia che realizzino la scrittura del pdf)
19
21
  # ... le singole actions, verrano eseguite tramite i metodi privati di questa classe
20
22
 
21
23
  module PdfWritingToolsActions
22
24
  # Esegue le azioni, andando a concatenare quelle "contigue" nella lista,
23
- # che riguardano la scrittura di testo.
25
+ # che riguardano la scrittura di testo.
24
26
  # La lista actions, in sostanza comprende più azioni. Quelle contigue che riguardano
25
27
  # la scrittura di testo, non vanno eseguite singolarmente, ma devono essere "fuse"
26
28
  # e poi eseguite. Le action che riguardano la "scrittura" di un immagine invece, non
@@ -31,6 +33,8 @@ module PdfWritingToolsActions
31
33
  last_actn_name, data = text_action(pdf, action, last_actn_name, data)
32
34
  elsif action[:action_name] == :draw_image
33
35
  last_actn_name, data = img_action(pdf, action, last_actn_name, data)
36
+ elsif action[:action_name] == :draw_tr
37
+ last_actn_name, data = draw_tr(pdf, action, last_actn_name, data)
34
38
  end
35
39
  end
36
40
 
@@ -43,6 +47,8 @@ module PdfWritingToolsActions
43
47
  [{ action_name: :draw_formatted_text, data: [{ text: "\n" }] }]
44
48
  end
45
49
 
50
+ # Per "atomic_text" si intende testo che non contiene ulteriore "struttura"
51
+ # pesudo html
46
52
  def self.atomic_text_action(atomic_text)
47
53
  [{ action_name: :draw_formatted_text, data: [{ text: atomic_text }] }]
48
54
  end
@@ -66,7 +72,8 @@ module PdfWritingToolsActions
66
72
  def self.bullet_action
67
73
  [
68
74
  {
69
- action_name: :draw_image, data:
75
+ action_name: :draw_image,
76
+ data:
70
77
  {
71
78
  url: File.expand_path("../../assets/bullet.png", __FILE__)
72
79
  # Pallino
@@ -75,8 +82,79 @@ module PdfWritingToolsActions
75
82
  ]
76
83
  end
77
84
 
85
+ def self.tr_action(xml_obj=nil, widths=nil)
86
+ text = "<tr><td>Uno</td><td>Due</td><td>Tre</td><td>Quattro</td></tr>"
87
+ widths = [2.cm, 2.cm, 3.cm, 4.cm]
88
+ xml_obj = Nokogiri::XML(text)
89
+ [
90
+ {
91
+ action_name: :draw_tr,
92
+ data:
93
+ {
94
+ xml_obj: xml_obj,
95
+ widths: widths
96
+ }
97
+ }
98
+ ]
99
+ end
100
+
101
+
102
+
78
103
  private
79
104
 
105
+ # Funzione di Prawn che devo capir bene come utilizzare per la generazione
106
+ # delle tabelle
107
+
108
+ ####### FORMATTED TEXT BOX (formatted_text_box)
109
+ # formatted_text_box
110
+ # https://prawnpdf.org/docs/0.11.1/Prawn/Text/Formatted.html
111
+
112
+ # Accetta due parametri: un array di dizionari e (facoltativo) un dizionario di opzioni
113
+
114
+ # ARRAY DI DIZIONARI
115
+ # Ciascun dizionario, contiene il testo da disegnare e informazioni su come
116
+ # formattarlo.
117
+
118
+ # DIZIONARIO DI OPZIONI
119
+
120
+ # Come disegnare testo formattato
121
+ # Posso usare due metodi
122
+
123
+ # (entrambi i metodi alla fine, forniscono informazioni sull'altezza del BOX
124
+ # disegnato e sul testo eventualmente non disegnato)
125
+
126
+ ##### METODO 1 - In un'unica fase
127
+ # Utilizzo una funzione di convenienza che disegna immediatamente nel pdf:
128
+ # formatted_text_box
129
+
130
+ ##### METODO 2 - In due fasi
131
+ # - Genero un oggetto con gli stessi parametri di formatted_text_box:
132
+ # oggetto = Prawn::Text::Formatted.new(array_di_dizionari, dizionario_di_opzioni)
133
+ # - Eseguo il rendering dell'oggetto
134
+ # formatted_text_not_rendered_or_overflow = oggetto.render(:dry_run => false)
135
+ # oggetto.height # altezza del box
136
+ #
137
+ # :dry_run true o false, mi permette di scrivere nel pdf o simulare la scrittura
138
+ # così da avere informazioni sulla dimensione del box da disegnare senza disegnarlo
139
+ # effettivamente. Perché?
140
+ # Supponiamo di dover disegnare la riga di una tabella, dove ciascuna cella
141
+ # della riga, contenga del testo formattato. Le celle della riga possono avere
142
+ # larghezze differenti, ma devono avere tutte la stessa altezza... ma quale
143
+ # altezza? Se definisco un'altezza fissa, c'è la possibilità che testo in
144
+ # eccesso all'interno di una cella venga tagliato, oppure che ci sia troppo
145
+ # spazio non utilizzato in tutte le celle (il che è visivamente brutto).
146
+ # Se utilizzo l'autoridimensionamento del formatted_text_box, offerto da prawn,
147
+ # avrò ciascuna cella con un altezza differente... Utilizzando invece la
148
+ # "simulazione", prima disegno (in modalità simulata :dry_run => true) la
149
+ # riga delle tabella con celle ad altezza autoridimensionata, in questo modo
150
+ # posso capire qual'è l'altezza di cella massima e se una di queste celle
151
+ # provoca un salto pagina (nel disegno di box autoridimensionati, l'Altezza
152
+ # del box, non eccede il salto pagina ed il testo che non può essere disegnato
153
+ # a causa del salto pagina, mi viene restituito dalla funzione di rendering).
154
+ # Successivamente disegno la riga vera e propria,
155
+ # questa volta, indicando un'altezza fissa per ciascuna cella (l'altezza massima
156
+ # di cella ottenuta nella simulazione).
157
+
80
158
  # Esegue un'azione, andando a scrivere del testo nel PDF, oppure un'immagine
81
159
  def self.execute_action(pdf, action_name, data)
82
160
  if action_name == :draw_formatted_text
@@ -85,50 +163,55 @@ module PdfWritingToolsActions
85
163
  # Il testo disegnato dopo un immagine, non appare allineato. Per questo
86
164
  # motivo, disegno l'immagine un' po' prima di dove è previsto (spostando il cursore)
87
165
  # per poi ripristinare la posizione originaria del cursore.
88
-
166
+
89
167
  # L'operazione di cui sopra, non va eseguita a fondo pagina, altrimenti,
90
168
  # il salto pagina automatico crea problemi sulla realizzazione del pdf,
91
169
  # quindi...
92
-
170
+
93
171
  # Se la posizione del cursore (misurata, dal fondo margine di pagina)
94
172
  # è inferiore ad un cm, mi sposto direttamente sulla nuova pagina..
95
173
  if pdf.cursor <= 1.cm
96
174
  pdf.start_new_page
97
175
  end
98
-
176
+
99
177
  current_cursor_position = pdf.cursor
100
178
  # Anticipo il disegno dell'immagine spostando il cursore di n unità verso
101
179
  # l'alto
102
180
  n = 0
103
181
  pdf.move_cursor_to(current_cursor_position - n)
104
-
182
+
105
183
  # Disegno l'immagine (al momento questo metodo disegna solo il "bullet" degli elenchi)
106
184
  pdf.image(data[:url], height: 6, width: 6)
107
-
185
+
108
186
  # Ripristino la posizione originaria del cursore, in modo che il testo
109
187
  # sia allineato all'immagine preceente
110
188
  pdf.move_cursor_to(current_cursor_position)
111
- elsif action_name == :draw_rectangle
189
+ elsif action_name == :draw_tr
190
+ xml_obj = data[:xml_obj]
191
+ widths = data[:widths]
112
192
 
193
+ current_cursor_position = 297.mm - pdf.cursor
194
+
195
+ PdfWritingTools::draw_row_auto_height(pdf, false, 2.cm, current_cursor_position, widths, ["uno", "due", "tre", "quattro"], opts = {}, true)
113
196
  end
114
197
  end
115
-
198
+
116
199
  # Esegue last_action, oppure concatena i dati di action e di last_action
117
200
  # action: azione "corrente"
118
201
  # last_action_name: nome dell'azione che precede l'azione corrente
119
202
  # data: dati dell'azione che precede l'azione corrente
120
203
  def self.text_action(pdf, action, last_action_name, data)
121
204
  if last_action_name.nil?
122
- # Prima azione della lista (last_action_name = nil), quindi per ora
205
+ # Prima azione della lista (last_action_name = nil), quindi per ora
123
206
  # nessun concatenamento di dati
124
207
  data = action[:data]
125
208
  elsif last_action_name == :draw_formatted_text
126
209
  # La action attuale richiede di "disegnare" testo formattato, come l'ultima azione
127
- # quindi, concateno i dati di questa action, con quelli dell'ultima action
210
+ # quindi, concateno i dati di questa action, con quelli dell'ultima action
128
211
  data += action[:data]
129
212
  else
130
213
  # La action attuale, differisce dall'ultima, quindi eseguo l'ultima action (che sarà
131
- # un'immagine visto che quella attuale è il disegno di testo) e produco i dati di
214
+ # un'immagine visto che quella attuale è il disegno di testo) e produco i dati di
132
215
  # quella corrente
133
216
  execute_action(pdf, last_action_name, data)
134
217
  data = action[:data]
@@ -136,7 +219,7 @@ module PdfWritingToolsActions
136
219
 
137
220
  [:draw_formatted_text, data]
138
221
  end
139
-
222
+
140
223
  # Mentre la "scrittura/disegno" del testo, puo' essere "concatenato", nel caso
141
224
  # delle immagini no. Una action sull' immagine pertanto, interrompe la
142
225
  # possibilita' di concatenare i data delle action di testo. Quindi, eseguo
@@ -146,4 +229,10 @@ module PdfWritingToolsActions
146
229
  execute_action(pdf, last_action_name, data) unless last_action_name.nil?
147
230
  [:draw_image, action[:data]]
148
231
  end
149
- end
232
+
233
+
234
+ def self.draw_tr(pdf, action, last_action_name, data)
235
+ execute_action(pdf, last_action_name, data) unless last_action_name.nil?
236
+ [:draw_tr, action[:data]]
237
+ end
238
+ end
@@ -58,17 +58,17 @@ module PdfWritingToolsProcess
58
58
  # lista indicato da li
59
59
  def self.process_xml_tag_li(xml_obj, _properties, idx=nil)
60
60
  actions_list = []
61
-
61
+
62
62
  xml_obj.children.each do |child|
63
63
  actions_list += process_xml_obj(child, [])
64
64
  end
65
-
65
+
66
66
  if idx
67
67
  PdfWritingToolsActions.new_line_action + PdfWritingToolsActions.atomic_text_action(idx) + PdfWritingToolsActions.indent_action(4) + actions_list
68
- else
68
+ else
69
69
  PdfWritingToolsActions.new_line_action + PdfWritingToolsActions.bullet_action + PdfWritingToolsActions.indent_action(4) + actions_list
70
70
  end
71
- end
71
+ end
72
72
 
73
73
  # Produce le "actions" che permettono di disegnare nel PDF, il contenuto
74
74
  # del tag p
@@ -77,24 +77,26 @@ module PdfWritingToolsProcess
77
77
  xml_obj.children.each do |child|
78
78
  actions_list += process_xml_obj(child, properties)
79
79
  end
80
+
80
81
  PdfWritingToolsActions.new_line_action + actions_list
81
82
  end
82
83
 
83
- # Al momento assumo che h1 contenga solo testo, poi eventualmente
84
+ # Al momento assumo che h1 contenga solo testo, poi eventualmente
84
85
  # renderla ricorsiva permettendo a h1 di contenere altri tag.
85
86
  # Sebbene l'xml che sto processando non sia vero html, voglio cercare di dargli
86
- # il più possibile lo stesso comportamento. All'interno di h1, possono essere
87
+ # il più possibile lo stesso comportamento. All'interno di h1, possono essere
87
88
  # presenti solo elementi inline. Al momento non controllo questa cosa, quindi preferisco
88
89
  # tagliare la testa al toro, assumento che h1 contenga solo testo.
89
90
  def self.process_xml_tag_h1(xml_obj, properties)
90
91
  actions_list = process_xml_text(xml_obj.child, [:bold], 16, true)
91
- PdfWritingToolsActions.new_line_action + actions_list + PdfWritingToolsActions.new_line_action * 2
92
+
93
+ PdfWritingToolsActions.new_line_action + actions_list + PdfWritingToolsActions.new_line_action * 2
92
94
  end
93
95
 
94
- # Al momento assumo che span contenga solo testo, poi eventualmente
96
+ # Al momento assumo che span contenga solo testo, poi eventualmente
95
97
  # renderla ricorsiva permettendo a span di contenere altri tag.
96
98
  # Sebbene l'xml che sto processando non sia vero html, voglio cercare di dargli
97
- # il più possibile lo stesso comportamento. All'interno di span, possono essere
99
+ # il più possibile lo stesso comportamento. All'interno di span, possono essere
98
100
  # presenti solo elementi inline. Al momento non controllo questa cosa, quindi preferisco
99
101
  # tagliare la testa al toro, assumento che span contenga solo testo.
100
102
  def self.process_xml_tag_span(xml_obj, properties)
@@ -103,7 +105,7 @@ module PdfWritingToolsProcess
103
105
  color = "#000000"
104
106
 
105
107
  if span_styles_attributes.has_key?("color")
106
- color = span_styles_attributes["color"]
108
+ color = span_styles_attributes["color"]
107
109
  end
108
110
 
109
111
  actions_list = process_xml_text(xml_obj.child, properties, size=12, upcase=false, color)
@@ -111,11 +113,30 @@ module PdfWritingToolsProcess
111
113
 
112
114
 
113
115
 
116
+ def self.process_xml_tag_table(xml_obj, properties)
117
+ # Processo i figli della tabella che devono essere due
118
+ # thead
119
+ # tbody
120
+ xml_obj.children.each do |child|
121
+ end
122
+
123
+ p xml_obj[:width]
124
+ p 20.cm / 7.0
125
+ []
126
+ end
127
+
128
+
129
+ def self.process_xml_tag_tr(xml_obj, properties)
130
+
131
+
132
+ end
133
+
134
+
114
135
  # Produce le actions necessarie per disegnare nel PDF un determinato
115
136
  # "tag"
116
137
  def self.process_xml_obj(xml_obj, properties, attributes={})
117
138
  case xml_obj.name
118
- when 'text', 'b', 'i', 'ul', 'li', 'p', 'h1', 'ol', 'span'
139
+ when 'text', 'b', 'i', 'ul', 'li', 'p', 'h1', 'ol', 'span', 'table'
119
140
  @process_xml_tag_table[xml_obj.name].call(xml_obj, properties)
120
141
  when 'br'
121
142
  PdfWritingToolsActions.new_line_action
@@ -126,13 +147,13 @@ module PdfWritingToolsProcess
126
147
 
127
148
  def self.string_to_attributes(s)
128
149
  result = {}
129
-
150
+
130
151
  s.split(";").each do |el|
131
152
  e = el.split(":")
132
- result[e[0]] = e[1]
153
+ result[e[0]] = e[1]
133
154
  end
134
-
135
- result
155
+
156
+ result
136
157
  end
137
158
 
138
159
  @process_xml_tag_table =
@@ -145,6 +166,8 @@ module PdfWritingToolsProcess
145
166
  'ol' => method(:process_xml_tag_ol),
146
167
  'li' => method(:process_xml_tag_li),
147
168
  'p' => method(:process_xml_tag_p),
148
- 'h1' => method(:process_xml_tag_h1)
169
+ 'h1' => method(:process_xml_tag_h1),
170
+ 'table' => method(:process_xml_tag_table),
171
+ 'tr' => method(:process_xml_tag_tr)
149
172
  }
150
173
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdf_writing_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - JSalvo1978
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-07 00:00:00.000000000 Z
11
+ date: 2024-01-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Plugin for write pdf in a simplified manner, using prawn as backend
14
14
  email: