我的任务是使用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或没有的注释或表单字段 适当的外观。文档的元数据丢失或 不一致或腐败。完成。
答案 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";
在“ 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";