Bug 41601 - Bug 38516 breaks PDF export for basket groups when using API2::PDF < 2.042
Summary: Bug 38516 breaks PDF export for basket groups when using API2::PDF < 2.042
Status: Failed QA
Alias: None
Product: Koha
Classification: Unclassified
Component: Acquisitions (show other bugs)
Version: Main
Hardware: All All
: P5 - low critical
Assignee: David Cook
QA Contact: Testopia
URL:
Keywords:
Depends on: 38516
Blocks:
  Show dependency treegraph
 
Reported: 2026-01-13 14:42 UTC by Katrin Fischer
Modified: 2026-01-21 22:02 UTC (History)
6 users (show)

See Also:
GIT URL:
Initiative type: ---
Sponsorship status: ---
Comma delimited list of Sponsors:
Crowdfunding goal: 0
Patch complexity: ---
Documentation contact:
Documentation submission:
Text to go in the release notes:
This fixes the PDF export for basket groups when the Debian or Ubuntu operating system is using a version of the API2::PDF Perl module that is less than version 2.042 (includes Debian 11). An error was generated when using the "Export as PDF" action for basket groups: Can't locate object method "to_string" via package "PDF::API2" at /usr/share/koha/lib/Koha/pdfformat/layout2pagesde.pm line 250. (This is related to Bug 38516 - Closed group basket not able to open PDF file with Adobe - The root object is missing or invalid, which is in Koha 25.11.00, 25.05.06, and 24.11.11.)
Version(s) released in:
Circulation function:


Attachments
Bug 41601: Create Koha::PDF::Loader wrapper for PDF::API2 (13.00 KB, patch)
2026-01-14 02:29 UTC, David Cook
Details | Diff | Splinter Review
Bug 41601: Create Koha::PDF::Loader wrapper for PDF::API2 (13.04 KB, patch)
2026-01-16 19:13 UTC, David Nind
Details | Diff | Splinter Review
Bug 41601: Create Koha::PDF::Loader wrapper for PDF::API2 (13.11 KB, patch)
2026-01-21 15:44 UTC, Nick Clemens (kidclamp)
Details | Diff | Splinter Review

Note You need to log in before you can comment on or make changes to this bug.
Description Katrin Fischer 2026-01-13 14:42:40 UTC
We noticed that the PDF export for basket groups broke with the security update 24.11.11. We tracked it down to the change in bug 38516.

The error from the logs is:

Can't locate object method "to_string" via package "PDF::API2" at /usr/share/koha/lib/Koha/pdfformat/layout2pagesde.pm line 250.

The problem is that to_string and from_string only exist since 2.0.42. See change log:

https://metacpan.org/dist/PDF-API2/changes

    - Renamed several methods in the PDF::API2 base class:
      - end -> close
      - open_scalar -> from_string
      - stringify -> to_string
      - pages -> page_count
...

We are using packages with Debian 11. This seems to include 2.0.38.
Koha names the minimal required version as 2 on the about page.

I believe this means more libraries are probably affected.

Changing the method names to the old ones fixed the PDF export for us.
Comment 1 David Cook 2026-01-14 01:31:35 UTC
That's fun... but I do have an idea!
Comment 2 David Cook 2026-01-14 02:29:43 UTC
Created attachment 191398 [details] [review]
Bug 41601: Create Koha::PDF::Loader wrapper for PDF::API2

This patch adds a wrapper around PDF::API2 so that we can
use the right method names depending on the version of PDF::API2
being used when we're loading in PDF templates

