我正在尝试使用PHP的FPDI库将大文件拆分为单个页面。
由于某些原因,分割文件并不能减少文件大小。例如,将以下脚本应用于一个30页的1MB文件,结果得到30个文件(约0.9MB),即总共约26MB!
对我来说,即使不是必需的,它也保留了很大一部分原始文件。
问题:
更多详细信息
我已通过多种配置复制了此问题:
下面是一些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');
}
答案 0 :(得分:2)
FPDI不会分析导入页面的已用资源,而是复制所有引用的资源。
如果有文件,例如只有一个资源字典(通用结构),所有资源都被复制。
我们还提供了用于合并和拆分PDF文档的商业(非免费)工具。 SetaPDF-Merger组件。默认情况下,该工具有同样的问题,但是我们准备了一个带有一些代码的演示,该演示会在拆分过程之后删除未使用的资源。您可以找到演示和代码here。
答案 1 :(得分:0)
对于大多数PDF工具来说,这似乎是一个普遍的问题-pdftk
和cpdf
也是一个问题,如pdftk split pdf with multiple pages中所述。
我遇到的大多数PDF都具有单个资源字典,因此很难做到(感谢@Jan Slabon的解释)。