Ejemplo n.º 1
0
 @SuppressWarnings("unchecked")
 void mergeField(String name, AcroFields.Item item) {
   HashMap<String, Object> 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<String, Object>) obj;
         continue;
       } else if (obj instanceof HashMap) map = (HashMap<String, Object>) obj;
       else return;
     } else {
       if (obj instanceof HashMap) return;
       PdfDictionary merged = item.getMerged(0);
       if (obj == null) {
         PdfDictionary field = new PdfDictionary();
         if (PdfName.SIG.equals(merged.get(PdfName.FT))) hasSignature = true;
         for (Object element : merged.getKeys()) {
           PdfName key = (PdfName) element;
           if (fieldKeys.containsKey(key)) field.put(key, merged.get(key));
         }
         ArrayList<Object> list = new ArrayList<Object>();
         list.add(field);
         createWidgets(list, item);
         map.put(s, list);
       } else {
         ArrayList<Object> list = (ArrayList<Object>) 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;
     }
   }
 }
Ejemplo n.º 2
0
  /**
   * Translate a PRDictionary to a PdfDictionary. Also translate all of the objects contained in it.
   */
  protected PdfDictionary copyDictionary(PdfDictionary in)
      throws IOException, BadPdfFormatException {
    PdfDictionary out = new PdfDictionary();
    PdfObject type = PdfReader.getPdfObjectRelease(in.get(PdfName.TYPE));

    for (Iterator it = in.getKeys().iterator(); it.hasNext(); ) {
      PdfName key = (PdfName) it.next();
      PdfObject value = in.get(key);
      // System.out.println("Copy " + key);
      if (type != null && PdfName.PAGE.equals(type)) {
        if (!key.equals(PdfName.B) && !key.equals(PdfName.PARENT)) out.put(key, copyObject(value));
      } else out.put(key, copyObject(value));
    }
    return out;
  }
Ejemplo n.º 3
0
 public void setWidget(Rectangle rect, PdfName highlight) {
   put(PdfName.TYPE, PdfName.ANNOT);
   put(PdfName.SUBTYPE, PdfName.WIDGET);
   put(PdfName.RECT, new PdfRectangle(rect));
   annotation = true;
   if (highlight != null && !highlight.equals(HIGHLIGHT_INVERT)) put(PdfName.H, highlight);
 }
Ejemplo n.º 4
0
 void propagate(PdfObject obj, PdfIndirectReference refo, boolean restricted) throws IOException {
   if (obj == null) return;
   //        if (refo != null)
   //            addToBody(obj, refo);
   if (obj instanceof PdfIndirectReference) return;
   switch (obj.type()) {
     case PdfObject.DICTIONARY:
     case PdfObject.STREAM:
       {
         PdfDictionary dic = (PdfDictionary) obj;
         for (PdfName key : dic.getKeys()) {
           if (restricted && (key.equals(PdfName.PARENT) || key.equals(PdfName.KIDS))) continue;
           PdfObject ob = dic.get(key);
           if (ob != null && ob.isIndirect()) {
             PRIndirectReference ind = (PRIndirectReference) ob;
             if (!setVisited(ind) && !isPage(ind)) {
               PdfIndirectReference ref = getNewReference(ind);
               propagate(PdfReader.getPdfObjectRelease(ind), ref, restricted);
             }
           } else propagate(ob, null, restricted);
         }
         break;
       }
     case PdfObject.ARRAY:
       {
         // PdfArray arr = new PdfArray();
         for (Iterator<PdfObject> it = ((PdfArray) obj).listIterator(); it.hasNext(); ) {
           PdfObject ob = it.next();
           if (ob != null && ob.isIndirect()) {
             PRIndirectReference ind = (PRIndirectReference) ob;
             if (!isVisited(ind) && !isPage(ind)) {
               PdfIndirectReference ref = getNewReference(ind);
               propagate(PdfReader.getPdfObjectRelease(ind), ref, restricted);
             }
           } else propagate(ob, null, restricted);
         }
         break;
       }
     case PdfObject.INDIRECT:
       {
         throw new RuntimeException(
             MessageLocalization.getComposedMessage("reference.pointing.to.reference"));
       }
   }
 }
