如何通过修改错误处理跳过与PHP库TCPDF与FPDI损坏的文件?(How to skip over

2019-09-17 18:17发布

我使用的PHP库TCPDF与FPDI到PDF文档合并,并正在以下错误:

TCPDF ERROR:无法找到对象(10,0)的预期位置

我的商业版本FPDI 。

看来,问题只与PDF版本1.3(4.x版的Acrobat)文件发生。 下面是创建一个错误文件的文档属性的屏幕截图。 http://imagebin.org/215041

我想任何文件跳过有错误的,而不是让脚本模具。 我已经修改了错误与一个新的类处理ErrorIgnoringTCPDF ,但是,它不工作。

有任何想法吗?

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

class ErrorIgnoringTCPDF extends FPDI {

   public function Error($msg) {
       // unset all class variables
       $this->_destroy(true);

       // exit program and print error
       //die('<strong>TCPDF ERROR: </strong>'.$msg);
   }

}

$pdf = new ErrorIgnoringTCPDF();
$pdf->setPrintHeader(false);

$prows = fetch_data($id);

foreach ($prows AS $row) {

    $irows = get_imaged_docs($row['pat_id']);

    foreach($irows AS $irow){

        if ($irow['type'] === 'application/pdf'){

            $doc_id = $irow['id'];

            $content = get_pdf_imaged_docs($doc_id);

            $pagecount = $pdf->setSourceFile($content);

            for ($i = 1; $i <= $pagecount; $i++) {
                 $tplidx = $pdf->ImportPage($i);
                 $s = $pdf->getTemplatesize($tplidx);
                 $pdf->AddPage('P', array($s['w'], $s['h']));
                 $pdf->useTemplate($tplidx);
            }    

        } else {

            $pdf->AddPage();

            $doc  = fetch_document_content($irow['id'], $irow['filename']);
            $img = base64_encode($doc);

            $imgdata = base64_decode($img);

            $pdf->Image('@'.$imgdata);

        }

    }

}

$pdf->Output('documents.pdf', 'D');

Answer 1:

如果你使用Linux,你可以使用了shell_exec合并文件

function combine_pdf($outputName,$fileArray)
{


         $cmd = "gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=$outputName ";

         foreach($fileArray as $file)
         {
           $cmd .= $file." ";
         }
         $result = shell_exec($cmd);

 }


Answer 2:

你试过只是抑制了错误?

$pagecount = @$pdf->setSourceFile($content);

if (empty($pagecount))
    continue;  // or whatever you want to do, maybe set $is_invalid = true;


Answer 3:

这只是表明该PDF文档errorious。 它指向哪里没有找到预期的对象特定字节偏移位置。



Answer 4:

我不会说这是一个合适的/最好的解决,但它可能会解决你的问题,

在:pdf_parser.php,注释掉该行:

$this->error("Unable to find object ({$obj_spec[1]}, {$obj_spec[2]}) at expected location");

它应该是接近行544。

你也很可能需要更换:

    if (!is_array($kids))
        $this->error('Cannot find /Kids in current /Page-Dictionary');

有:

    if (!is_array($kids)){
     //   $this->error('Cannot find /Kids in current /Page-Dictionary');
     return;
    }

在fpdi_pdf_parser.php文件

希望帮助。 它为我工作。



Answer 5:

我有同样的问题,我用这个代码来解决我的问题。

class convertPDF extends FPDI {

   public function error($msg) {
      throw new Exception($msg); 
   }
   ...other stuff...
}

try {
    $convertPdf = new convertPDF();
} catch(Exception $e) {
    die($e->getMessage);
}

这个答案是谁寻找这个问题的人。 有运气!



文章来源: How to skip over corrupt files with PHP libraries TCPDF and FPDI by modifying error handling?