From 1e1ae1ce3bcb14e048807e2649ec59eaad560fa1 Mon Sep 17 00:00:00 2001 From: david Date: Sun, 21 Jul 2024 02:15:06 +0200 Subject: [PATCH] Improve formatting of rich text in pdf --- Gemfile | 1 + Gemfile.lock | 5 +++++ app/helpers/pdf_helper.rb | 9 +++++++++ app/views/reports/show.pdf.prawn | 15 +++++++++------ 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index 2bb2912..ae0eaaa 100644 --- a/Gemfile +++ b/Gemfile @@ -52,6 +52,7 @@ gem 'caxlsx' gem 'caxlsx_rails' gem 'image_processing', '~> 1.2' gem 'pagy', '~> 9.0' +gem 'prawn-markup' gem 'prawn-rails' gem 'sablon' diff --git a/Gemfile.lock b/Gemfile.lock index 5acfb48..be83bc7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -188,6 +188,10 @@ GEM matrix (~> 0.4) pdf-core (~> 0.10.0) ttfunk (~> 1.8) + prawn-markup (1.0.0) + nokogiri + prawn + prawn-table prawn-rails (1.4.2) actionview (>= 3.1.0) prawn @@ -352,6 +356,7 @@ DEPENDENCIES jbuilder jsbundling-rails pagy (~> 9.0) + prawn-markup prawn-rails puma (>= 5.0) rails (~> 7.1.3, >= 7.1.3.4) diff --git a/app/helpers/pdf_helper.rb b/app/helpers/pdf_helper.rb index 9ebed48..825b788 100644 --- a/app/helpers/pdf_helper.rb +++ b/app/helpers/pdf_helper.rb @@ -1,8 +1,17 @@ module PdfHelper def prepare_rich_text(rich_text) + return rich_text + + { del: 'strikethrough' }.each do |tag, replacement| + rich_text = rich_text.to_s.gsub("<#{tag}", "<#{replacement}") + rich_text = rich_text.to_s.gsub("", "") + end + %w[div p del blockquote pre code].each do |tag| rich_text = rich_text.to_s.gsub(%r{<#{tag}.*?>|}, '') end + rich_text.gsub!(//, '') + rich_text.gsub!(%r{}, '

') rich_text end end diff --git a/app/views/reports/show.pdf.prawn b/app/views/reports/show.pdf.prawn index 120e0a0..349c641 100644 --- a/app/views/reports/show.pdf.prawn +++ b/app/views/reports/show.pdf.prawn @@ -1,14 +1,17 @@ prawn_document do |pdf| - pdf.text @report.name + pdf.markup_options = { + heading1: { style: :bold, size: 14, margin_bottom: 10, margin_top: 20 } + } + pdf.text @report.name, size: 22, style: :bold, align: :center @report.elements.each do |element| - pdf.text element.title + pdf.text element.title, size: 16, style: :bold pdf.text element.path - pdf.text prepare_rich_text(element.description_html), inline_format: true + pdf.markup prepare_rich_text(element.description_html.to_s), inline_format: true element.success_criteria.each do |success_criterion| - pdf.text success_criterion.title - pdf.text prepare_rich_text(success_criterion.description_html), inline_format: true - pdf.text prepare_rich_text(success_criterion.comment_html), inline_format: true + pdf.text success_criterion.title, size: 14, style: :bold + pdf.markup prepare_rich_text(success_criterion.description_html.to_s), inline_format: true + pdf.markup prepare_rich_text(success_criterion.comment_html.to_s), inline_format: true end end end