使用 PHP 为 ADA 编辑 PDF 中的元数据

Editing Metadata in PDFs for ADA with PHP

我有几个 PDF,我需要添加主要语言(对我们来说,它始终是英语,所以 (en-us) 作为文档的目录字典条目)和标题字段,以便我可以让这些 PDF 通过ADA 检查。

我在 PDF 1.4 版上运气不错,对整个文档进行了字符串替换(通过 file_get_contents)并重写了文件,这样我就不会丢失其中的内容,但在 1.5 和 1.6 中PDF 标准,内部甚至 space 并且似乎对制表符敏感。

我尝试通过 shell_exec() 使用 exiftool,但这似乎只适用于 PDF 版本 1.4,其他所有内容都将设置在 PDF 中,但由于像 /Type/Catalog/ViewerPreferences<</DisplayDocTitle true>> 这似乎是在 1.6 的文档中随机设置的。

有没有人试过在网页端解决这个问题?我希望构建一些可以解决一些问题的东西,以减少必须在 Adob​​e 中打开每个人中的一个并重新保存它们的麻烦。

我试图搜索我可以插入的 Adob​​e API 或库来进行这些小的编辑。我见过的所有框架都会创建新的 PDF,这意味着我们放入的所有标记和替代文本都将丢失,所以我肯定不想走 Zend 的路线或任何不会编辑元数据的东西。

<?php

 $dir = getcwd();   
 $files = scandir($dir);

 foreach($files as $file)
 {
    if(strpos($file, '.pdf') !== false)
    {
        $pdf = file_get_contents($dir.'/'.$file);
                // This seems to work for 1.4, but not anything else
        if(strpos($pdf,'/Lang') === false)
        {
            echo "Changing Lang on " .$file.PHP_EOL;
            $pdf_str = preg_replace("/\/Type \/Catalog/", "/Type /Catalog\n/Lang (en-us)", $pdf);
            file_put_contents($dir.'/'.$file, $pdf_str);
        }else{
            echo "Lang passed on ".$file.PHP_EOL;
        }
    }
 }


?>

永远不要替换 PDF 文件中的字符串,因为这样会破坏文件的整个结构,并且 reader 应用程序需要在打开时修复它。

我们在 PHP 中提供用于编辑 PDF 的商业工具。您的任务可以使用 SetaPDF-Core 组件完成:

require_once('library/SetaPDF/Autoload.php');

$writer = new SetaPDF_Core_Writer_File('result.pdf');
$document = SetaPDF_Core_Document::loadByFilename('example.odf', $writer);

$catalog = $document->getCatalog();
$dict = $catalog->getDictionary();
$dict['Lang'] = new SetaPDF_Core_Type_String('en-us');

$document->save()->finish();