Я вставил изображение в слой цифровой подписи PDF n2 с помощью mupdf, но оно не появилось

Я использую mupdf(git clone at commit 2014/3/5 4:05) для подписи pdf.

И мне уже удалось подписать цифровую подпись в pdf с помощью функции 'pdf_sign_signature'.

Теперь я пытаюсь вставить изображение в слой n2 этой подписи, когда подписываю ее.

В '/source/pdf/pdf-appearance' есть функция 'pdf_set_signature_appearance'. c'.

Я пытаюсь добавить код ниже, чтобы вставить изображение:

image_doc = (image_document *)fz_open_document(ctx, jpgFilePathAndName);
fz_fill_image(dev, image_doc->image, page_ctm, 1.0f);

эти коды вставляются между:

rect = annot->rect;
rect.x0 = (rect.x0 + rect.x1)/2.0f;
text = fit_text(ctx, &font_rec, (char *)bufstr, &rect);
fz_fill_text(dev, text, page_ctm, cs, font_rec.da_rec.col, 1.0f);

а также

rect = annot->rect;
fz_transform_rect(&rect, page_ctm);
pdf_set_annot_appearance(doc, annot, &rect, dlist);

После выполнения у меня получился вот такой pdf-файл:

%PDF-1.4
%μῦ

1 0 obj
<<
  /Type /Font
  /BaseFont /Helvetica
  /Subtype /Type1
  /Encoding /WinAnsiEncoding
>>
endobj

2 0 obj
<<
  /Length 63
>>
stream
q
BT
36 806 Td
0 -18 Td
/F1 12 Tf
(Hello World!)Tj
0 0 Td
ET
Q
endstream
endobj

3 0 obj
<<
  /Count 1
  /Type /Pages
  /ITXT (5.3.0)
  /Kids [ 4 0 R ]
>>
endobj

4 0 obj
<<
  /Annots 10 0 R
  /Contents 2 0 R
  /MediaBox [ 0 0 595 842 ]
  /Parent 3 0 R
  /Resources <<
    /Font <<
      /F1 1 0 R
    >>
    /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
  >>
  /Type /Page
>>
endobj

5 0 obj
<<
  /AcroForm 8 0 R
  /Metadata 9 0 R
  /Pages 3 0 R
  /Type /Catalog
>>
endobj

6 0 obj
<<
  /CreationDate (D:20120620091727+02'00')
  /ModDate (D:20120804153425+02'00')
  /Producer (iText\256 5.3.0 \2512000-2012 1T3XT BVBA)
>>
endobj

7 0 obj
<<
  /AP <<
    /N 17 0 R
  >>
  /DA (/Helv 0 Tf 0 g)
  /F 4
  /FT /Sig
  /MK <<
  >>
  /P 4 0 R
  /Rect [ 41.3670998 713.710022 237.352997 781.257996 ]
  /Subtype /Widget
  /T (Signature1)
  /Type /Annot
  /V 15 0 R
>>
endobj

8 0 obj
<<
  /DA (/Helv 0 Tf 0 g )
  /DR <<
    /Encoding <<
      /PDFDocEncoding 14 0 R
    >>
    /Font <<
      /Helv 12 0 R
      /ZaDb 13 0 R
    >>
    /XObject <<
      /DSz 11 0 R
    >>
  >>
  /Fields [ 7 0 R ]
  /SigFlags 1
>>
endobj

9 0 obj
<<
  /Length 3304
  /Subtype /XML
  /Type /Metadata
>>
stream
<?xpacket begin="Ôªø" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.1-c043 52.372728, 2009/01/18-15:08:04        ">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xmp="http://ns.adobe.com/xap/1.0/">
         <xmp:CreateDate>2012-06-20T09:17:27+02:00</xmp:CreateDate>
         <xmp:ModifyDate>2012-08-04T15:34:25+02:00</xmp:ModifyDate>
         <xmp:MetadataDate>2012-08-04T15:34:25+02:00</xmp:MetadataDate>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
         <pdf:Producer>iText® 5.3.0 ©2000-2012 1T3XT BVBA</pdf:Producer>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:dc="http://purl.org/dc/elements/1.1/">
         <dc:format>application/pdf</dc:format>
      </rdf:Description>
      <rdf:Description rdf:about=""
            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">
         <xmpMM:DocumentID>uuid:547fb234-f327-4f3d-8dd1-7b7ea87df336</xmpMM:DocumentID>
         <xmpMM:InstanceID>uuid:72437fbf-7b45-4062-98f1-2b53d3ad86d0</xmpMM:InstanceID>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>





















