【问题标题】:How do I rotate all or specific pages in a PDF using PHP?如何使用 PHP 旋转 PDF 中的所有或特定页面?
【发布时间】:2016-11-01 21:11:04
【问题描述】:

我有用户上传的 PDF 文档需要审核员处理。有时,PDF 中的扫描页面是横向的或上下颠倒的。如何使用 php 旋转页面?

我正在使用 TCPDF 和 TCPDI,我认为它们与 fpdf/fpdi 相同

下面的代码可以很好地旋转所有页面,但是当我只指定一页时,假设是第 3 页,共 5 页。它将单独保留第 1 页和第 2 页,旋转第 3 页并继续旋转第 4 页和5. 为什么?

另外,这段代码有意义吗?这是正确的方法还是有更简单的方法?

function rotatePDF($file, $degrees, $page = 'all'){

    $pdf = new TCPDI(); // new object
    $pdf->setPrintHeader(false); // no headers
    $pdf->setPrintFooter(false); // no footers

    $pagecount = $pdf->setSourceFile($file); //the original file

    // rotate all - THIS WORKS FINE
    if($page=="all"){
        for ($i = 1; $i <= $pagecount; $i++) { 
            $pageformat = array('Rotate'=>$degrees);

            $tpage = $pdf->importPage($i);
            $size = $pdf->getTemplateSize($tpage);

            // get original page orientation        
            $orientation = $size['w'] > $size['h'] ? 'L' : 'P';

            $pdf->AddPage($orientation,$pageformat);
            $pdf->useTemplate($tpage);      
        }
    }else{
        for ($i = 1; $i <= $pagecount; $i++) {
            if($page == $i){
                $pageformat = array('Rotate'=>$degrees);

                $tpage = $pdf->importPage($i);
                $size = $pdf->getTemplateSize($tpage);

                // get original page orientation
                $orientation = $size['w'] > $size['h'] ? 'L' : 'P';

                $pdf->AddPage($orientation,$pageformat);
                $pdf->useTemplate($tpage);                      
            }else{      
                $tpage = $pdf->importPage($i);

                $pdf->AddPage();
                $pdf->useTemplate($tpage);                      
            }
        }
    }
    $out = realpath($file);

    if(rename($file,"files/1/file.bak")){
        $result = $pdf->Output($out, "F"); 
        if($result == "" ){
            echo "ok";
        }
    }else{
        echo "Failed to rename old PDF";
        die;
    }
}

$file = "files/1/1.pdf";
rotatePDF($file,90); // rotating all works fine
rotatePDF($file,90,3); // rotates page 3 AND all following

【问题讨论】:

  • PDF 中有很多东西从一页传到另一页。旋转显然是其中之一。当您不希望下一页旋转时,您必须向后旋转。

标签: php pdf tcpdf fpdf fpdi


【解决方案1】:

经过多次反复试验,我想通了。代码如下:

function rotatePDF($file, $degrees, $page = 'all'){

    $pdf = new TCPDI(); 
    $pdf->setPrintHeader(false);
    $pdf->setPrintFooter(false);

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

    // rotate each page
    if($page=="all"){
        for ($i = 1; $i <= $pagecount; $i++) { 
            $pageformat = array('Rotate'=>$degrees);
            $tpage = $pdf->importPage($i);
            $size = $pdf->getTemplateSize($tpage);
            //$info = $pdf->getPageDimensions();
            $orientation = $size['w'] > $size['h'] ? 'L' : 'P';

            $pdf->AddPage($orientation,$pageformat);
            $pdf->useTemplate($tpage);      
        }
    }else{
        $rotateFlag = 0;
        for ($i = 1; $i <= $pagecount; $i++) { 
            if($page == $i){
                $pageformat = array('Rotate'=>$degrees);
                $tpage = $pdf->importPage($i);
                $size = $pdf->getTemplateSize($tpage);
                //$info = $pdf->getPageDimensions();
                $orientation = $size['w'] > $size['h'] ? 'L' : 'P';

                $pdf->AddPage($orientation,$pageformat);
                $pdf->useTemplate($tpage);
                $rotateFlag = 1;
            }else{
                if($rotateFlag==1){
                    // page after rotation; restore rotation
                    $rotateFlag = 0;
                    $pageformat = array('Rotate'=>0);

                    $tpage = $pdf->importPage($i);
                    $pdf->AddPage($orientation,$pageformat);
                    $pdf->useTemplate($tpage);
                }else{
                    // pages before rotation and after restoring rotation
                    $tpage = $pdf->importPage($i);
                    $pdf->AddPage();
                    $pdf->useTemplate($tpage);
                }
            }
        }
    }
    $out = realpath($file);

    if(rename($file,"files/1/file.bak")){
        $result = $pdf->Output($out, "F"); 
        if($result == "" ){
            echo "ok";
        }
    }else{
        echo "Failed to rename old PDF";
        die;
    }
}

$file = "files/1/1.pdf";
rotatePDF($file,90); // rotating all works fine
rotatePDF($file,180,3); // rotates only page 3

【讨论】:

  • 谢谢!我只需要在我的代码中添加“'Rotate' => $degrees”。现在完美运行。
  • 能否请您告诉或分享您如何使用 TCPDF 和 TCPDI 的代码
  • 我知道已经 5 年了,但这绝对是黄金!
猜你喜欢
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
相关资源
最近更新 更多