TCPDF生成的PDF不符合PDF / A标准

时间:2016-08-17 12:57:21

标签: php tcpdf fpdi pdfa

我的任务是使用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] ::缺少必填字段'valueType'   值类型'Schema'。 pdfaExtension:schemas / [1] ::缺少必需的   值'类型'架构'中的字段'valueType'。 pdfaExtension:模式/ [2]   ::在值类型'Schema'中缺少必填字段'valueType'。该   外观字典不包含条目。键S具有值   禁止的透明度。该文件不符合   要求标准。文件格式(标题,预告片,对象,外部参照,   流)已损坏。该文件包含透明度。该   文档包含带有ambigous或没有的注释或表单字段   适当的外观。文档的元数据丢失或   不一致或腐败。完成。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

就我而言(TCPDF v。6.2.26),问题出在9583行的tcpdf.php文件中:

$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";

在“ Adob​​e 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";