2013-07-08 4 views
0

Я создаю pdf с pdfbox (используя PDResources, PDXObjectForm, PDAppearanceDictionary и т. Д.). У меня есть видимая подпись в формате pdf.Пропущенный поток в pdf (pdfbox)?

Когда я вижу pdf, я пропустил поток.

4 0 obj 
<</Type /XObject//Resources <</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]/XObject <</n0 9 0 R/n1 10 0 R>>>>/BBox [0 0 100 100]/FormType 1/Length 11 0 R>> 
stream 

endstream 
endobj 

8 0 obj 
<</Type /XObject/Subtype /Form/Resources <</XObject <</FRM0 4 0 R >>/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]>>/BBox [0 0 100 100]/Matrix [1 0 0 1 0 0]/FormType 1/Length 13 0 R>> 
stream 

endstream 
endobj 

PDF-структура (XObjects) создана хорошо. но я не знаю, какие потоки должны быть здесь. или как это создать? или какие потоки должны быть?

PDDocument template = new PDDocument(); 



    try { 

      ... 

     PDStream formstream = new PDStream(template); 
     OutputStream os = formstream.createOutputStream(); 

     PDXObjectForm form = new PDXObjectForm(formstream); 
     PDResources res = new PDResources(); 
     form.setResources(res); 
     form.setBBox(formrect); 
     form.setMatrix(transform); 
     form.setFormType(1); 

     PDAppearanceStream dic = new PDAppearanceStream(form.getCOSStream()); 
     PDAppearanceDictionary appearance = new PDAppearanceDictionary(); 
     appearance.setNormalAppearance(dic); 
     appearance.getCOSObject().setDirect(true); 


     PDRectangle innerRect = new PDRectangle(); 
     innerRect.setUpperRightX(100); 
     innerRect.setUpperRightY(100); 
     innerRect.setLowerLeftX(0); 
     innerRect.setLowerLeftY(0); 

     PDStream formStream2 = new PDStream(template); 
     PDXObjectForm innerForm = new PDXObjectForm(formStream2); 


     OutputStream os1 = formStream2.createOutputStream(); 
     PDResources innerResources = new PDResources(); 
     innerForm.setResources(innerResources); 
     innerForm.setBBox(innerRect); 
     innerForm.setFormType(1); 

     innerForm.getResources().getCOSDictionary().setItem(COSName.PROC_SET, defaultRes); 
     res.addXObject(innerForm, "FRM"); 

     PDStream DSStream = new PDStream(template); 
     OutputStream os2 = DSStream.createOutputStream(); 
     PDXObjectForm dsForm = new PDXObjectForm(DSStream); 

     dsForm.setBBox(formrect); 
     dsForm.setMatrix(transform); 

     PDResources dsRes = new PDResources(); 
     dsForm.setResources(dsRes); 
     dsForm.setFormType(1); 


     PDFont firstFont = PDTrueTypeFont.loadTTF(template, new File("/MyFont.ttf")); 
     PDFont secondFont = PDTrueTypeFont.loadTTF(template, new File("/MyFont.TTF")); 
     secondFont.setFontEncoding(new WinAnsiEncoding()); 
     firstFont.setFontEncoding(new WinAnsiEncoding()); 

     Map<String, PDFont> fonts = new HashMap<String, PDFont>(); 

     PDStream imageFormStream = new PDStream(template); 
     OutputStream os3 = imageFormStream.createOutputStream(); 
     PDXObjectForm imageForm = new PDXObjectForm(imageFormStream); 

     imageForm.setBBox(formrect); 
     imageForm.setMatrix(transform); 
     PDResources imgRes = new PDResources(); 
      imgRes.getCOSObject().setDirect(true); 
     imgRes.addFont(firstFont); 
     imageForm.setResources(imgRes); 

     imageForm.setFormType(1); 
     innerResources.addXObject(dsForm, "n"); 
     innerResources.addXObject(imageForm, "n"); 

     imgRes.addXObject(jpeg, "img"); 

     appendRawCommands(os2, "% DSBlank"); 
     appendRawCommands(os3, "q 101 0 0 24.53 2 12.24 cm /img0 Do Q"); 
     appendRawCommands(os3, "\n"); 
     appendRawCommands(os3, "BT"); 
     appendRawCommands(os3, "\n"); 
     appendRawCommands(os3, "1 0 0 1 2 33 Tm"); 
     appendRawCommands(os3, "\n"); 
     appendRawCommands(os3, "101 0 Td"); 
     appendRawCommands(os3, "\n"); 
     appendRawCommands(os3, "-101 0 Td"); 
     appendRawCommands(os3, "\n"); 
     appendRawCommands(os3, "ET"); 
     appendRawCommands(os3, "\n"); 
     appendRawCommands(os3, "BT"); 
     appendRawCommands(os3, "\n"); 
     appendRawCommands(os3, "1 0 0 1 106 37 Tm"); 
     appendRawCommands(os3, "\n"); 
     appendRawCommands(os3, "/F1 12 Tf"); 
     appendRawCommands(os3, "\n"); 
     appendRawCommands(os3, "(TEXT HERE)Tj"); 
     appendRawCommands(os3, "\n"); 
     appendRawCommands(os3, "1 0 0 1 106 25 Tm"); 
     appendRawCommands(os3, "\n"); 
     appendRawCommands(os3, "(10 11:12:13)Tj"); 
     appendRawCommands(os3, "\n"); 
     appendRawCommands(os3, "1 0 0 1 106 13 Tm"); 
     appendRawCommands(os3, "\n"); 
     appendRawCommands(os3, "(GMT+06:00 2013)Tj"); 
     appendRawCommands(os3, "\n"); 
     appendRawCommands(os3, "ET"); 

     os1.close(); 
     os.close(); 
     os3.close(); 
     os2.close(); 

     sigField.getWidget().setAppearance(appearance); 
     COSDictionary widgetDict = sigField.getWidget().getDictionary(); 
     widgetDict.setNeedToBeUpdate(true); 

     defaultRes.setDirect(true); 
     widgetDict.setItem(COSName.DR, res.getCOSObject()); 

     PDResources resSecondForAcro = new PDResources(); 
     resSecondForAcro.addXObject(innerForm, "FRM"); 

     resSecondForAcro.addFont(secondFont);    

     COSBase cosBase=resSecondForAcro.getCOSObject(); 
     cosBase.setDirect(true); 
     acroFormDC.setItem(COSName.DR, cosBase); 

     COSDocument visualSignature = template.getDocument(); 
        ... 

     COSWriter wr = new COSWriter(new FileOutputStream("/new.pdf")); 
     wr.write(visualSignature); 
     wr.close(); 
     template.close(); 

    } finally { 
     template.close(); 
    } 

