📄 pdfcopyfieldsimp.java
字号:
}
}
return arr;
}
protected void createAcroForms() throws IOException {
if (fieldTree.isEmpty())
return;
form = new PdfDictionary();
form.put(PdfName.DR, resources);
propagate(resources, null, false);
form.put(PdfName.DA, new PdfString("/Helv 0 Tf 0 g "));
tabOrder = new HashMap();
calculationOrderRefs = new ArrayList(calculationOrder);
form.put(PdfName.FIELDS, branchForm(fieldTree, null, ""));
PdfArray co = new PdfArray();
for (int k = 0; k < calculationOrderRefs.size(); ++k) {
Object obj = calculationOrderRefs.get(k);
if (obj instanceof PdfIndirectReference)
co.add((PdfIndirectReference)obj);
}
if (co.size() > 0)
form.put(PdfName.CO, co);
}
public void close() {
if (closing) {
super.close();
return;
}
closing = true;
try {
closeIt();
}
catch (Exception e) {
throw new ExceptionConverter(e);
}
}
protected void closeIt() throws IOException {
for (int k = 0; k < readers.size(); ++k) {
((PdfReader)readers.get(k)).removeFields();
}
for (int r = 0; r < readers.size(); ++r) {
PdfReader reader = (PdfReader)readers.get(r);
for (int page = 1; page <= reader.getNumberOfPages(); ++page) {
pageRefs.add(getNewReference(reader.getPageOrigRef(page)));
pageDics.add(reader.getPageN(page));
}
}
mergeFields();
createAcroForms();
for (int r = 0; r < readers.size(); ++r) {
PdfReader reader = (PdfReader)readers.get(r);
for (int page = 1; page <= reader.getNumberOfPages(); ++page) {
PdfDictionary dic = reader.getPageN(page);
PdfIndirectReference pageRef = getNewReference(reader.getPageOrigRef(page));
PdfIndirectReference parent = root.addPageRef(pageRef);
dic.put(PdfName.PARENT, parent);
propagate(dic, pageRef, false);
}
}
for (Iterator it = readers2intrefs.entrySet().iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
PdfReader reader = (PdfReader) entry.getKey();
try {
file = reader.getSafeFile();
file.reOpen();
IntHashtable t = (IntHashtable) entry.getValue();
int keys[] = t.toOrderedKeys();
for (int k = 0; k < keys.length; ++k) {
PRIndirectReference ref = new PRIndirectReference(reader, keys[k]);
addToBody(PdfReader.getPdfObjectRelease(ref), t.get(keys[k]));
}
}
finally {
try {
file.close();
reader.close();
}
catch (Exception e) {
// empty on purpose
}
}
}
pdf.close();
}
void addPageOffsetToField(HashMap fd, int pageOffset) {
if (pageOffset == 0)
return;
for (Iterator it = fd.values().iterator(); it.hasNext();) {
ArrayList page = ((AcroFields.Item)it.next()).page;
for (int k = 0; k < page.size(); ++k)
page.set(k, new Integer(((Integer)page.get(k)).intValue() + pageOffset));
}
}
void createWidgets(ArrayList list, AcroFields.Item item) {
for (int k = 0; k < item.merged.size(); ++k) {
list.add(item.page.get(k));
PdfDictionary merged = (PdfDictionary)item.merged.get(k);
PdfObject dr = merged.get(PdfName.DR);
if (dr != null)
PdfFormField.mergeResources(resources, (PdfDictionary)PdfReader.getPdfObject(dr));
PdfDictionary widget = new PdfDictionary();
for (Iterator it = merged.getKeys().iterator(); it.hasNext();) {
PdfName key = (PdfName)it.next();
if (widgetKeys.containsKey(key))
widget.put(key, merged.get(key));
}
widget.put(iTextTag, new PdfNumber(((Integer)item.tabOrder.get(k)).intValue() + 1));
list.add(widget);
}
}
void mergeField(String name, AcroFields.Item item) {
HashMap map = fieldTree;
StringTokenizer tk = new StringTokenizer(name, ".");
if (!tk.hasMoreTokens())
return;
while (true) {
String s = tk.nextToken();
Object obj = map.get(s);
if (tk.hasMoreTokens()) {
if (obj == null) {
obj = new HashMap();
map.put(s, obj);
map = (HashMap)obj;
continue;
}
else if (obj instanceof HashMap)
map = (HashMap)obj;
else
return;
}
else {
if (obj instanceof HashMap)
return;
PdfDictionary merged = (PdfDictionary)item.merged.get(0);
if (obj == null) {
PdfDictionary field = new PdfDictionary();
for (Iterator it = merged.getKeys().iterator(); it.hasNext();) {
PdfName key = (PdfName)it.next();
if (fieldKeys.containsKey(key))
field.put(key, merged.get(key));
}
ArrayList list = new ArrayList();
list.add(field);
createWidgets(list, item);
map.put(s, list);
}
else {
ArrayList list = (ArrayList)obj;
PdfDictionary field = (PdfDictionary)list.get(0);
PdfName type1 = (PdfName)field.get(PdfName.FT);
PdfName type2 = (PdfName)merged.get(PdfName.FT);
if (type1 == null || !type1.equals(type2))
return;
int flag1 = 0;
PdfObject f1 = field.get(PdfName.FF);
if (f1 != null && f1.isNumber())
flag1 = ((PdfNumber)f1).intValue();
int flag2 = 0;
PdfObject f2 = merged.get(PdfName.FF);
if (f2 != null && f2.isNumber())
flag2 = ((PdfNumber)f2).intValue();
if (type1.equals(PdfName.BTN)) {
if (((flag1 ^ flag2) & PdfFormField.FF_PUSHBUTTON) != 0)
return;
if ((flag1 & PdfFormField.FF_PUSHBUTTON) == 0 && ((flag1 ^ flag2) & PdfFormField.FF_RADIO) != 0)
return;
}
else if (type1.equals(PdfName.CH)) {
if (((flag1 ^ flag2) & PdfFormField.FF_COMBO) != 0)
return;
}
createWidgets(list, item);
}
return;
}
}
}
void mergeWithMaster(HashMap fd) {
for (Iterator it = fd.entrySet().iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
String name = (String) entry.getKey();
mergeField(name, (AcroFields.Item) entry.getValue());
}
}
void mergeFields() {
int pageOffset = 0;
for (int k = 0; k < fields.size(); ++k) {
HashMap fd = ((AcroFields)fields.get(k)).getFields();
addPageOffsetToField(fd, pageOffset);
mergeWithMaster(fd);
pageOffset += ((PdfReader)readers.get(k)).getNumberOfPages();
}
}
public PdfIndirectReference getPageReference(int page) {
return (PdfIndirectReference)pageRefs.get(page - 1);
}
protected PdfDictionary getCatalog(PdfIndirectReference rootObj) {
try {
PdfDictionary cat = pdf.getCatalog(rootObj);
if (form != null) {
PdfIndirectReference ref = addToBody(form).getIndirectReference();
cat.put(PdfName.ACROFORM, ref);
}
if (newBookmarks == null || newBookmarks.isEmpty())
return cat;
PdfDictionary top = new PdfDictionary();
PdfIndirectReference topRef = getPdfIndirectReference();
Object kids[] = SimpleBookmark.iterateOutlines(this, topRef, newBookmarks, false);
top.put(PdfName.FIRST, (PdfIndirectReference)kids[0]);
top.put(PdfName.LAST, (PdfIndirectReference)kids[1]);
top.put(PdfName.COUNT, new PdfNumber(((Integer)kids[2]).intValue()));
addToBody(top, topRef);
cat.put(PdfName.OUTLINES, topRef);
return cat;
}
catch (IOException e) {
throw new ExceptionConverter(e);
}
}
protected PdfIndirectReference getNewReference(PRIndirectReference ref) {
return new PdfIndirectReference(0, getNewObjectNumber(ref.getReader(), ref.getNumber(), 0));
}
protected int getNewObjectNumber(PdfReader reader, int number, int generation) {
IntHashtable refs = (IntHashtable)readers2intrefs.get(reader);
int n = refs.get(number);
if (n == 0) {
n = getIndirectReferenceNumber();
refs.put(number, n);
}
return n;
}
protected boolean isVisited(PdfReader reader, int number, int generation) {
IntHashtable refs = (IntHashtable)readers2intrefs.get(reader);
return refs.containsKey(number);
}
protected boolean isVisited(PRIndirectReference ref) {
IntHashtable refs = (IntHashtable)visited.get(ref.getReader());
return refs.containsKey(ref.getNumber());
}
protected boolean setVisited(PRIndirectReference ref) {
IntHashtable refs = (IntHashtable)visited.get(ref.getReader());
return (refs.put(ref.getNumber(), 1) != 0);
}
protected boolean isPage(PRIndirectReference ref) {
IntHashtable refs = (IntHashtable)pages2intrefs.get(ref.getReader());
return refs.containsKey(ref.getNumber());
}
RandomAccessFileOrArray getReaderFile(PdfReader reader) {
return file;
}
/**
* Sets the bookmarks. The list structure is defined in
* <CODE>SimpleBookmark#</CODE>.
* @param outlines the bookmarks or <CODE>null</CODE> to remove any
*/
public void setOutlines(List outlines) {
newBookmarks = outlines;
}
public void openDoc() {
if (!nd.isOpen())
nd.open();
}
protected static final HashMap widgetKeys = new HashMap();
protected static final HashMap fieldKeys = new HashMap();
static {
Integer one = new Integer(1);
widgetKeys.put(PdfName.SUBTYPE, one);
widgetKeys.put(PdfName.CONTENTS, one);
widgetKeys.put(PdfName.RECT, one);
widgetKeys.put(PdfName.NM, one);
widgetKeys.put(PdfName.M, one);
widgetKeys.put(PdfName.F, one);
widgetKeys.put(PdfName.BS, one);
widgetKeys.put(PdfName.BORDER, one);
widgetKeys.put(PdfName.AP, one);
widgetKeys.put(PdfName.AS, one);
widgetKeys.put(PdfName.C, one);
widgetKeys.put(PdfName.A, one);
widgetKeys.put(PdfName.STRUCTPARENT, one);
widgetKeys.put(PdfName.OC, one);
widgetKeys.put(PdfName.H, one);
widgetKeys.put(PdfName.MK, one);
widgetKeys.put(PdfName.DA, one);
widgetKeys.put(PdfName.Q, one);
fieldKeys.put(PdfName.AA, one);
fieldKeys.put(PdfName.FT, one);
fieldKeys.put(PdfName.TU, one);
fieldKeys.put(PdfName.TM, one);
fieldKeys.put(PdfName.FF, one);
fieldKeys.put(PdfName.V, one);
fieldKeys.put(PdfName.DV, one);
fieldKeys.put(PdfName.DS, one);
fieldKeys.put(PdfName.RV, one);
fieldKeys.put(PdfName.OPT, one);
fieldKeys.put(PdfName.MAXLEN, one);
fieldKeys.put(PdfName.TI, one);
fieldKeys.put(PdfName.I, one);
fieldKeys.put(PdfName.LOCK, one);
fieldKeys.put(PdfName.SV, one);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -