Видимая подпись в файле PDF - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь создать видимую подпись в файле PDF.

Возьмем простой PDF-файл "hello world":

%PDF-1.7

1 0 obj  % entry point
<<
  /Type /Catalog
  /Pages 2 0 R
>>
endobj

2 0 obj
<<
  /Type /Pages
  /MediaBox [ 0 0 200 200 ]
  /Count 1
  /Kids [ 3 0 R ]
>>
endobj

3 0 obj
<<
  /Type /Page
  /Parent 2 0 R
  /Resources <<
    /Font <<
      /F1 4 0 R 
    >>
  >>
  /Contents 5 0 R
>>
endobj

4 0 obj
<<
  /Type /Font
  /Subtype /Type1
  /BaseFont /Times-Roman
>>
endobj

5 0 obj  % page content
<<
  /Length 44
>>
stream
BT
10 05 TD
/F1 12 Tf
(Hello, world!) Tj
ET
endstream
endobj

xref
0 6
0000000000 65535 f 
0000000010 00000 n 
0000000079 00000 n 
0000000173 00000 n 
0000000301 00000 n 
0000000380 00000 n 
trailer
<<
  /Size 6
  /Root 1 0 R
>>
startxref
492
%%EOF

И подписываем его текстом для отображения«Yolo» в некоторой позиции на первой странице приводит к следующему:

%PDF-1.7

1 0 obj  % entry point
<<
  /Type /Catalog
  /Pages 2 0 R
>>
endobj

2 0 obj
<<
  /Type /Pages
  /MediaBox [ 0 0 200 200 ]
  /Count 1
  /Kids [ 3 0 R ]
>>
endobj

3 0 obj
<<
  /Type /Page
  /Parent 2 0 R
  /Resources <<
    /Font <<
      /F1 4 0 R 
    >>
  >>
  /Contents 5 0 R
>>
endobj

4 0 obj
<<
  /Type /Font
  /Subtype /Type1
  /BaseFont /Times-Roman
>>
endobj

5 0 obj  % page content
<<
  /Length 44
>>
stream
BT
10 05 TD
/F1 12 Tf
(Hello, world!) Tj
ET
endstream
endobj

xref
0 6
0000000000 65535 f 
0000000010 00000 n 
0000000079 00000 n 
0000000173 00000 n 
0000000301 00000 n 
0000000380 00000 n 
trailer
<<
  /Size 6
  /Root 1 0 R
>>
startxref
492
%%EOF
8 0 obj
<</F 132/Type/Annot/Subtype/Widget/Rect[0 0 0 0]/FT/Sig/DR<<>>/T(Signature1)/V 6 0 R/P 3 0 R/AP<</N 7 0 R>>>>
endobj
6 0 obj
<</Contents <...>/Type/Sig/SubFilter/ETSI.CAdES.detached/M(D:20190626125540+00'00')/ByteRange [0 824 60826 1401]/Filter/Adobe.PPKLite>>
endobj
9 0 obj
<</BaseFont/Helvetica/Type/Font/Subtype/Type1/Encoding/WinAnsiEncoding/Name/Helv>>
endobj
10 0 obj
<</BaseFont/ZapfDingbats/Type/Font/Subtype/Type1/Name/ZaDb>>
endobj
12 0 obj
<</Length 35>>stream
BT
1 15 TD
/Helv 6 Tf
(Yolo) Tj
ET

endstream
endobj
7 0 obj
<</Type/XObject/Resources<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]>>/Subtype/Form/BBox[0 0 0 0]/Matrix [1 0 0 1 0 0]/Length 8/FormType 1/Filter/FlateDecode>>stream
xœ    
endstream
endobj
3 0 obj
<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 4 0 R>>>>/Contents [12 0 R 5 0 R]/Annots[8 0 R]>>
endobj
2 0 obj
<</Type/Pages/MediaBox[0 0 200 200]/Count 1/Kids[3 0 R]>>
endobj
1 0 obj
<</AcroForm<</Fields[8 0 R]/DR<</Font<</Helv 9 0 R/ZaDb 10 0 R>>>>/DA(/Helv 0 Tf 0 g )/SigFlags 3>>/Type/Catalog/Pages 2 0 R>>
endobj
11 0 obj
<</Producer(AdES Tools https://www.turboirc.com)/ModDate(D:20190626125540+00'00')>>
endobj
xref
0 4
0000000000 65535 f 
0000061604 00000 n 
0000061529 00000 n 
0000061414 00000 n 
6 7
0000000804 00000 n 
0000000000 65535 f 
0000000679 00000 n 
0000060952 00000 n 
0000061050 00000 n 
0000061746 00000 n 
0000061127 00000 n 
trailer
<</Root 1 0 R/Prev 492/Info 11 0 R/Size 17/ID[<4BB225C2F629BB21464F66FBF2FED264><8E3C9AD8354C66931EAAC282088455EA>]>>
startxref
61846
%%EOF

Итак, в PDF есть объект, который показывает текст на первой странице:

12 0 obj
<</Length 35>>stream
BT
1 15 TD
/Helv 6 Tf
(Yolo) Tj
ET

endstream
endobj

Моя проблемаТеперь этот объект обрабатывается как обычный текстовый объект в Adobe Reader.Я хочу, чтобы при нажатии перейти к цифровой подписи, например, как Adobe Acrobat подписывает документы.

Что мне не хватает?Есть ли параметр в цифровой подписи (объект из 6 или 8 чисел) или в любом другом объекте, который мое приложение вставляет в новый PDF-файл, который связывает текстовый объект с подписью?

Большое спасибо.

1 Ответ

1 голос
/ 26 июня 2019

Ваш объект 8

8 0 obj
<</F 132/Type/Annot/Subtype/Widget/Rect[0 0 0 0]/FT/Sig/DR<<>>/T(Signature1)/V 6 0 R/P 3 0 R/AP<</N 7 0 R>>>>
endobj

- это поле формы AcroForm для подписей (как говорит нам запись FT со значением Sig ). В то же время, однако, этот объект также является аннотацией виджета поля формы (как можно видеть в записях Type и Subtype ). Аннотации виджета поля формы являются визуальными представлениями полей формы, и если поле формы имеет только одно представление, виджет можно объединить с полем формы, как в вашем объекте.

В вашем случае аннотация имеет размер 0x0 (/Rect[0 0 0 0]), т.е. невидимый. Чтобы иметь видимое представление, вам нужен прямоугольник аннотации, который не исчезает.

Отображаемый контент определяется в обычном виде /AP<</N 7 0 R>>, который указывает на объект 7.

7 0 obj
<</Type/XObject/Resources<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]>>/Subtype/Form/BBox[0 0 0 0]/Matrix [1 0 0 1 0 0]/Length 8/FormType 1/Filter/FlateDecode>>stream
xœ    
endstream
endobj

На первый взгляд это выглядит довольно пусто, даже после распаковки.

Итак, что вам нужно сделать, это

  • выберите неисчезающий прямоугольник для аннотации поля формы подписи,
  • адаптирует BBox потока нормального внешнего вида к этому прямоугольнику аннотации и
  • создайте непустое содержимое в обычном потоке появления этой аннотации вместо добавления содержимого страницы.

Кроме того, вы должны исправить очевидные ошибки в вашем PDF, например,

  • объект 7, обычный вид вашего поля подписи, помечен как свободный в ваших перекрестных ссылках
  • ваш трейлер претендует на размер 17

Для получения более подробной информации изучите спецификацию PDF ISO 32000. Часть 1 опубликована для загрузки Adobe на https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf

В отдельных разделах

  • 12,5 "Аннотации"
  • 12,7 "Интерактивные формы"
  • 12,8 "Цифровые подписи"
...