pdfbox-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Maruan Sahyoun <sahy...@fileaffairs.de>
Subject Re: Open PDDocument warning and null PDField
Date Thu, 30 Apr 2015 16:43:35 GMT
Hi,

> Am 26.04.2015 um 21:32 schrieb Maruan Sahyoun <sahyoun@fileaffairs.de>:
> 
> Hi,
> 
>> Am 26.04.2015 um 19:59 schrieb Tilman Hausherr <THausherr@t-online.de>:
>> 
>> Hi,
>> 
>> 1.
>> thanks for starting a new "clean" thread.
>> 
>> 
>> 2.
>> About the code: templateField0_null is null because you ask for templateAcroForm.getField("field").
However, a bit later in the code, you do this:
>> 
>> templateField0.setPartialName("field-" + i);
>> 
>> so the name is now "field-0".
>> 
>> And then you do a second loop, and of course, you find nothing when searching for
"field", because you changed your own field name.
>> 
>> I think that what you thought you were doing, was that you were working on a copy.
But no, you were altering the original field, and then add it a second time.
>> 
>> 
>> 3.
>> One thing adds to the confusion: this code I inserted
>> 
>> System.out.println("templateField0_null: " + templateField0_null);
>> 
>> prints "null" even if the variable isn't null. The toString() method of PDField is
>> 
>>   public String toString()
>>   {
>>       return "" + getDictionary().getDictionaryObject(COSName.V);
>>   }
>> 
>> so it will show "null" if there is no value.
>> 
>> @Maruan, are you reading here? We need something better there, maybe the field type
and the value.
> 
> OK - will do tomorrow.

what do you think about this output 

ShortText{type: PDTextField value:COSString{AA}}

with ShortText being the fields fully qualified name?

BR
Maruan