<?xpacket end="w"?>endstream
endobj

10 0 obj
[ 7 0 R ]
endobj

11 0 obj
<<
  /BBox [ 41.3670998 713.710022 237.352997 781.257996 ]
  /Length 67
  /Resources <<
    /XObject <<
      /Img0 16 0 R
    >>
  >>
  /Subtype /Form
  /Type /XObject
  /Matrix [ 1 0 0 1 0 0 ]
>>
stream
1.000000 0.000000 0.000000 -1.000000 0.000000 1.000000 cm
/Img0 Do
endstream
endobj

12 0 obj
<<
  /BaseFont /Helvetica
  /Encoding 14 0 R
  /Name /Helv
  /Subtype /Type1
  /Type /Font
>>
endobj

13 0 obj
<<
  /BaseFont /ZapfDingbats
  /Name /ZaDb
  /Subtype /Type1
  /Type /Font
>>
endobj

14 0 obj
<<
  /Differences [ 24 /breve /caron /circumflex /dotaccent /hungarumlaut 
    /ogonek /ring /tilde 39 /quotesingle 96 /grave 128 /bullet 
    /dagger /daggerdbl /ellipsis /emdash /endash /florin /fraction 
    /guilsinglleft /guilsinglright /minus /perthousand /quotedblbase 
    /quotedblleft /quotedblright /quoteleft /quoteright /quotesinglbase 
    /trademark /fi /fl /Lslash /OE /Scaron /Ydieresis /Zcaron 
    /dotlessi /lslash /oe /scaron /zcaron 160 /Euro 164 /currency 
    166 /brokenbar 168 /dieresis /copyright /ordfeminine 172 
    /logicalnot /.notdef /registered /macron /degree /plusminus 
    /twosuperior /threesuperior /acute /mu 183 /periodcentered 
    /cedilla /onesuperior /ordmasculine 188 /onequarter /onehalf 
    /threequarters 192 /Agrave /Aacute /Acircumflex /Atilde /Adieresis 
    /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis 
    /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve 
    /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash 
    /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls 
    /agrave /aacute /acircumflex /atilde /adieresis /aring /ae 
    /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave 
    /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute 
    /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute 
    /ucircumflex /udieresis /yacute /thorn /ydieresis ]
  /Type /Encoding
>>
endobj

15 0 obj
<<
  /ByteRange[0 6712 10814 12756]                               /Contents 
...
  /Filter /Adobe.PPKLite
  /SubFilter /adbe.pkcs7.detached
>>
endobj

16 0 obj
<<
  /Type /XObject
  /Subtype /Image
  /Width 400
  /Height 332
  /ColorSpace /DeviceRGB
  /BitsPerComponent 8
  /Length 11097
>>
stream
...
endstream
endobj

17 0 obj
<<
  /BBox [ 41.3670998 713.710022 237.352997 781.257996 ]
  /FormType 1
  /Length 7
  /Matrix [ 1 0 0 1 0 0 ]
  /Resources <<
    /ProcSet [ /PDF /Text ]
    /XObject <<
      /FRM 18 0 R
    >>
  >>
  /Subtype /Form
  /Type /XObject
>>
stream
/FRM Doendstream
endobj

18 0 obj
<<
  /BBox [ 41.3670998 713.710022 237.352997 781.257996 ]
  /FormType 1
  /Length 51
  /Matrix [ 1 0 0 1 0 0 ]
  /Resources <<
    /ProcSet [ /PDF /Text ]
    /XObject <<
      /n0 19 0 R
      /n2 11 0 R
    >>
  >>
  /Subtype /Form
  /Type /XObject
>>
stream
q 1 0 0 1 0 0 cm /n0 Do Q q 1 0 0 1 0 0 cm /n2 Do Qendstream
endobj

