1

我的任务是使用 TCPDF/FPDI 创建一个 PHP 工具,该工具采用现有的 PDF 并将它们转换为 PDF/A 标准,同时添加证书。

不幸的是,所有生成的 PDF 都不符合 PDF/A 标准。我还尝试生成一个随机测试文档,如此处所示https://tcpdf.org/examples/example_065/但该文档也不符合。

这是我的代码:

public static function convertPdf($path)
{
    $pdf = new \FPDI(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false, true);


    $pagecount = $pdf->setSourceFile(ROOT . $path);

    for ($i = 1; $i <= $pagecount; $i++) {
        $tpl  = $pdf->importPage($i);
        $size = $pdf->getTemplateSize($tpl);
        $orientation = $size['h'] > $size['w'] ? 'P':'L';
        $pdf->AddPage($orientation);
        $pdf->useTemplate($tpl, null, null, $size['w'], $size['h'], true);
    }

    $pdf->SetCreator("Creator");
    $pdf->SetAuthor('Nicola Asuni');
    $pdf->SetTitle('My PDFA example');
    $pdf->SetSubject('TCPDF Tutorial');

    $certificatePath = 'file://' . ROOT . '/libs/TCPDF-master/examples/data/cert/tcpdf.crt';
    // set additional information
    $info = array(
        'Name' => 'TCPDF',
        'Location' => 'Office',
        'Reason' => 'Testing TCPDF',
        'ContactInfo' => 'http://www.tcpdf.org',
    );

    $pdf->setSignature($certificatePath, $certificatePath, 'tcpdfdemo', '', 2, $info);
    $pdf->addEmptySignatureAppearance(0, 0, 0, 0);

    $pdf->Output('example_065.pdf', 'I');
}

我使用这个https://www.pdf-online.com/osa/validate.aspx来验证我的 PDF。它生成以下输出:

合规性 pdfa-1b 结果文件不符合 PDF/A。详细信息 验证文件“testerrrrrr.pdf”的一致性级别 pdfa-1b EOF 标记后有数据。pdfaExtension:schemas/ [0] :: 值类型“Schema”中缺少必填字段“property”。pdfaExtension:schemas/ [0] :: 值类型“Schema”中缺少必填字段“valueType”。pdfaExtension:schemas/ [1] :: 值类型“Schema”中缺少必填字段“valueType”。pdfa扩展:架构/[2] :: 值类型“Schema”中缺少必填字段“valueType”。外观字典不包含条目。键 S 的值 Transparency 是被禁止的。该文件不符合要求的标准。文件格式(标题、预告片、对象、外部参照、流)已损坏。该文件包含透明度。文档包含具有模棱两可或没有适当外观的注释或表单域。文档的元数据丢失、不一致或损坏。完毕。

4

2 回答 2

2

就我而言(TCPPDF v. 6.2.26),问题位于 tcpdf.php 文件的第 9583 行:

$xmp .= "\t\t\t\t\t\t".'<pdfaSchema:schema>Adobe PDF Schema</pdfaSchema:schema>'."\n";
$xmp .= "\t\t\t\t\t".'</rdf:li>'."\n";
$xmp .= "\t\t\t\t\t".'<rdf:li rdf:parseType="Resource">'."\n";

在“Adobe PDF 模式”之后,缺少属性声明。我解决了在 pdfaSchema 声明和 li 闭包标记之间添加以下代码:

$xmp .= "\t\t\t\t\t\t".'<pdfaSchema:property>'."\n";
$xmp .= "\t\t\t\t\t\t\t".'<rdf:Seq>'."\n";
$xmp .= "\t\t\t\t\t\t\t\t".'<rdf:li rdf:parseType="Resource">'."\n";
$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:category>internal</pdfaProperty:category>'."\n";
$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:description>A name object indicating whether the document has been modified to include trapping information</pdfaProperty:description>'."\n";
$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:name>Trapped</pdfaProperty:name>'."\n";
$xmp .= "\t\t\t\t\t\t\t\t\t".'<pdfaProperty:valueType>Text</pdfaProperty:valueType>'."\n";
$xmp .= "\t\t\t\t\t\t\t\t".'</rdf:li>'."\n";
$xmp .= "\t\t\t\t\t\t\t".'</rdf:Seq>'."\n";
$xmp .= "\t\t\t\t\t\t".'</pdfaSchema:property>'."\n";
于 2018-10-30T10:25:21.030 回答
0

通常:如果通过 FPDI 导入的文档不符合 PDF/A 标准(例如带有透明度),则结果将永远无法成功验证。仅仅通过 TCPDF 设置一些 PDF/A 标志不会使导入的页面符合 PDF/A。

TCPDF 伪造签名外观,因为外观被写入页面内容流,而真实外观为空(鉴于“外观字典不包含条目。”)。

缺少的属性应该添加到 TCPDF 代码中(其他“验证器”不会抱怨它们)。

于 2016-08-18T08:35:11.513 回答