是否可以有效地将PDF拆分为单独的页面(使用FPDI)?

时间:2019-08-21 10:12:49

标签: php pdf tcpdf fpdf fpdi

我正在尝试使用PHP的FPDI库将大文件拆分为单个页面。

由于某些原因,分割文件并不能减少文件大小。例如,将以下脚本应用于一个30页的1MB文件,结果得到30个文件(约0.9MB),即总共约26MB!

对我来说,即使不是必需的,它也保留了很大一部分原始文件。

问题:

  1. 这是可以避免的吗?
  2. 这是FPDI中的错误吗?
  3. 是否有替代的PHP库在拆分方面更有效?

更多详细信息

我已通过多种配置复制了此问题:

  • FPDI版本1(不再受支持)和FPDI版本2
  • 使用FPDF和TCPDF
  • PHP 5.4和PHP 5.6
  • 各种PDF文件,包括使用FPDF和TCPDF生成的文件

下面是一些PHP代码来说明问题:

<?php

testPdfSplit();

function testPdfSplit()
{
    echo phpversion();

    //Load a file
    $contentPath = "/path/to/local/files/original_file.pdf";
    copy("https://file-examples.com/wp-content/uploads/2017/10/file-example_PDF_1MB.pdf", $contentPath);
    $numpages = 30;

    //Get the original file size
    $fileSize = round(filesize($contentPath) / (1024 * 1024), 3);
    echo "<p>Original file is $fileSize MB</p>";

    for($i=1; $i<=$numpages; $i++)
    {
        echo "<p>Creating file with $i pages</p>";
        $filePath = "/path/to/local/files/test.$i.pdf";

        try
        {
            selectOnePage($content, $i, $filePath);
        }
        catch (Exception $e)
        {
            die ("<pre>ERROR: $e</pre>");
        }

        $fileSize = round(filesize($filePath) / (1024 * 1024),3);
        echo "<p>$filePath is $fileSize MB</p>";
    }
}

function selectOnePage($filePathIn, $pageNo, $filePathOut)
{
    require_once('fpdf/fpdf.php');
    require_once('fpdi/src/autoload.php');

    // initiate FPDI
    $pdf = new \setasign\Fpdi\Fpdi();

    // get the page count
    $pageCount = $pdf->setSourceFile($filePathIn);

    echo "<p>Selecting page $pageNo / $pageCount</p>";

    // import a page
    $pdf->AddPage();
    $templateId = $pdf->importPage($pageNo);
    $pdf->useImportedPage($templateId);

    //output the file
    $pdf->Output($filePathOut, 'F');
}

2 个答案:

答案 0 :(得分:2)

FPDI不会分析导入页面的已用资源,而是复制所有引用的资源。

如果有文件,例如只有一个资源字典(通用结构),所有资源都被复制。

我们还提供了用于合并和拆分PDF文档的商业(非免费)工具。 SetaPDF-Merger组件。默认情况下,该工具有同样的问题,但是我们准备了一个带有一些代码的演示,该演示会在拆分过程之后删除未使用的资源。您可以找到演示和代码here

答案 1 :(得分:0)

对于大多数PDF工具来说,这似乎是一个普遍的问题-pdftkcpdf也是一个问题,如pdftk split pdf with multiple pages中所述。

我遇到的大多数PDF都具有单个资源字典,因此很难做到(感谢@Jan Slabon的解释)。