19 0 obj
<<
  /BBox [ 41.3670998 713.710022 237.352997 781.257996 ]
  /FormType 1
  /Length 9
  /Matrix [ 1 0 0 1 0 0 ]
  /Resources <<
    /ProcSet [ /PDF /Text ]
  >>
  /Subtype /Form
  /Type /XObject
>>
stream
% DSBlankendstream
endobj

xref
0 20
0000000000 65536 f 
0000000017 00000 n 
0000000123 00000 n 
0000000238 00000 n 
0000000320 00000 n 
0000000544 00000 n 
0000000634 00000 n 
0000000790 00000 n 
0000001026 00000 n 
0000001272 00000 n 
0000004664 00000 n 
0000004691 00000 n 
0000004990 00000 n 
0000005101 00000 n 
0000005196 00000 n 
0000006628 00000 n 
0000010882 00000 n 
0000022144 00000 n 
0000022423 00000 n 
0000022763 00000 n 

trailer
<<
  /Size 20
  /Info 6 0 R
  /Root 5 0 R
  /ID [ <D0151A7ADF2410CF3E72A04B9CB83452> <FA2030FCC5A66742887F23E51DEC5875> ]
>>

startxref
23003
%%EOF

Это кажется правильным, так как /n2 11 0 R в 18 0 obj и /Img0 16 0 R в 11 0 obj и 16 0 obj выглядит как правильно сформированный объект Image XObject.

Но изображение не отображается, когда я использую программу чтения PDF для открытия этого файла PDF.< br>
Кто-нибудь может подсказать, что не так с этим pdf-файлом и как правильно вставить изображение.

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

ps.
signed_with_image_only.pdf

signed_with_text_and_image.pdf

signed_with_image_only.pdf — это pdf-файл, в который я добавил '\n' перед 'endstream'. Вы можете видеть, что изображение не отображается в форме, расположенной ниже «Hello World!».

signed_with_text_and_image.pdf почти такой же, как signed_with_image_only.pdf< /strong>, но я поместил текст в слой n2, чтобы показать вам, что вставка текста в порядке. Такое же изображение тоже вставлено, и оно тоже не появилось.