Test plan:
0. Apply the patch and koha-plack --restart kohadev
1. chmod 444 /kohadevbox/koha/koha-tmpl/intranet-tmpl/prog/pdf/*.pdf
2. Create a basket with a vendor
3. Add an order to the basket
4. Close basket (and attach the basket to a new basket group with the same name)
5. Go to "Closed" tab and click "Export as PDF"
6. Note that there's no error and your PDF opens fine
7. Repeat the "Export as PDF" process for every option of the
system preference "OrderPdfFormat". Every option should work
without errors.
8. Celebrate!
Comment 3 David Cook 2026-01-14 02:32:32 UTC
Alternatively, I suppose we could subclass PDF::API2 and use our own namespace for names, but I thought this was a fairly light touch, which works well.

The unit test uses both the new and old method names, but this should still be tested on Debian 11 to make sure the automatic method name setting happens.

I've only tested this on Debian 12.
Comment 4 David Nind 2026-01-16 19:13:49 UTC
Created attachment 191591 [details] [review]
Bug 41601: Create Koha::PDF::Loader wrapper for PDF::API2

This patch adds a wrapper around PDF::API2 so that we can
use the right method names depending on the version of PDF::API2
being used when we're loading in PDF templates

Test plan:
0. Apply the patch and koha-plack --restart kohadev
1. chmod 444 /kohadevbox/koha/koha-tmpl/intranet-tmpl/prog/pdf/*.pdf
2. Create a basket with a vendor
3. Add an order to the basket
4. Close basket (and attach the basket to a new basket group with the same name)
5. Go to "Closed" tab and click "Export as PDF"
6. Note that there's no error and your PDF opens fine
7. Repeat the "Export as PDF" process for every option of the
system preference "OrderPdfFormat". Every option should work
without errors.
8. Celebrate!

Signed-off-by: David Nind <david@davidnind.com>
Comment 5 David Nind 2026-01-16 19:26:38 UTC
Testing notes (using KTD):
1. Current main uses Debian 12 (Bookworm) and has PDF::API2 2.044, so you can't reproduce the error.
2. To test with a Debian version that has API2::PDF less than 2.042, start up KTD with Debian 11 (Bullseye) (Debian 11 has 2.038 of the Perl module):
   . Change your .env file to: KOHA_IMAGE-main-bullseye
   . ktd pull
   . ktd up
Comment 6 Katrin Fischer 2026-01-17 12:16:43 UTC
Thanks for the patch David C. and for testing David N.!
Comment 7 Nick Clemens (kidclamp) 2026-01-21 15:44:40 UTC
Created attachment 191793 [details] [review]
Bug 41601: Create Koha::PDF::Loader wrapper for PDF::API2

This patch adds a wrapper around PDF::API2 so that we can
use the right method names depending on the version of PDF::API2
being used when we're loading in PDF templates

Test plan:
0. Apply the patch and koha-plack --restart kohadev
1. chmod 444 /kohadevbox/koha/koha-tmpl/intranet-tmpl/prog/pdf/*.pdf
2. Create a basket with a vendor
3. Add an order to the basket
4. Close basket (and attach the basket to a new basket group with the same name)
5. Go to "Closed" tab and click "Export as PDF"
6. Note that there's no error and your PDF opens fine
7. Repeat the "Export as PDF" process for every option of the
system preference "OrderPdfFormat". Every option should work
without errors.
8. Celebrate!

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
Comment 8 Nick Clemens (kidclamp) 2026-01-21 15:46:12 UTC
Worth noting, the tests fail on bullseye:L
not ok 2 - No tests run for subtest "PDF loader tests"

#   Failed test 'No tests run for subtest "PDF loader tests"'
#   at /kohadevbox/koha/t/Koha/PDF/Loader.t line 51.
invalid method invocation: use 'saveas' instead. at /usr/share/perl5/PDF/API2.pm line 989.

as long as we are okay assuming tests will not run on bullseye this seems okay
Comment 9 David Cook 2026-01-21 22:02:29 UTC
(In reply to Nick Clemens (kidclamp) from comment #8)
> Worth noting, the tests fail on bullseye:L
> not ok 2 - No tests run for subtest "PDF loader tests"
> 
> #   Failed test 'No tests run for subtest "PDF loader tests"'
> #   at /kohadevbox/koha/t/Koha/PDF/Loader.t line 51.
> invalid method invocation: use 'saveas' instead. at
> /usr/share/perl5/PDF/API2.pm line 989.
> 
> as long as we are okay assuming tests will not run on bullseye this seems
> okay

Bullseye is a supported OS so I think we have to fail this one. I'll have to take another look at this..