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