package com.brightgenerous.pdfbox.writer.creater; import java.io.IOException; import java.util.List; import java.util.Map; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocumentCatalog; import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; import org.apache.pdfbox.pdmodel.interactive.form.PDField; import com.brightgenerous.pdfbox.writer.IDataConverter; import com.brightgenerous.pdfbox.writer.IDocumentCreater; import com.brightgenerous.pdfbox.writer.IPageAppender; import com.brightgenerous.pdfbox.writer.IResourceLoader; public class DocumentCreater<T> implements IDocumentCreater<T> { private final IResourceLoader<T> resource; private final IDataConverter<T> converter; private final IPageAppender appender; private final boolean flatten; public DocumentCreater(IResourceLoader<T> resource, IDataConverter<T> converter, IPageAppender appender, boolean flatten) { if (resource == null) { throw new IllegalArgumentException("The resource must not be null."); } this.resource = resource; this.converter = converter; this.appender = appender; this.flatten = flatten; } @Override public PDDocument create(int start, T data) throws IOException { PDDocument ret = resource.load(data); if (appender != null) { ret = appender.append(start, ret); } if ((converter != null) && (data != null)) { Map<String, String> map = converter.convert(data); if (((map != null) && !map.isEmpty()) || flatten) { PDDocumentCatalog catalog = ret.getDocumentCatalog(); PDAcroForm acroForm = catalog.getAcroForm(); List<PDField> fields = acroForm.getFields(); for (PDField field : fields) { if (map != null) { boolean find = false; String key = field.getFullyQualifiedName(); if (map.containsKey(key)) { find = true; } else { key = field.getPartialName(); if (map.containsKey(key)) { find = true; } else { key = field.getAlternateFieldName(); if (map.containsKey(key)) { find = true; } } } if (find) { field.setValue(map.get(key)); } } if (flatten) { field.setReadonly(true); } } } } return ret; } }