Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否可以高效地将PDF拆分为单独的页面(使用FPDI)?_Php_Pdf_Tcpdf_Fpdf_Fpdi - Fatal编程技术网

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

Php 是否可以高效地将PDF拆分为单独的页面(使用FPDI)?,php,pdf,tcpdf,fpdf,fpdi,Php,Pdf,Tcpdf,Fpdf,Fpdi,我正在尝试使用PHP的FPDI库将大文件拆分为单独的页面 由于某些原因,拆分文件对减小文件大小没有多大作用。例如,应用于30页1MB文件的以下脚本将产生30个约0.9MB的文件,即总共约26MB 这对我来说意味着保留了原始文件的很大一部分,即使它不是必需的 问题: 这是可以避免的吗 这是FPDI中的错误吗 是否有一个在拆分方面更有效的PHP库 更多细节 我以多种配置复制了此问题: FPDI版本1(不再支持)和FPDI版本2 使用FPDF和TCPDF PHP5.4和PHP5.6 各种PDF文件

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

由于某些原因,拆分文件对减小文件大小没有多大作用。例如,应用于30页1MB文件的以下脚本将产生30个约0.9MB的文件,即总共约26MB

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

问题:

  • 这是可以避免的吗
  • 这是FPDI中的错误吗
  • 是否有一个在拆分方面更有效的PHP库

  • 更多细节

    我以多种配置复制了此问题:

    • FPDI版本1(不再支持)和FPDI版本2
    • 使用FPDF和TCPDF
    • PHP5.4和PHP5.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');
    }
    

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

    如果文档(例如)只有一个资源字典(公共结构),则复制所有资源


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

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

    如果文档(例如)只有一个资源字典(公共结构),则复制所有资源


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

    这似乎是大多数PDF工具的一个普遍问题-这也是
    pdftk
    cpdf
    的一个问题,如中所述


    我遇到的大多数PDF都有一个单资源字典,因此不容易完成(感谢您的解释)。

    这似乎是大多数PDF工具的一个普遍问题-这也是
    pdftk
    cpdf
    的一个问题,如中所述


    我遇到的大多数PDF都有一个单资源字典,所以很难做到(感谢您的解释)。

    谢谢@Jan-您知道没有单资源字典的PDF生成方法吗?(我使用TCPDF生成我的文件)如果TCPDF使用单一资源字典,那么更改就不那么容易了。生成一本词典非常简单,因为您可以重用任何页面上的任何资源,而无需在单独的词典中注册。谢谢@Jan-您知道没有一本词典可以生成PDF的方法吗?(我使用TCPDF生成我的文件)如果TCPDF使用单一资源字典,那么更改就不那么容易了。因为生成单个词典非常简单,您可以重用任何页面上的任何资源,而无需在单个词典中注册。