Bug 38516: Use PDF template copy for exporting PDFs

Due to a bug in PDF::API2 or related libraries,
you cannot export a PDF if you do not have write
permission on the PDF template. We bypass this
problem by taking a string copy of the PDF template
and working on that instead.

Test plan:
0. DO NOT APPLY THE PATCH YET
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 you get an error when you try to open it in Adobe or some other PDF program

7. Apply the patch and restart koha (e.g. koha-plack --restart kohadev)

8. Try to "Export as PDF" again
9. Note that this time there is no warning and your PDF opens just fine
10. Repeat the "Export as PDF" process for every option of the
system preference "OrderPdfFormat". Every option should work
without errors.
11. Celebrate!

Signed-off-by: Arthur Suzuki <arthur.suzuki@biblibre.com>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Signed-off-by: Lucas Gass <lucas@bywatersolutions.com>
This commit is contained in:
David Cook 2025-10-30 01:36:53 +00:00 committed by Lucas Gass
parent 17b3158b35
commit a6ba625592
No known key found for this signature in database
GPG Key ID: 60B447398B0D36CA
5 changed files with 15 additions and 5 deletions

View File

@ -247,7 +247,9 @@ sub printpdf {
# open the default PDF that will be used for base (1st page already filled)
my $pdf_template =
C4::Context->config('intrahtdocs') . '/' . C4::Context->preference('template') . '/pdf/layout1page.pdf';
my $pdf = PDF::API2->open($pdf_template);
my $pdf_template_obj = PDF::API2->open($pdf_template);
my $pdf_template_str = $pdf_template_obj->to_string();
my $pdf = PDF::API2->from_string($pdf_template_str);
$pdf->pageLabel(
0,
{

View File

@ -262,7 +262,9 @@ sub printpdf {
# open the default PDF that will be used for base (1st page already filled)
my $pdf_template =
C4::Context->config('intrahtdocs') . '/' . C4::Context->preference('template') . '/pdf/layout2pages.pdf';
my $pdf = PDF::API2->open($pdf_template);
my $pdf_template_obj = PDF::API2->open($pdf_template);
my $pdf_template_str = $pdf_template_obj->to_string();
my $pdf = PDF::API2->from_string($pdf_template_str);
$pdf->pageLabel(
0,
{

View File

@ -264,7 +264,9 @@ sub printpdf {
# open the default PDF that will be used for base (1st page already filled)
my $pdf_template =
C4::Context->config('intrahtdocs') . '/' . C4::Context->preference('template') . '/pdf/layout2pagesde.pdf';
my $pdf = PDF::API2->open($pdf_template);
my $pdf_template_obj = PDF::API2->open($pdf_template);
my $pdf_template_str = $pdf_template_obj->to_string();
my $pdf = PDF::API2->from_string($pdf_template_str);
$pdf->pageLabel(
0,
{

View File

@ -455,7 +455,9 @@ sub printpdf {
# open the default PDF that will be used for base (1st page already filled)
my $pdf_template =
C4::Context->config('intrahtdocs') . '/' . C4::Context->preference('template') . '/pdf/layout3pages.pdf';
my $pdf = PDF::API2->open($pdf_template);
my $pdf_template_obj = PDF::API2->open($pdf_template);
my $pdf_template_str = $pdf_template_obj->to_string();
my $pdf = PDF::API2->from_string($pdf_template_str);
$pdf->pageLabel(
0,
{

View File

@ -447,7 +447,9 @@ sub printpdf {
# open the default PDF that will be used for base (1st page already filled)
my $pdf_template =
C4::Context->config('intrahtdocs') . '/' . C4::Context->preference('template') . '/pdf/layout3pagesfr.pdf';
my $pdf = PDF::API2->open($pdf_template);
my $pdf_template_obj = PDF::API2->open($pdf_template);
my $pdf_template_str = $pdf_template_obj->to_string();
my $pdf = PDF::API2->from_string($pdf_template_str);
$pdf->pageLabel(
0,
{