person jellyice    schedule 11.03.2014    source источник
comment
В объекте 17 есть строка /FRM Doendstream. Должен быть разделитель после Do, чтобы распознать его, и разрыв строки перед endstream, чтобы корректно завершить поток. Это также верно для объектов 9 (<?xpacket end="w"?>endstream), 18 (Qendstream) и 19 (DSBlankendstream). Тем не менее, использование таких слоев, как n2 в подписях PDF, устарело много лет назад.   -  person mkl    schedule 11.03.2014
comment
Привет, спасибо за ваш ответ. Я пытался добавить «\n» перед вставкой «конечный поток», и перед «конечным потоком» для объектов 2 и 11 будет дополнительная пустая строка. Это нормально? В любом случае изображение все равно не появится. Что еще мне не хватает? Кстати, если бы n2 устарел, где и как я должен поместить свой текст и изображение для подписи PDF?   -  person jellyice    schedule 12.03.2014
comment
Кстати, если бы n2 устарел, то где и как я должен поместить свой текст и изображение - на самом деле вы все еще можете использовать эти xobjects, построение потока с несколькими вставленными xobjects остается в силе. Вы просто не должны рассчитывать на то, что эти слои будут автоматически включаться или выключаться, чтобы отразить состояние подписи.   -  person mkl    schedule 12.03.2014
comment
Что еще я упускаю? – пожалуйста, поделитесь актуальным PDF-файлом для проверки, например. Через общедоступную папку Dropbox.   -  person mkl    schedule 12.03.2014
comment
фактическая ссылка для скачивания pdf указана внизу вопроса.   -  person jellyice    schedule 12.03.2014
comment
Я посмотрю на это позже, как только буду в офисе.   -  person mkl    schedule 12.03.2014
comment
Хорошо, в вашем словаре подписи есть серьезная ошибка: /Contents 308207fa06092a...: в начале содержимого отсутствует открывающая скобка <.   -  person mkl    schedule 12.03.2014
comment
Как только вы вставите этот отсутствующий <, вы, по крайней мере, увидите текст в случае подписанного_с_текстом_и_изображением.pdf. Однако изображения вы не увидите. Во-первых, изображение, расположенное через 1.000000 0.000000 0.000000 -1.000000 0.000000 1.000000 cm, выходит за пределы ограничивающей рамки 41.3670998 713.710022 237.352997 781.257996. Но я предполагаю, что данные изображения также подозрительны. Я не в графических форматах, хотя...   -  person mkl    schedule 12.03.2014
comment
Я не знаю почему, но я могу видеть текст с помощью mupdf или Adobe Reader без вставки '‹'. Не могли бы вы сказать мне, что означают 6 чисел с плавающей запятой перед «см» и связь между этими числами и bbox? Как узнать, что позиция вне коробки?   -  person jellyice    schedule 13.03.2014
comment
Я не знаю почему, но я могу видеть текст с помощью mupdf или Adobe Reader без вставки '‹'. - Это может отличаться в зависимости от программы просмотра PDF и версии программы просмотра PDF. Вот, например, я увидел только серый прямоугольник. Но средства просмотра PDF не являются валидаторами PDF и вместо этого игнорируют ту или иную ошибку. Отсутствие открывающей скобки является синтаксической ошибкой.   -  person mkl    schedule 13.03.2014
comment
Не могли бы вы сказать мне, что означают 6 чисел с плавающей запятой перед 'cm' - ср. разделы 8.3.4 (номера там называются a ... f) и 8.4.4 в спецификацию PDF. и связь между этими числами и bbox? Как узнать, что позиция находится за пределами bbox? - последние два числа (0.000000 1.000000) по существу обозначают позицию, которая находится далеко за пределами ограничивающей рамки, а -1.000000 перед ними, по сути, означает зеркальное отображение координаты y.   -  person mkl    schedule 13.03.2014
comment
Большое спасибо!! Я понял. :)   -  person jellyice    schedule 13.03.2014


Ответы (2)


Матрица преобразования неверна.

Вы можете использовать другую утилиту PDF, такую ​​как PDFBox, чтобы добавить изображение во внешний вид цифровой подписи, затем проанализировать матрицу преобразования при рисовании изображения, также обратите внимание на его BBOx.

person nanoart    schedule 08.11.2014
comment
Были проблемы и похуже, см. Комментарии к вопросу. - person mkl; 09.11.2014
comment
Я попробовал себя. С правильным изображением ctm я могу вставить и увидеть изображение как внешний вид цифровой подписи. - person nanoart; 15.11.2014

Я не знаю, является ли это форматированием текста, но у вас есть ряд потоков (объекты 17, 18 и 19), где «конечный поток», обозначающий конец данных потока, записывается неправильно. «Конечный поток» должен находиться в отдельной строке, а файл PDF требует пробелов между токенами и операторами. Поэтому такие вещи, как

/FRM Doendstream

являются недопустимым синтаксисом, они должны быть записаны как

/FRM Do
endstream

Для изображений текущая матрица преобразования должна преобразовываться из квадрата в 1 единицу, в котором указаны изображения, в желаемый размер в единицах PDF. Вы используете матрицу преобразования [1 0 0 -1 0 1] для позиционирования и масштабирования изображения XObject, что не даст желаемого результата. Как правило, для неповернутого изображения вы захотите использовать что-то вроде [ширина 0 0 высота Xpos Ypos]. Кроме того, я всегда рекомендую заключать вызов XObject изображения в сохранение/восстановление графического состояния, чтобы требуемый CTM можно было извлечь из стека графического состояния.

Наконец, глядя на файл в Dropbox, ваше изображение повреждено. Он указывает ширину 400 растров и высоту 332 растров — в формате RGB изображение должно иметь длину 398 400, но имеет длину только 11097. Это слишком мало для этого потока данных изображения. Похоже, это сжатые данные в сжатом формате DCT. Чтобы это правильно отображалось, вам нужно указать, что оно сжато и в формате, например. добавлять

/Filter /DCTDecode

в словарь изображений.

person MattK    schedule 08.06.2017