【问题标题】:Is it possible to efficiently split a PDF into individual pages (using FPDI)?是否可以有效地将 PDF 拆分为单独的页面(使用 FPDI)?
【发布时间】:2019-12-26 14:19:36
【问题描述】:

我正在尝试使用 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');
}

【问题讨论】:

    标签: php pdf tcpdf fpdf fpdi


    【解决方案1】:

    FPDI 不分析导入页面的使用资源,并复制所有引用的资源。

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

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

    【讨论】:

    • 谢谢@Jan - 你知道在没有单个资源字典的情况下生成 PDF 的任何方法吗? (我正在使用 TCPDF 来生成我的文件)
    • 如果 TCPDF 使用单个资源字典,那么更改就不是那么容易了。生成单个字典非常容易,因为您可以在任何页面上重复使用任何资源,而无需在单个字典中注册。
    【解决方案2】:

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

    我遇到的大多数 PDF 都有一个单一资源字典,所以不容易做到(感谢@Jan Slabon 的解释)。

    【讨论】:

      猜你喜欢
      • 2011-02-04
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 2020-12-28
      • 2016-01-30
      相关资源
      最近更新 更多