FPDF - 它可以处理具有混合方向(纵向/横向)的原始PDF吗?

时间:2013-03-05 23:10:53

标签: php fpdf fpdi

我正在使用FPDF()方法(来自FPDI_Protection.php)导入现有PDF并应用密码保护。

我遇到的问题是原始PDF混合了纵向和横向页面(8.5“X11”和11“X8.5”),而导入方法则让您定义一次。我可以将新创建​​的pdf定义为11“X11”,这解决了其中一个方向裁剪的问题,但这对于打印目的并不理想,因为PDF缩放并左对齐,导致可读性/打印输出不佳。

我可以使用任何类型的例程,因为原始文档正在循环,以检测原始大小并动态设置新页面方向吗?

function pdfEncrypt ($origFile, $password, $destFile)  // RESPONSIBLE FOR ADDING PASSWORD PROTECTION TO PDF FILES
{
    require_once('fpdi/FPDI_Protection.php');

    $pdf = new FPDI_Protection();
    // set the format of the destinaton file, in our case 6×9 inch
    $pdf->FPDF('P', 'in', array('11','11'));

    //calculate the number of pages from the original document
    $pagecount = $pdf->setSourceFile($origFile);

    // copy all pages from the old unprotected pdf in the new one
    for ($loop = 1; $loop <= $pagecount; $loop++)
    {
        $tplidx = $pdf->importPage($loop);
        $pdf->addPage();
        $pdf->useTemplate($tplidx);
    }

    // protect the new pdf file, and allow no printing, copy etc and leave only reading allowed
    $pdf->SetProtection(array('print'), $password, '');
    $pdf->Output($destFile, 'F');

    return $destFile;
}

或者,或者,是否有更简单的方法使用php为现有的pdf添加密码?

4 个答案:

答案 0 :(得分:3)

好的,我把头发拉了好几天。在不知不觉地搜索与我的问题相关的每个术语的迭代之后,我能够找到一个实际工作的解决方案的实例(我尝试安装pdflib lite,phpinfo,ghostscript,xpdf等等,以测量尺寸无济于事)。有用的是(你需要FPDI_Protection package [免费]):

    $specs = $pdf->getTemplateSize($tplidx);
    $pdf->addPage($specs['h'] > $specs['w'] ? 'P' : 'L');

完整功能如下:

function pdfEncrypt ($origFile, $password, $destFile)  // RESPONSIBLE FOR ADDING PASSWORD PROTECTION TO PDF FILES
{
    require_once('fpdi/FPDI_Protection.php');

    $pdf = new FPDI_Protection();
    // set the format of the destinaton file
    $pdf->FPDF('P', 'in', array('8.5','11'));

    //calculate the number of pages from the original document
    $pagecount = $pdf->setSourceFile($origFile);

    // copy all pages from the old unprotected pdf in the new one
    for ($loop = 1; $loop <= $pagecount; $loop++)
    {

        $tplidx = $pdf->importPage($loop);

        $specs = $pdf->getTemplateSize($tplidx);
        $pdf->addPage($specs['h'] > $specs['w'] ? 'P' : 'L');
        $pdf->useTemplate($tplidx);
    }

    // protect the new pdf file

    $pdf->SetProtection(array('print'), $password, '');
    $pdf->Output($destFile, 'F');

    return $destFile;
}

添加这两行代码能够检测原始页面是否为横向纵向,并以相同方式在输出文件中重新创建页面。哈利路亚。

答案 1 :(得分:0)

感谢您的发帖,我可以在一分钟内解决我的定位问题!

无论如何,你不需要特殊的FPDI _&#34;保护&#34;仅为方向改变的包装,工作解决方案只需要&#34; FPDI&#34; package(用于getTemplatesize函数)。 以下是2012年8月解决方案的链接: FPDF / FPDI addPage() Orientation

答案 2 :(得分:0)

在我的fpdf_tpl.php(1.6.1)中,添加页面的方法称为 AddPage 而不是addPage。看一看,如果你调用addPage,方法就不会被执行,你就无法改变方向。

答案 3 :(得分:0)

要使用 getTemplateSize,您只需要 setasign/fpdi 包。 对于此包的当前版本 (v2.3.6),高度和宽度键不再是“w”和“h”,而是“宽度”和“高度”:

(来自 setasign\Fpdi\Fpdi.php)

/**
 * Get the size of an imported page or template.
 *
 * Give only one of the size parameters (width, height) to calculate the other one automatically in view to the
 * aspect ratio.
 *
 * @param mixed $tpl The template id
 * @param float|int|null $width The width.
 * @param float|int|null $height The height.
 * @return array|bool An array with following keys: width, height, 0 (=width), 1 (=height), orientation (L or P)
 */
public function getTemplateSize($tpl, $width = null, $height = null)
{
    ...
}