Удаление и поворот страниц PDF средствами PHP

324
10 марта 2017, 00:37

Столкнулся с проблемой: нужна библиотека по работе с существующими PDF файлами. Необходимо создать мини-редактор PDF с функцией поворота и удаления страниц .

Есть сторонние консольные приложения. Но интересно реализовать это средствами PHP

Answer 1

Для работы с PDF средствами PHP существует библиотека FPDF (http://fpdf.org).

FPDF is a PHP class which allows to generate PDF files with pure PHP, that is to say without using the PDFlib library. F from FPDF stands for Free: you may use it for any kind of usage and modify it to suit your needs.

Для корректной работы с кириллицей я использовал UFPDF - Unicode-расширение для этой библиотеки (http://acko.net/blog/ufpdf-unicode-utf-8-extension-for-fpdf/).

Answer 2

Из ответа видно что FPDI и TCPDI одно и то же.

Для поворота (источник):

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

Для удаления (источник):

$pdf = new FPDI();
$pageCount = $pdf->setSourceFile('document.pdf');
//  Array of pages to skip -- modify this to fit your needs
$skipPages = [3,15,17,22];
//  Add all pages of source to new document
for( $pageNo=1; $pageNo<=$pageCount; $pageNo++ )
{
    //  Skip undesired pages
    if( in_array($pageNo,$skipPages) )
        continue;
    //  Add page to the document
    $templateID = $pdf->importPage($pageNo);
    $pdf->getTemplateSize($templateID);
    $pdf->addPage();
    $pdf->useTemplate($templateID);
}
$pdf->Output();
READ ALSO
WordPress: пагинация внутри поста

WordPress: пагинация внутри поста

Какую функцию использовать для работы с пагинацией внутри поста, я говорю не о пагинации по записямТо есть мы имеем пост в котором 3 страницы

349
Чтение/запись в бинарный файл С++

Чтение/запись в бинарный файл С++

Здравствуйте, я реализую свой класс String и создаю свой класс `City

297
Память в DLL и вне ее

Память в DLL и вне ее

В связи с этим вопросом

286
scanf %p и касты указателей

scanf %p и касты указателей

http://codepadorg/WD1oWXL8

257