【问题标题】:OJS - using FPDI and TCPDF libs - fatal errorOJS - 使用 FPDI 和 TCPDF 库 - 致命错误
【发布时间】:2015-04-18 18:22:16
【问题描述】:

我正在尝试找出在 Open Journal System 中添加我自己的“模块”的问题。我需要使用 FPDI 和 TCPDF 功能编辑 PDF 文档 - 向 PDF 文件添加一些信息。

我在 OJS 中有自己的页面,我想上传文件,然后在表单中输入一些信息,提交后,有一些过程,将信息添加到 PDF 中。但是当我得到我的页面时,我得到了这个错误:

Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Cannot open C:\xampp\htdocs\ojs245 !' in C:\xampp\htdocs\ojs245\pages\stamp\pdf_parser.php:192 Stack trace: #0 C:\xampp\htdocs\ojs245\pages\stamp\fpdi_pdf_parser.php(71): pdf_parser->__construct('C:\\xampp\\htdocs...') #1 C:\xampp\htdocs\ojs245\pages\stamp\fpdi.php(128): fpdi_pdf_parser->__construct('C:\\xampp\\htdocs...') #2 C:\xampp\htdocs\ojs245\pages\stamp\fpdi.php(108): FPDI->_getPdfParser('C:\\xampp\\htdocs...') #3 C:\xampp\htdocs\ojs245\pages\stamp\class.php(15): FPDI->setSourceFile(NULL) #4 C:\xampp\htdocs\ojs245\pages\stamp\lib\tcpdf\tcpdf.php(3543): PDF->Header() #5 C:\xampp\htdocs\ojs245\pages\stamp\lib\tcpdf\tcpdf.php(3210): TCPDF->setHeader() #6 C:\xampp\htdocs\ojs245\pages\stamp\lib\tcpdf\tcpdf.php(3122): TCPDF->startPage('schval.pdf', '', false) #7 [internal function]: TCPDF->AddPage('schval.pdf') #8 C:\xampp\htdocs\ojs245\pages\stamp\fpdf_tpl.php(367): call_user_func_array(Array, Array) #9 C:\xampp\htdocs\ojs245\pages\stamp\StampHandl in C:\xampp\htdocs\ojs245\pages\stamp\pdf_parser.php on line 192

我在 ojs\pages 中有这个结构: 索引.php, StampHandler.inc.php 主要功能在哪里,应该在PDF中进行更改:

import('classes.handler.Handler');

    class StampHandler extends Handler {
        function stampingOperation($args, $request) {
            $templateMgr = TemplateManager::getManager($request);
            $templateMgr->display('stamp/stampingOperation.tpl');
            //echo 'Operace razitkovani';
            //$templateMgr->assign('test', $promenna);
            $templateMgr->assign('test', $request->getUserVar('test'));

require_once('lib/tcpdf/tcpdf.php'); 
require_once('fpdi.php');

// Original file with multiple pages 
require_once('class.php');

        // initiate PDF
        $pdf = new PDF();
                $pdf->fullPathToFile = "TestClanek.pdf";
        // add a page
        $pdf->AddPage("schval.pdf");
        //$pdf->AddPage();

        if($pdf->numPages>1) {
            for($i=2;$i<=$pdf->numPages;$i++) {
                $pdf->endPage();
                $pdf->_tplIdx = $pdf->importPage($i);
                $pdf->AddPage();
            }
        }

        // or Output the file as forced download
            $file_time = time();

            $pdf->Output("$file_time.pdf", "F");//, "I"); 
            echo "'<a href=$file_time.pdf>Edited file</a>'";      }
    }

谁能有什么想法,可能是什么问题?

谢谢,Zbynek

编辑: 类.php

class PDF extends FPDI {

var $_tplIdx;
var $fullPathToFile;

  function Header() {
      echo $this->fullPathToFile;

                if(is_null($this->_tplIdx)) {

                // THIS IS WHERE YOU GET THE NUMBER OF PAGES
                $this->numPages = $this->setSourceFile($this->fullPathToFile);
                $this->_tplIdx = $this->importPage(1);
                } 

                if($this->page > 1) {      
                    $this->SetFont('helvetica', 'I', 10); 
                    $this->SetTextColor(0);
                    $this->Write(15, $_POST["casopis"] .", Cislo: ". $_POST["rocnik"]."/0".$_POST["cislo"].", Autor: ".$_POST["autor"]."\n");  // ."\n"  border, 1);

                    // generování času a podmínka pro časové razítko
                    SetLocale(LC_ALL, "Czech");
                    $cas = StrFTime("%H:%M:%S", Time());
                    if($_POST["cas_razitko"]=="ok") {
                        // pozice   $this->SetXY(30, 30);
                        $this->Write(0, "Cas upravy: ".$cas); //."\n");          //." ", '', 0, 'L', true, 0, false, false, 0     15, 
                    }
                    // pokud je vlastní text - potom vytiskni:
                    if($_POST["text_razitko"]=="ok") {
                        //$this->SetXY(30, 30);
                        $this->Write(0, $_POST["text"]);
                    }

                    $style = array(
                      'border' => 1,
                      'padding' => 'auto',
                      'fgcolor' => array(0,0,0),
                      'bgcolor' => array(255,255,255)
                      );

                    if($_POST["qr_kod"]=="ok") {
                    $this->write2DBarcode($_POST["casopis"].", ".$_POST["autor"], 'QRCODE,L', 180, 3, 20, 20, $style, 'N');
                    }

                    $this->Image('logo.png', 100, 2, 75,7);          


                }

      $this->useTemplate($this->_tplIdx, 0, 0,200);

    }

    }

【问题讨论】:

  • addPage()方法的参数是什么?此方法不需要文件名! setSourceFile() 调用在参数为 NULL 的 TCPDF.php 类中......为什么会在那里?!你也会在那里发现问题。当您扩展 FPDI 时,您应该在此类中使用 Header 实现。
  • 对不起,我忘了发布 class.php(由于致命错误,我不得不将其分开:类声明可能未嵌套在 C:\xampp\htdocs\ojs245\pages\stamp\StampHandler. inc.php 在第 67 行)-我添加到主要问题中

标签: php pdf fpdi ojs


【解决方案1】:

var $fullPathToFile 在您的调用类中不是全局变量,这会导致在您的 PDF 类中将 null 传递给 setSourceFile()...您应该将其更改为属性:

$pdf->fullPathToFile = "...";

稍后在您的 PDF 课程中:

$this->setSourceFile($this->fullPathToFile);

【讨论】:

  • 当我更改它时,我得到了同样的错误:致命错误:未捕获的异常 'InvalidArgumentException' 并带有消息'无法打开 C:\xampp\htdocs\ojs245 !'
  • 所以请更新您的代码。一般提示:只需通读错误消息和跟踪。解决此问题所需的所有信息都在其中。
  • 我已经更新了主要问题中的代码。让我感到困惑的是,当我从 OJS 中获得脚本时,没关系,它工作正常。但是当我在 OJS 的结构中实现它时,我得到了这个错误。我会尝试用你的提示来解决它。非常感谢您的帮助。
  • 如果我理解得很好,仍然是加载文件TestClanek.pdf的问题。我认为文件夹 ojs245 的访问权限可能有问题,但我正确设置了它 - 在所有用户的本地主机上。尝试将路径从绝对路径更改为相对路径,但对我不起作用。
  • FPDI-&gt;setSourceFile(NULL) 显示 NULL 已传递给该方法。文件“TestClanek.pdf”似乎从未传递给此方法,而是 NULL。
猜你喜欢
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 2013-11-23
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
相关资源
最近更新 更多