1

TCPDF/FPDI を使用して既存の PDF を取得し、証明書を追加しながら PDF/A 標準に変換する PHP ツールを作成するタスクがあります。

残念ながら、生成されたすべての 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] :: 値型「スキーマ」に必須フィールド「プロパティ」がありません。pdfaExtension:schemas/ [0] :: 値タイプ「スキーマ」に必須フィールド「valueType」がありません。pdfaExtension:schemas/ [1] :: 値タイプ「スキーマ」に必須フィールド「valueType」がありません。pdfaExtension:schemas/[2] :: 値型「スキーマ」に必須フィールド「valueType」がありません。外観ディクショナリにエントリがありません。キー S の値は禁止されています。ドキュメントは要求された標準に準拠していません。ファイル形式 (ヘッダー、トレーラー、オブジェクト、外部参照、ストリーム) が壊れています。ドキュメントに透明部分が含まれています。ドキュメントには、あいまいな、または適切な外観のない注釈またはフォーム フィールドが含まれています。ドキュメントのメタ データが見つからないか、一貫性がないか、破損しています。終わり。

4

2 に答える 2

2

私の場合 (TCPF 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 に答える