2013-11-11 5 views
1

Я делаю программу, которая цифрово подписывает документ PDF, используя библиотеку Itext.Как определить местоположение подписи в Itext PDF Java?

Проблема является расположение подписи, когда я поставил его в видимой подписи

, как я могу определить расположение подписи?

вот как создать прямоугольник подписи:

new Rectangle(float llx, float lly, float urx, float ury); 

и когда я играть с этим я нашел, что это связано с размером подписи, а не на месте его. ?

любая помощь?

Заранее спасибо.

+0

Если есть поле для подписи в файле, что поле имеет свойство '/ Rect', но вы не нужно знать это свойство, потому что вы можете использовать * имя * поля подписи, чтобы добавить видимую подпись.Если у вас нет поля подписи, ваш вопрос неясен. Как программа узнает, где вы хотите поставить подпись? Программа не может читать ваши мысли ;-) –

+0

Нет, мой вопрос простыми словами, как я могу определить, где поставить подпись «в код». - У меня нет подписи. – Yassering

+0

Я имею в виду, как сказать программе поставить подпись в верхней, левой, правой ... и т. Д. Страницы? – Yassering

ответ

0

Ваше требование не очень понятно, но я думаю, что следующий код может работать для вас ....

public static void main(String[] args) throws IOException { 
    String pdfFile = args[0]; 
    PdfReader reader = new PdfReader(pdfFile); 

    AcroFields fields = reader.getAcroFields(); 

    for(String signame : fields.getBlankSignatureNames()) { 
     List<AcroFields.FieldPosition> positions = fields.getFieldPositions(signame); 
     Rectangle rect = positions.get(0).position; // In points: 
     float left = rect.getLeft(); 
     float bTop = rect.getTop(); 
     float width = rect.getWidth(); 
     float height = rect.getHeight(); 

     int page = positions.get(0).page; 
     Rectangle pageSize = reader.getPageSize(page); 
     float pageHeight = pageSize.getTop(); 
     float top = pageHeight - bTop; 

     System.out.print(signame + "::" + page + "::" + left + "::" + top + "::" + width + "::" + height + "\n"); 
    } 
    } 
9

В соответствии с вашими комментариями к первоначальному вопросу, вы хотите знать,

как сказать программе поставить подпись в верхнем, левом, правом ... и т. Д. Страницы.

Я предполагаю, что вы используете процедуру так:

public void sign(String src, String dest, 
    Certificate[] chain, PrivateKey pk, String digestAlgorithm, String provider, 
    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); 
    PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0'); 
    // Creating the appearance 
    PdfSignatureAppearance appearance = stamper.getSignatureAppearance(); 
    appearance.setReason(reason); 
    appearance.setLocation(location); 
    appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig"); 
    // 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); 
} 

(код образца 2.1 из Белой книги Digital Signatures for PDF documents Бруно Lowagie (IText Software))

и хотите отрегулировать Rectangle в строке

appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig"); 

в соответствии с вашими требованиями.

Координаты в этом прямоугольнике даны относительно системы координат на странице, которую вы подписываете. Вы можете получить данные, определяющие эту систему координат, используя метод PdfReadergetCropBox(int index) (index: номер страницы. Первая страница - 1).

Rectangle cropBox = reader.getCropBox(1); 

Кроме того, вам необходимо знать ширину и высоту вашей подписи. Например.

float width = 108; 
    float height = 32; 

С помощью этих данных можно вычислить Rectangle rectangle например, как это:

// Top left 
    rectangle = new Rectangle(cropBox.getLeft(), cropBox.getTop(height), 
           cropBox.getLeft(width), cropBox.getTop()); 

    // Top right 
    rectangle = new Rectangle(cropBox.getRight(width), cropBox.getTop(height), 
           cropBox.getRight(), cropBox.getTop()); 

    // Bottom left 
    rectangle = new Rectangle(cropBox.getLeft(), cropBox.getBottom(), 
           cropBox.getLeft(width), cropBox.getBottom(height)); 

    // Bottom right 
    rectangle = new Rectangle(cropBox.getRight(width), cropBox.getBottom(), 
           cropBox.getRight(), cropBox.getBottom(height)); 

и использовать его, чтобы определить видимую позицию и размер подписи:

appearance.setVisibleSignature(rectangle, 1, "sig"); 
+0

Спасибо за ваш ответ. Я пробовал свои данные, но, к сожалению, все они появляются в верхнем левом углу. – Yassering

+0

Пожалуйста, поставьте соответствующий тестовый документ. Я тестировал определения «Прямоугольник» здесь, и они работали правильно. – mkl

+0

@ Yassering Вы все-таки запустили все и бежали? Или вы нашли PDF-файл для публикации, который иллюстрирует, что * все они отображаются в режиме Top Left *? – mkl