> 
>> 
>> Tilman
>> 
>> 
>> 
>> 
>> Am 26.04.2015 um 18:02 schrieb Philippe de Rochambeau:
>>> 
>>> Hi Tilman,
>>> 
>>> I am creating a new thread.
>>> 
>>> Here's the issues I am having with this code:
>>> 
>>> - when I run the program,  I get warning message stating that one of the PDDocuments
hasn't been closed properly, although I close all PDDocuments
>>> - the templateField0_null field is null, although the "field" field exists in
the PDDocument’s acroForm
>>> 
>>> Thanks for your help.
>>> 
>>> You don't have to answer my questions on a week-end.
>>> 
>>> Many thanks.
>>> 
>>> Philippe
>>> 
>>> 
>>> public class App {
>>> 	
>>> 	final static File RESULT_FOLDER = new File("/Users/philippe/Desktop/PDFBoxTests");
>>> 	final static File TEMPLATE_FOLDER = new File("/Users/philippe/Desktop/PDFBoxTests/Scribus");
>>> 	
>>>    public static void main( String[] args ) {
>>>    		new App();
>>>    }
>>>         public App() {
>>>    		try {
>>>    			testGeneratedTemplate();
>>> 			} catch (COSVisitorException e) {
>>> 				
>>> 				e.printStackTrace();
>>> 			} catch (IOException e) {
>>> 				
>>> 				e.printStackTrace();
>>> 			}
>>>    }
>>>       public void testGeneratedTemplate() throws COSVisitorException, IOException
{
>>>        	  final byte[] generatedTemplate = generateSimpleTemplate();
>>> 	  final PDDocument templateDoc = new PDDocument().load(new ByteArrayInputStream(generatedTemplate));
>>> 	  Files.write(new File(TEMPLATE_FOLDER,  "template.pdf").toPath(), generatedTemplate);
>>> 	
>>>        final PDDocument finalDoc = new PDDocument();
>>>        final List<PDField> fields = new ArrayList<PDField>();
>>>        final int numberOfPages = 2;
>>>        final float inch = 72;
>>>        final float borderThickness = inch / 48f;
>>>        final float distanceFromField = inch / 2f;
>>>                 for (int i = 0; i < numberOfPages; ++i) {
>>>        		final PDDocumentCatalog templateDocCatalog = templateDoc.getDocumentCatalog();
>>>          	final PDAcroForm templateAcroForm = templateDocCatalog.getAcroForm();
>>>          	
>>>          	List<PDField> templatePdfFields = templateAcroForm.getFields();
>>>          	for (PDField field : templatePdfFields) {
>>>          		System.out.println("fully qualified name = "  + field.getFullyQualifiedName());
>>>          		System.out.println("alternate field name = "  + field.getAlternateFieldName());
>>>          		System.out.println("partial name = "  + field.getPartialName());
>>>          	}
>>>                final PDField templateField0_null = templateAcroForm.getField("field");
>>>          	final PDField templateField0 = templatePdfFields.get(0);
>>>            if (templateField0 != null) {
>>> 	        		templateField0.setValue("xxx" + i);
>>> 	        		templateField0.setPartialName("field-" + i);
>>> 	        		templateField0.setReadonly(true);
>>> 	        		 final List<PDPage> pages = (List<PDPage>) templateDocCatalog.getAllPages();
>>> 	        		 PDPage page = pages.get(0);
>>> 	        		 finalDoc.addPage(page);
>>> 	              fields.add(templateField0);
>>>            }
>>>        }
>>> 
>>>        final PDAcroForm finalForm = new PDAcroForm(finalDoc);
>>>        finalDoc.getDocumentCatalog().setAcroForm(finalForm);
>>>        finalForm.setFields(fields);
>>>                 finalDoc.save(new File(RESULT_FOLDER, "form-two-templates.pdf"));
>>>        templateDoc.close();
>>>                finalDoc.close();
>>>                      }
>>>      byte[] generateSimpleTemplate() throws IOException, COSVisitorException
{
>>>            		PDDocument template = new PDDocument();
>>>                   		ByteArrayOutputStream resultStream = new ByteArrayOutputStream()
;
>>>                     		final PDPage page = new PDPage(PDPage.PAGE_SIZE_A4);
>>>    		page.setRotation(90) ;
>>> 		template.addPage(page);
>>> 		
>>> 		final PDType1Font font = PDType1Font.HELVETICA_BOLD;
>>> 		
>>> 		// add a new AcroForm and add it to the document
>>> 		final PDAcroForm acroForm = new PDAcroForm(template);
>>> 		template.getDocumentCatalog().setAcroForm(acroForm);
>>> 		
>>> 		// Add and set the resources and default appearance
>>> 		final PDResources res = new PDResources();
>>> 		final String fontName = res.addFont(font);
>>> 		acroForm.setDefaultResources(res);
>>> 
>>> 		final COSDictionary cosDict = new COSDictionary();
>>> 		
>>> 		final COSArray rect = new COSArray();
>>> 		rect.add(new COSFloat(250f)); // lower x boundary
>>> 		rect.add(new COSFloat(700f)); // lower y boundary
>>> 		rect.add(new COSFloat(500f)); // upper x boundary
>>> 		rect.add(new COSFloat(750f)); // upper y boundary
>>> 		
>>> 		cosDict.setItem(COSName.RECT, rect);
>>> 		cosDict.setItem(COSName.FT, COSName.getPDFName("Tx")); // Field Type
>>> 		cosDict.setItem(COSName.TYPE, COSName.ANNOT);
>>> 		cosDict.setItem(COSName.SUBTYPE, COSName.getPDFName("Widget"));
>>> 		final String da = "/" + fontName + " 12 Tf 0 g";
>>> 		cosDict.setItem(COSName.DA, new COSString(da));
>>> 		
>>> 		// add a form field to the form
>>> 		final PDTextbox textBox = new PDTextbox(acroForm, cosDict);
>>> 		textBox.setPartialName("field");
>>> 		acroForm.getFields().add(textBox);
>>> 		
>>> 		// specify the annotation associated with the field
>>> 		// and add it to the page
>>> 		final PDAnnotationWidget widget = textBox.getWidget();
>>> 		page.getAnnotations().add(widget);
>>> 			
>>> 		template.save(resultStream);
>>> 		template.close();
>>> 		
>>> 		return resultStream.toByteArray();
>>>                 }
>>>    }
>>> 
>>> 
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
>>> For additional commands, e-mail: users-help@pdfbox.apache.org
>>> 
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
>> For additional commands, e-mail: users-help@pdfbox.apache.org
>> 
> 


Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message