From b48d65e5d2da9f0f9ecd4182912366ceb4948061 Mon Sep 17 00:00:00 2001 From: as-op Date: Mon, 16 Feb 2026 17:12:45 +0100 Subject: [PATCH] [#70333] Support WebP images in PDF exports https://community.openproject.org/work_packages/70333 --- app/models/exports/pdf/common/attachments.rb | 12 +++++++++- spec/fixtures/files/image.webp | Bin 0 -> 68 bytes .../pdf_export/work_package_to_pdf_spec.rb | 22 ++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 spec/fixtures/files/image.webp diff --git a/app/models/exports/pdf/common/attachments.rb b/app/models/exports/pdf/common/attachments.rb index 79dab148534..3816fa3b5a9 100644 --- a/app/models/exports/pdf/common/attachments.rb +++ b/app/models/exports/pdf/common/attachments.rb @@ -42,7 +42,7 @@ module Exports::PDF::Common::Attachments end def pdf_embeddable?(content_type) - %w[image/jpeg image/png image/gif].include?(content_type) + %w[image/jpeg image/png image/gif image/webp].include?(content_type) end def delete_all_resized_images @@ -67,6 +67,7 @@ module Exports::PDF::Common::Attachments filename = local_file.path filename = convert_gif_to_png(filename) if attachment.content_type == "image/gif" + filename = convert_webp_to_png(filename) if attachment.content_type == "image/webp" resize_image(filename) end @@ -86,6 +87,15 @@ module Exports::PDF::Common::Attachments tmp_file end + def convert_webp_to_png(filename) + tmp_file = temp_image_file(".png") + + image = MiniMagick::Image.open(filename) + image.format("png") + image.write(tmp_file) + tmp_file + end + def attachment_by_api_content_src(src) return nil if src.empty? diff --git a/spec/fixtures/files/image.webp b/spec/fixtures/files/image.webp new file mode 100644 index 0000000000000000000000000000000000000000..bf5cf3b8a20a1dc5aa09b9a5bd1d03e1ba323a6f GIT binary patch literal 68 zcmWIYbaS&|U|6qr literal 0 HcmV?d00001 diff --git a/spec/models/work_packages/pdf_export/work_package_to_pdf_spec.rb b/spec/models/work_packages/pdf_export/work_package_to_pdf_spec.rb index eb07c9d20b2..b430fef29ff 100644 --- a/spec/models/work_packages/pdf_export/work_package_to_pdf_spec.rb +++ b/spec/models/work_packages/pdf_export/work_package_to_pdf_spec.rb @@ -376,6 +376,28 @@ RSpec.describe WorkPackage::PDFExport::WorkPackageToPdf do expect(exporter.send(:pdf_embeddable?, "image/png")).to be true expect(exporter.send(:pdf_embeddable?, "image/jpeg")).to be true expect(exporter.send(:pdf_embeddable?, "image/gif")).to be true + expect(exporter.send(:pdf_embeddable?, "image/webp")).to be true + end + end + + describe "with WebP image attachment" do + let(:webp_path) { Rails.root.join("spec/fixtures/files/image.webp") } + let(:webp_attachment) { Attachment.new author: user, file: File.open(webp_path) } + let(:attachments) { [webp_attachment] } + let(:description) do + <<~DESCRIPTION + This work package contains a WebP image. + ![](/api/v3/attachments/#{webp_attachment.id}/content) + DESCRIPTION + end + + before do + webp_attachment.save + end + + it "converts WebP images and includes them in the PDF export" do + expect(webp_attachment.content_type).to eq "image/webp" + expect(pdf[:images].length).to eq(1) end end