2014-10-23 7 views
1

Я ссылаюсь на ошибку, которую я получаю при подписании конкретного pdf-файла с библиотеками Java iText версии 5.5.3.Ошибка iText при проверке pdf PDF/A-1A с java

Adobe Pro проверяет соответствие и сообщает мне, что соответствие было подтверждено, но iText сообщит мне, что «Аннотирование типа/виджета должно содержать ключ содержания».

Вы можете получить конкретный файл на http://www.boe.es/boe/dias/2014/08/06/pdfs/BOE-A-2014-8500.pdf

я отправляю ниже трассы я получаю:

Caused by: com.itextpdf.text.pdf.PdfAConformanceException: Annotation of type /Widget should have Contents key. 
at com.itextpdf.text.pdf.internal.PdfA1Checker.checkAnnotation(PdfA1Checker.java:462) 
at com.itextpdf.text.pdf.internal.PdfAChecker.checkPdfAConformance(PdfAChecker.java:219) 
at com.itextpdf.text.pdf.internal.PdfAConformanceImp.checkPdfIsoConformance(PdfAConformanceImp.java:71) 
at com.itextpdf.text.pdf.PdfWriter.checkPdfIsoConformance(PdfWriter.java:3426) 
at com.itextpdf.text.pdf.PdfWriter.checkPdfIsoConformance(PdfWriter.java:3422) 
at com.itextpdf.text.pdf.PdfAnnotation.toPdf(PdfAnnotation.java:999) 
at com.itextpdf.text.pdf.PdfIndirectObject.writeTo(PdfIndirectObject.java:158) 
at com.itextpdf.text.pdf.PdfWriter$PdfBody.write(PdfWriter.java:420) 
at com.itextpdf.text.pdf.PdfWriter$PdfBody.add(PdfWriter.java:398) 
at com.itextpdf.text.pdf.PdfWriter$PdfBody.add(PdfWriter.java:373) 
at com.itextpdf.text.pdf.PdfWriter$PdfBody.add(PdfWriter.java:369) 
at com.itextpdf.text.pdf.PdfWriter.addToBody(PdfWriter.java:843) 
at com.itextpdf.text.pdf.PdfStamperImp.addAnnotation(PdfStamperImp.java:1389) 
at com.itextpdf.text.pdf.PdfStamperImp.addAnnotation(PdfStamperImp.java:1401) 
at com.itextpdf.text.pdf.PdfSignatureAppearance.preClose(PdfSignatureAppearance.java:1283) 

Заранее спасибо за любой ответ.

ответ

2

Я попытался применить образец отсюда (http://itextpdf.com/book/digitalsignatures20130304.pdf, стр. 29) к вашему PDF-документу, и все работает нормально. Единственные исключения в коде:

  1. Создать PdfAStamper вместо PdfStamper:

    PdfAStamper stamper = PdfAStamper.createSignature(reader, os, '\0', PdfAConformanceLevel.PDF_A_1B); 
    
  2. Установить шрифт PdfSignatureAppearance так, что шрифт может быть встроен: выход

    appearance.setLayer2Font(FontFactory.getFont("FreeMonoBold.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED, 12)); 
    
  3. Set :

    ICC_Profile icc = ICC_Profile.getInstance(new FileInputStream("sRGB Color Space Profile.icm")); 
    stamper.getWriter().setOutputIntents("Custom", "", "http://www.color.org", "sRGB IEC61966-2.1", icc); 
    

Вот полный код:

static public void sign(String src, String dest, Certificate[] chain, PrivateKey pk, String digestAlgorithm, String provider, MakeSignature.CryptoStandard subfilter, String reason, String location) throws GeneralSecurityException, IOException, DocumentException { 
    // Creating the reader and the stamper 
    PdfReader reader = new PdfReader(src); 
    FileOutputStream os = new FileOutputStream(dest); 
    PdfAStamper stamper = PdfAStamper.createSignature(reader, os, '\0', PdfAConformanceLevel.PDF_A_1B); 
    // Creating the appearance 
    PdfSignatureAppearance appearance = stamper.getSignatureAppearance(); 
    appearance.setLayer2Font(FontFactory.getFont("FreeMonoBold.ttf", BaseFont.WINANSI, BaseFont.EMBEDDED, 12)); 
    appearance.setReason(reason); 
    appearance.setLocation(location); 
    appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig"); 
    ICC_Profile icc = ICC_Profile.getInstance(new FileInputStream("sRGB Color Space Profile.icm")); 
    stamper.getWriter().setOutputIntents("Custom", "", "http://www.color.org", "sRGB IEC61966-2.1", icc); 
    // Creating the signature 
    ExternalDigest digest = new BouncyCastleDigest(); 
    ExternalSignature signature = new PrivateKeySignature(pk, digestAlgorithm, provider); 
    MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, subfilter); 
} 

Но, возможно, ваш случай использования немного по-другому. Возможно, вы задали специальные параметры или что-то еще ... Можете ли вы указать пример кода, который не удается?

+0

Привет, Александр! Действительно, мой вариант использования немного отличается. Я создал собственный PDFAStamper на основе iText PDFAStamper и добавил некоторые дополнительные функции, но для этого достаточно кода. Я использую метод preClose() для PDFSigantureAppearance, и есть проблема. Благодаря списку рассылки iText, я знаю, что мне нужно будет добавить человекообразное описание в поданной анонимности, рекомендацию спецификации PDF/A, а не требование. Я сейчас на пути к тому, как реализовать. –

+0

Привет, Хосе! Таким образом, вы добавляете некоторую текстовую аннотацию в качестве понятного для пользователя описания для подписи, а затем получаете исключение «Аннотирование типа/виджета должно содержать ключ содержания». Правильно? Можете ли вы отправить часть кода, как добавить такую ​​аннотацию? –

+0

Нет, до того, как я не добавлял это описание аннотации. Теперь я пытаюсь добавить его, но мне нужно расширить PDFSiganutreAppearance и перезаписать метод preClose() и добавить следующую строку: sigField.put (PdfName.CONTENTS, новый PdfString («некоторый текст», PdfObject.TEXT_UNICODE)); –