это образец:

link

то, что я хотел бы добавить к этому коду? проблема в том, что на Rectangle нет изображения (на видимой сигнатуре).

ответ

0

Вы добавляете команды os2 и os3, но ни к os ни os1.

Вы можете добавить что-то вдоль линий

appendRawCommands(os, "q 1 0 0 1 0 0 cm /FRM0 Do Q\n"); 
appendRawCommands(os1, "q 1 0 0 1 0 0 cm /n0 Do Q\n"); 
appendRawCommands(os1, "q 1 0 0 1 0 0 cm /n1 Do Q\n"); 

Это, как говорится, почему вы используете такой сложный состав. Если вы использовали имена XObject, которые Adobe, используемые для использования, когда это показано состояние подписи путем активации или деактивации таких форм xobjects (т.е. /FRM, /n0 и /п2, только до Acrobat 6 Были и других слоев тоже), я мог понять, но вы используете разные имена /FRM0 и /n1, только /n0 идентичен. Таким образом, вы можете вместо этого сразу использовать свой поток с изображением и текстом в качестве обычного внешнего вида.

Если вы хотите поддерживать старые слоистые изображения, вам следует более точно соблюдать обозначения Adobe® Acrobat® SDK Digital Signature Appearances.

PS: Похоже, что одновременно не должно быть нескольких таких PDStream OutputStreams. Вместо этого нужно получить такой выходной поток, написать ему, закрыть его и только затем продолжить с другими манипуляциями с объектами PDF.

Смежные вопросы