You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@pdfbox.apache.org by Philippe de Rochambeau <ph...@free.fr> on 2015/04/26 18:02:43 UTC

Open PDDocument warning and null PDField


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


Re: Open PDDocument warning and null PDField

Posted by Tilman Hausherr <TH...@t-online.de>.
Am 26.04.2015 um 18:26 schrieb Tilman Hausherr:
> Am 26.04.2015 um 18:02 schrieb Philippe de Rochambeau:
>> - 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
> This one I can answer:
>
> final PDDocument templateDoc = new PDDocument().load(...)
>
> correct this to
>
> final PDDocument templateDoc = PDDocument().load(...)

oops I mean
final PDDocument templateDoc = PDDocument.load(...)

Tilman

>
>
> Your code creates an empty document, then uses a static call to load 
> another. Your IDE should bring a warning, if it is good :-)
>
> Tilman
>
> ---------------------------------------------------------------------
> 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


Re: Open PDDocument warning and null PDField

Posted by Tilman Hausherr <TH...@t-online.de>.
Am 26.04.2015 um 18:02 schrieb Philippe de Rochambeau:
> - 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
This one I can answer:

final PDDocument templateDoc = new PDDocument().load(...)

correct this to

final PDDocument templateDoc = PDDocument().load(...)


Your code creates an empty document, then uses a static call to load 
another. Your IDE should bring a warning, if it is good :-)

Tilman

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org


Re: Open PDDocument warning and null PDField

Posted by Tilman Hausherr <TH...@t-online.de>.
Am 30.04.2015 um 18:43 schrieb Maruan Sahyoun:
>
> 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?

Yes, that would be fine.



Tilman


>
> 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
>>>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org


Re: Open PDDocument warning and null PDField

Posted by Maruan Sahyoun <sa...@fileaffairs.de>.
Hi,

> Am 26.04.2015 um 21:32 schrieb Maruan Sahyoun <sa...@fileaffairs.de>:
> 
> Hi,
> 
>> Am 26.04.2015 um 19:59 schrieb Tilman Hausherr <TH...@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
>> 
> 


Re: Open PDDocument warning and null PDField

Posted by Maruan Sahyoun <sa...@fileaffairs.de>.
Hi,

> Am 26.04.2015 um 19:59 schrieb Tilman Hausherr <TH...@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.

> 
> 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
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@pdfbox.apache.org
For additional commands, e-mail: users-help@pdfbox.apache.org


Re: Open PDDocument warning and null PDField

Posted by Tilman Hausherr <TH...@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.

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