Ejemplo n.º 5
0
 private void init() {
   encoding = "";
   fontSpecific = false;
   fontType = FONT_TYPE_DOCUMENT;
   PdfName baseFont = font.getAsName(PdfName.BASEFONT);
   fontName = baseFont != null ? PdfName.decodeName(baseFont.toString()) : "Unspecified Font Name";
   PdfName subType = font.getAsName(PdfName.SUBTYPE);
   if (PdfName.TYPE1.equals(subType) || PdfName.TRUETYPE.equals(subType)) doType1TT();
   else {
     PdfName encodingName = font.getAsName(PdfName.ENCODING);
     if (encodingName != null) {
       String enc = PdfName.decodeName(encodingName.toString());
       String ffontname = CJKFont.GetCompatibleFont(enc);
       if (ffontname != null) {
         try {
           cjkMirror = BaseFont.createFont(ffontname, enc, false);
         } catch (Exception e) {
           throw new ExceptionConverter(e);
         }
         cjkEncoding = enc;
         uniMap = ((CJKFont) cjkMirror).getUniMap();
         return;
       }
       if (PdfName.TYPE0.equals(subType) && enc.equals("Identity-H")) {
         processType0(font);
         isType0 = true;
       }
     }
   }
 }
Ejemplo n.º 6
0
  /**
   * merge field attributes from two dictionaries
   *
   * @param parent one dictionary
   * @param child the other dictionary
   * @return a merged dictionary
   */
  protected PdfDictionary mergeAttrib(PdfDictionary parent, PdfDictionary child) {
    PdfDictionary targ = new PdfDictionary();
    if (parent != null) targ.putAll(parent);

    for (Iterator it = child.getKeys().iterator(); it.hasNext(); ) {
      PdfName key = (PdfName) it.next();
      if (key.equals(PdfName.DR)
          || key.equals(PdfName.DA)
          || key.equals(PdfName.Q)
          || key.equals(PdfName.FF)
          || key.equals(PdfName.DV)
          || key.equals(PdfName.V)
          || key.equals(PdfName.FT)
          || key.equals(PdfName.F)) {
        targ.put(key, child.get(key));
      }
    }
    return targ;
  }
