/*
*
* This file is part of the iText (R) project.
Copyright (c) 1998-2017 iText Group NV
* Authors: Bruno Lowagie, Paulo Soares, et al.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License version 3
* as published by the Free Software Foundation with the addition of the
* following permission added to Section 15 as permitted in Section 7(a):
* FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY
* ITEXT GROUP. ITEXT GROUP DISCLAIMS THE WARRANTY OF NON INFRINGEMENT
* OF THIRD PARTY RIGHTS
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License for more details.
* You should have received a copy of the GNU Affero General Public License
* along with this program; if not, see http://www.gnu.org/licenses or write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA, 02110-1301 USA, or download the license from the following URL:
* http://itextpdf.com/terms-of-use/
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License.
*
* In accordance with Section 7(b) of the GNU Affero General Public License,
* a covered work must retain the producer line in every PDF that is created
* or manipulated using iText.
*
* You can be released from the requirements of the license by purchasing
* a commercial license. Buying such a license is mandatory as soon as you
* develop commercial activities involving the iText software without
* disclosing the source code of your own applications.
* These activities include: offering paid services to customers as an ASP,
* serving PDFs on the fly in a web application, shipping iText with a closed
* source product.
*
* For more information, please contact iText Software Corp. at this
* address: sales@itextpdf.com
*/
package com.itextpdf.text.pdf;
import com.itextpdf.testutils.CompareTool;
import com.itextpdf.testutils.TestResourceUtils;
import com.itextpdf.text.*;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.w3c.dom.css.RGBColor;
import java.io.*;
import java.util.HashMap;
public class AcroFieldsTest {
private String outFolder = "./target/com/itextpdf/test/pdf/AcroFieldsTest/";
@Before
public void setUp() throws Exception {
new File(outFolder).mkdirs();
TestResourceUtils.purgeTempFiles();
}
@After
public void tearDown() throws Exception {
TestResourceUtils.purgeTempFiles();
}
@Test
public void testSetFields() throws Exception {
singleTest("register.xfdf");
}
@Test
public void testListInSetFields() throws Exception {
singleTest("list_register.xfdf");
}
private void singleTest(String xfdfResourceName) throws Exception {
// merging the FDF file
PdfReader pdfreader = TestResourceUtils.getResourceAsPdfReader(this, "SimpleRegistrationForm.pdf");
PdfStamper stamp = new PdfStamper(pdfreader, new ByteArrayOutputStream());
File xfdfFile = TestResourceUtils.getResourceAsTempFile(this, xfdfResourceName);
XfdfReader fdfreader = new XfdfReader(xfdfFile.getAbsolutePath());
AcroFields form = stamp.getAcroFields();
form.setFields(fdfreader);
stamp.close();
}
private final String PDF_COMBO = "./src/test/resources/com/itextpdf/text/pdf/AcroFieldsTest/choice_field_order.pdf";
private final String PDF_COMBO_EXPORT = "./src/test/resources/com/itextpdf/text/pdf/AcroFieldsTest/choice_field_order_export.pdf";
private final String PDF_COMBO_FIELD_NAME = "choice_field";
private final String[] PDF_COMBO_VALUES = {
"Option 1",
"Option 2",
"Option 3"
};
private final String[] PDF_COMBO_EXPORT_VALUES = {
"Export 1",
"Export 2",
"Export 3"
};
@Test
public void testComboboxAppearanceStateOrder() {
try {
checkOrderOfAppearanceStates(PDF_COMBO, PDF_COMBO_FIELD_NAME, PDF_COMBO_VALUES);
} catch (IOException e) {
Assert.fail(e.getMessage());
}
}
@Test
public void testComboboxDisplayValues() {
try {
PdfReader reader = new PdfReader(PDF_COMBO);
AcroFields acroFields = reader.getAcroFields();
String[] actual = acroFields.getListOptionDisplay(PDF_COMBO_FIELD_NAME);
Assert.assertEquals(PDF_COMBO_VALUES.length, actual.length);
for ( int i = 0; i < PDF_COMBO_VALUES.length; i++ ) {
Assert.assertEquals(PDF_COMBO_VALUES[i], actual[i]);
}
} catch (IOException e) {
Assert.fail(e.getMessage());
}
}
@Test
public void testComboboxExportValues() {
try {
PdfReader reader = new PdfReader(PDF_COMBO_EXPORT);
AcroFields acroFields = reader.getAcroFields();
String[] actual = acroFields.getListOptionExport(PDF_COMBO_FIELD_NAME);
Assert.assertEquals(PDF_COMBO_EXPORT_VALUES.length, actual.length);
for ( int i = 0; i < PDF_COMBO_EXPORT_VALUES.length; i++ ) {
Assert.assertEquals(PDF_COMBO_EXPORT_VALUES[i], actual[i]);
}
} catch (IOException e) {
Assert.fail(e.getMessage());
}
}
private void checkOrderOfAppearanceStates(String pdf, String fieldName, String[] expected) throws IOException {
PdfReader reader = new PdfReader(pdf);
AcroFields acroFields = reader.getAcroFields();
String[] actual = acroFields.getAppearanceStates(fieldName);
Assert.assertEquals(expected.length, actual.length);
for ( int i = 0; i < expected.length; i++ ) {
Assert.assertEquals(expected[i], actual[i]);
}
}
@Test
public void fdfTest() throws Exception {
String acroform_pdf = "./src/test/resources/com/itextpdf/text/pdf/AcroFieldsTest/acroform.pdf";
String barcode_jpg = "./src/test/resources/com/itextpdf/text/pdf/AcroFieldsTest/barcode.jpg";
String signature_pdf = "./src/test/resources/com/itextpdf/text/pdf/AcroFieldsTest/signature.pdf";
String outFdf = outFolder + "acroform_fields.fdf";
FileOutputStream fos = new FileOutputStream(outFdf);
FdfWriter fdfWriter = new FdfWriter(fos);
fdfWriter.setFile(new File(acroform_pdf).getAbsolutePath());
fdfWriter.setFieldAsString("FirstName", "Alexander");
fdfWriter.setFieldAsString("LastName", "Chingarev");
//Add signature from external PDF.
PdfReader signatureReader = new PdfReader(signature_pdf);
fdfWriter.setFieldAsTemplate("Signature", fdfWriter.getImportedPage(signatureReader, 1));
//Add barcode image
Image img = Image.getInstance(barcode_jpg);
fdfWriter.setFieldAsImage("Barcode", img);
fdfWriter.write();
//Close signature PDF reader.
signatureReader.close();
FdfReader fdfReader = new FdfReader(outFdf);
HashMap<String, PdfDictionary> fields = fdfReader.getFields();
PdfDictionary barcode = fields.get("Barcode");
PdfStream n = barcode.getAsDict(PdfName.AP).getAsStream(PdfName.N);
Assert.assertNotNull(n);
byte[] b = FdfReader.getStreamBytes((PRStream) n);
Assert.assertEquals(32, b.length);
PdfStream img0 = n.getAsDict(PdfName.RESOURCES).getAsDict(PdfName.XOBJECT).getAsStream(new PdfName("img0"));
Assert.assertNotNull(img0);
PdfDictionary signature = fields.get("Signature");
n = signature.getAsDict(PdfName.AP).getAsStream(PdfName.N);
Assert.assertNotNull(n);
b = FdfReader.getStreamBytes((PRStream) n);
Assert.assertEquals(24410, b.length);
fdfReader.close();
}
private final String sourceFolder = "./src/test/resources/com/itextpdf/text/pdf/AcroFieldsTest/";
@Test
public void icelandicLettersInAcroFieldTest() throws IOException, DocumentException, InterruptedException {
String outFile = outFolder+"icelandicLettersInAcroFieldTest.pdf";
FileOutputStream file = new FileOutputStream(outFile);
PdfReader reader = new PdfReader(new FileInputStream(sourceFolder+ "HelveticaFont.pdf"));
PdfStamper stamper = new PdfStamper(reader, file);
AcroFields fields = stamper.getAcroFields();
fields.setField("Mitarbeiter", "ÁÁÁÁ ÓÓÓÓ Testð");
stamper.close();
CompareTool compareTool = new CompareTool();
String errorMessage = compareTool.compareByContent(outFile, sourceFolder + "cmp_icelandicLettersInAcroFieldTest.pdf", outFolder, "diff_");
if (errorMessage != null) {
Assert.fail(errorMessage);
}
}
@Test
public void specialCharactersInAcroFieldTest() throws IOException, DocumentException, InterruptedException {
String outFile = outFolder+"specialCharactersInAcroFieldTest.pdf";
FileOutputStream file = new FileOutputStream(outFile);
PdfReader reader = new PdfReader(new FileInputStream(sourceFolder+"HelveticaFont.pdf"));
PdfStamper stamper = new PdfStamper(reader, file);
AcroFields acroFields = stamper.getAcroFields();
acroFields.setField("Mitarbeiter", "öäü߀@");
stamper.close();
CompareTool compareTool = new CompareTool();
String errorMessage = compareTool.compareByContent(outFile, sourceFolder + "cmp_specialCharactersInAcroFieldTest.pdf", outFolder, "diff_");
if (errorMessage != null) {
Assert.fail(errorMessage);
}
}
@Test
public void flatteningRadioButtonFields1() throws IOException, DocumentException, InterruptedException {
String outFile = outFolder+"flatteningRadioButtonFields1.pdf";
FileOutputStream file = new FileOutputStream(outFile);
PdfReader reader = new PdfReader(new FileInputStream(sourceFolder+"radios_src1.pdf"));
PdfStamper stamper = new PdfStamper(reader, file);
AcroFields acroFields = stamper.getAcroFields();
acroFields.setField("radiogroup", "1");
stamper.close();
CompareTool compareTool = new CompareTool();
String errorMessage = compareTool.compareByContent(outFile, sourceFolder + "cmp_flatteningRadioButtonFields1.pdf", outFolder, "diff_");
if (errorMessage != null) {
Assert.fail(errorMessage);
}
}
@Test
public void flatteningRadioButtonFields2() throws IOException, DocumentException, InterruptedException {
String outFile = outFolder+"flatteningRadioButtonFields2.pdf";
FileOutputStream file = new FileOutputStream(outFile);
PdfReader reader = new PdfReader(new FileInputStream(sourceFolder+"radios_src2.pdf"));
PdfStamper stamper = new PdfStamper(reader, file);
AcroFields acroFields = stamper.getAcroFields();
acroFields.setField("radiogroup", "1");
stamper.close();
CompareTool compareTool = new CompareTool();
String errorMessage = compareTool.compareByContent(outFile, sourceFolder + "cmp_flatteningRadioButtonFields2.pdf", outFolder, "diff_");
if (errorMessage != null) {
Assert.fail(errorMessage);
}
}
}