PHP FPDF — «вызов функции-члена Stuff() для не-объекта»

#php #xml #fpdf

#php #xml #fpdf

Вопрос:

Итак, в основном, что я делал, это конвертировал один XML-файл в правильно сформированный PDF-файл с помощью wamp. Приведенные ниже коды являются простой иллюстрацией моей идеи.Я узнал из процесса синтаксического анализа xml в html, и я полагаю, что все дело в том, чтобы сообщить синтаксическому анализатору xml способы, которые вы хотели бы отобразить на экране.Итак, я сделал это, как показано ниже:

 <?php 
 require('fpdf.php');

 class PDF extends FPDF
 {
   //...I skipped couple of functions like Footer()

   //Display stuff from string in pdf manner
   function Stuff($data)
   {
       $this->SetFont('Arial','',12);
       $this->Cell(0,4,"$data",0,1,'L',true);
       $this->Ln(1);
   }
 }

 //Parse xml start tags
 function start($parser,$element_name,$element_data)
 {
      ......
 }    

 //Parse xml end tags
 function stop($parser,$element_name)
 {
      ......
 }

 //Parse xml contents between start tags and end tags
 function data($parser,$data)
 {
      $pdf->Stuff($data);
 }

 //create pdf page
 $pdf = new PDF();
 $pdf->AliasNbPages();
 $pdf->AddPage();
 $pdf->SetFont('Times','',12);

 //Parse xml file to pdf
 $parser=xml_parser_create();
 xml_set_element_handler($parser,"start","stop");
 xml_set_character_data_handler($parser,"char");
 $fp=fopen("test.xml","r");

 while($data=fread($fp,4096))
 {
     xml_parse($parser,$data,feof($fp)) or 
     die (sprintf("XML Error:$s at line $d",
     xml_error_string(xml_get_error_code($parser)),
     xml_get_current_line_number($parser)));
 }

 xml_parser_free($parser);

?>
  

К сожалению, я получил это предупреждение, как я описал в названии.Тем не менее, я протестировал свои функции синтаксического анализа xml с помощью функций start, stop и data по отдельности, все они работали нормально.Затем я попытался преобразовать xml в html, все по-прежнему хорошо.Я сталкиваюсь с этой ситуацией в первую очередь при преобразовании в pdf, когда работаю над своей идеей.
Может ли кто-нибудь дать мне несколько советов по этой проблеме?

Комментарии:

1. В вашей data функции вы ссылаетесь $pdf->Stuff() , но переменной нет $pdf , поэтому вы видите ошибку. Потому $pdf что это не объект, потому что он не существует. Вы имели в виду $parser->Stuff($data) ? или, если эта функция находится внутри вашего класса, то, возможно, она должна быть $this->Stuff($data)

2. Я попытался включить в свой класс пару функций отображения содержимого, таких как stuff() , но wamp предупредил меня, что «невозможно вызвать обработчик start() в …».

3. Дело в том, что мне нужно вызвать пару функций в классе PDF, чтобы отобразить материал в файле pdf.

4.У вас могут быть обработчики в вашем классе, вам просто нужно указать их немного по-другому. Вы можете сделать xml_set_object ( $parser, $this ); xml_set_element_handler ( $parser, 'start', 'stop' ); xml_set_character_data_handler ( $parser, 'char' );

5. Просто к вашему сведению — FPDF в значительной степени мертв (AFAICT), но TCPDF — очень хорошая и современная альтернатива (и бесплатная): tcpdf.org

Ответ №1:

В вашей функции данных вы ссылаетесь $pdf->Stuff() , но переменной нет $pdf , поэтому вы видите ошибку. Потому $pdf что это не объект, потому что он не существует. Вы имели в виду $parser->Stuff($data) ? или, если эта функция находится внутри вашего класса, то, возможно, она должна быть $this->Stuff($data)

У вас могут быть обработчики в вашем классе, вам просто нужно указать их немного по-другому. Вы можете сделать

 xml_set_object ( $parser, $this );
xml_set_element_handler ( $parser, 'start', 'stop' );
xml_set_character_data_handler ( $parser, 'char' );