Ejemplo n.º 7
0
 private void doType1TT() {
   CMapToUnicode toUnicode = null;
   PdfObject enc = PdfReader.getPdfObject(font.get(PdfName.ENCODING));
   if (enc == null) {
     fillEncoding(null);
     try {
       toUnicode = processToUnicode();
       if (toUnicode != null) {
         Map<Integer, Integer> rm = toUnicode.createReverseMapping();
         for (Map.Entry<Integer, Integer> kv : rm.entrySet()) {
           uni2byte.put(kv.getKey().intValue(), kv.getValue().intValue());
         }
       }
     } catch (Exception ex) {
       throw new ExceptionConverter(ex);
     }
   } else {
     if (enc.isName()) fillEncoding((PdfName) enc);
     else if (enc.isDictionary()) {
       PdfDictionary encDic = (PdfDictionary) enc;
       enc = PdfReader.getPdfObject(encDic.get(PdfName.BASEENCODING));
       if (enc == null) fillEncoding(null);
       else fillEncoding((PdfName) enc);
       PdfArray diffs = encDic.getAsArray(PdfName.DIFFERENCES);
       if (diffs != null) {
         diffmap = new IntHashtable();
         int currentNumber = 0;
         for (int k = 0; k < diffs.size(); ++k) {
           PdfObject obj = diffs.getPdfObject(k);
           if (obj.isNumber()) currentNumber = ((PdfNumber) obj).intValue();
           else {
             int c[] = GlyphList.nameToUnicode(PdfName.decodeName(((PdfName) obj).toString()));
             if (c != null && c.length > 0) {
               uni2byte.put(c[0], currentNumber);
               diffmap.put(c[0], currentNumber);
             } else {
               if (toUnicode == null) {
                 toUnicode = processToUnicode();
                 if (toUnicode == null) {
                   toUnicode = new CMapToUnicode();
                 }
               }
               final String unicode = toUnicode.lookup(new byte[] {(byte) currentNumber}, 0, 1);
               if ((unicode != null) && (unicode.length() == 1)) {
                 this.uni2byte.put(unicode.charAt(0), currentNumber);
                 this.diffmap.put(unicode.charAt(0), currentNumber);
               }
             }
             ++currentNumber;
           }
         }
       }
     }
   }
   PdfArray newWidths = font.getAsArray(PdfName.WIDTHS);
   PdfNumber first = font.getAsNumber(PdfName.FIRSTCHAR);
   PdfNumber last = font.getAsNumber(PdfName.LASTCHAR);
   if (BuiltinFonts14.containsKey(fontName)) {
     BaseFont bf;
     try {
       bf = BaseFont.createFont(fontName, WINANSI, false);
     } catch (Exception e) {
       throw new ExceptionConverter(e);
     }
     int e[] = uni2byte.toOrderedKeys();
     for (int k = 0; k < e.length; ++k) {
       int n = uni2byte.get(e[k]);
       widths[n] = bf.getRawWidth(n, GlyphList.unicodeToName(e[k]));
     }
     if (diffmap != null) { // widths for diffmap must override existing ones
       e = diffmap.toOrderedKeys();
       for (int k = 0; k < e.length; ++k) {
         int n = diffmap.get(e[k]);
         widths[n] = bf.getRawWidth(n, GlyphList.unicodeToName(e[k]));
       }
       diffmap = null;
     }
     ascender = bf.getFontDescriptor(ASCENT, 1000);
     capHeight = bf.getFontDescriptor(CAPHEIGHT, 1000);
     descender = bf.getFontDescriptor(DESCENT, 1000);
     italicAngle = bf.getFontDescriptor(ITALICANGLE, 1000);
     fontWeight = bf.getFontDescriptor(FONT_WEIGHT, 1000);
     llx = bf.getFontDescriptor(BBOXLLX, 1000);
     lly = bf.getFontDescriptor(BBOXLLY, 1000);
     urx = bf.getFontDescriptor(BBOXURX, 1000);
     ury = bf.getFontDescriptor(BBOXURY, 1000);
   }
   if (first != null && last != null && newWidths != null) {
     int f = first.intValue();
     int nSize = f + newWidths.size();
     if (widths.length < nSize) {
       int[] tmp = new int[nSize];
       System.arraycopy(widths, 0, tmp, 0, f);
       widths = tmp;
     }
     for (int k = 0; k < newWidths.size(); ++k) {
       widths[f + k] = newWidths.getAsNumber(k).intValue();
     }
   }
   fillFontDesc(font.getAsDict(PdfName.FONTDESCRIPTOR));
 }
Ejemplo n.º 8
0
 /**
  * Checks if a <CODE>Dictionary</CODE> is of the type OUTLINES.
  *
  * @return <CODE>true</CODE> if it is, otherwise <CODE>false</CODE>.
  */
 public boolean isOutlineTree() {
   return OUTLINES.equals(dictionaryType);
 }
Ejemplo n.º 9
0
 /**
  * Checks if a <CODE>Dictionary</CODE> is of the type CATALOG.
  *
  * @return <CODE>true</CODE> if it is, otherwise <CODE>false</CODE>.
  */
 public boolean isCatalog() {
   return CATALOG.equals(dictionaryType);
 }
Ejemplo n.º 10
0
 /**
  * Checks if a <CODE>Dictionary</CODE> is of the type PAGES.
  *
  * @return <CODE>true</CODE> if it is, otherwise <CODE>false</CODE>.
  */
 public boolean isPages() {
   return PAGES.equals(dictionaryType);
 }
Ejemplo n.º 11
0
 /**
  * Checks if a <CODE>Dictionary</CODE> is of the type FONT.
  *
  * @return <CODE>true</CODE> if it is, otherwise <CODE>false</CODE>.
  */
 public boolean isFont() {
   return FONT.equals(dictionaryType);
 }