PDF, созданный TCPDF, не соответствует стандарту PDF / A

У меня есть задача создать инструмент PHP с использованием TCPDF / FPDI, который берет существующие 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: Схемы /[0] :: Отсутствует
Обязательное поле ‘свойство’ в типе значения ‘Схема’.
pdfaExtension: Схемы /
[0] :: Отсутствует обязательное поле ‘valueType’ в
Тип значения «Схема». pdfaExtension: Схемы /[1] :: Отсутствует обязательно
Поле ‘valueType’ в типе значения ‘Схема’. pdfaExtension: Схемы /
[2] :: Отсутствует обязательное поле ‘valueType’ в типе значений ‘Схема’.
внешний словарь не содержит записи. Ключ S имеет значение
Прозрачность, которая запрещена. Документ не соответствует
запрашиваемый стандарт. Формат файла (заголовок, трейлер, объекты, внешние ссылки,
потоки) поврежден. Документ содержит прозрачность.
документ содержит аннотации или поля формы с неоднозначным или без
соответствующие появления. Метаданные документа либо отсутствуют, либо
противоречивый или коррумпированный Готово.

0

Решение

Как правило: если документ, импортированный через FPDI, не соответствует PDF / A (поставляется, например, с прозрачностью), результат никогда не будет успешно подтвержден. Простая установка некоторых флагов PDF / A через TCPDF не приводит к соответствию импортированных страниц PDF / A.

TCPDF подделывает внешний вид подписи, потому что внешний вид записывается в поток содержимого страниц, в то время как реальный внешний вид пуст (в виду «Словарь внешнего вида не содержит записи»).

Отсутствующие атрибуты должны быть добавлены в код TCPDF (другие «валидаторы» не жалуются на них).

0

Другие решения

В моем случае (TCPDF 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 closure:

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

По вопросам рекламы [email protected]