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. Подробности Проверка файла "testerrrrrrr.pdf" на соответствие уровню pdfa-1b После маркера EOF есть данные. pdfaExtension:schemas/[0] :: Отсутствует обязательное поле «свойство» в типе значения «Схема». pdfaExtension:schemas/[0] :: Отсутствует обязательное поле 'valueType' в типе значения 'Schema'. pdfaExtension:schemas/[1] :: Отсутствует обязательное поле 'valueType' в типе значения 'Schema'. pdfaExtension:schemas/[2] :: Отсутствует обязательное поле 'valueType' в типе значения 'Schema'. Словарь внешнего вида не содержит записи. Ключ S имеет значение Прозрачность, которое запрещено. Документ не соответствует требуемому стандарту. Формат файла (заголовок, трейлер, объекты, внешние ссылки, потоки) поврежден. Документ содержит прозрачность. Документ содержит аннотации или поля формы с двусмысленным или неправильным оформлением. Метаданные документа либо отсутствуют, либо противоречивы, либо повреждены. Сделанный.


person Nbert.    schedule 17.08.2016    source источник
comment
Какой валидатор говорит, что он недействителен и на что он жалуется?   -  person Stefan Hegny    schedule 17.08.2016


Ответы (2)


В моем случае (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 schema» объявление свойства отсутствовало. Я решил добавить следующий код между объявлением 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";
person Simond    schedule 30.10.2018

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

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

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

person Jan Slabon    schedule 18.08.2016
comment
Спасибо за ваш ответ. Какие атрибуты отсутствуют и должны быть добавлены в код TCPDF? - person Nbert.; 18.08.2016
comment
Ммммм... возможно, проверка тоже неверна. Потому что недостающие поля есть (и для первого просмотра не все упомянутые обязательны). Поля, например. задокументировано здесь (стр. 9 и далее). - person Jan Slabon; 18.08.2016