示例#1
0
 public int setFieldFlags(int flags) {
   PdfNumber obj = (PdfNumber) get(PdfName.FF);
   int old;
   if (obj == null) old = 0;
   else old = obj.intValue();
   int v = old | flags;
   put(PdfName.FF, new PdfNumber(v));
   return old;
 }
 private void adjustTabOrder(PdfArray annots, PdfIndirectReference ind, PdfNumber nn) {
   int v = nn.intValue();
   ArrayList<Integer> t = tabOrder.get(annots);
   if (t == null) {
     t = new ArrayList<Integer>();
     int size = annots.size() - 1;
     for (int k = 0; k < size; ++k) {
       t.add(zero);
     }
     t.add(Integer.valueOf(v));
     tabOrder.put(annots, t);
     annots.add(ind);
   } else {
     int size = t.size() - 1;
     for (int k = size; k >= 0; --k) {
       if (t.get(k).intValue() <= v) {
         t.add(k + 1, Integer.valueOf(v));
         annots.add(k + 1, ind);
         size = -2;
         break;
       }
     }
     if (size != -2) {
       t.add(0, Integer.valueOf(v));
       annots.add(0, ind);
     }
   }
 }
示例#3
0
  private void processType0(PdfDictionary font) {
    try {
      PdfObject toUniObject = PdfReader.getPdfObjectRelease(font.get(PdfName.TOUNICODE));
      PdfArray df = (PdfArray) PdfReader.getPdfObjectRelease(font.get(PdfName.DESCENDANTFONTS));
      PdfDictionary cidft = (PdfDictionary) PdfReader.getPdfObjectRelease(df.getPdfObject(0));
      PdfNumber dwo = (PdfNumber) PdfReader.getPdfObjectRelease(cidft.get(PdfName.DW));
      int dw = 1000;
      if (dwo != null) dw = dwo.intValue();
      IntHashtable widths =
          readWidths((PdfArray) PdfReader.getPdfObjectRelease(cidft.get(PdfName.W)));
      PdfDictionary fontDesc =
          (PdfDictionary) PdfReader.getPdfObjectRelease(cidft.get(PdfName.FONTDESCRIPTOR));
      fillFontDesc(fontDesc);
      if (toUniObject instanceof PRStream) {
        fillMetrics(PdfReader.getStreamBytes((PRStream) toUniObject), widths, dw);
      }

    } catch (Exception e) {
      throw new ExceptionConverter(e);
    }
  }
示例#4
0
 private void fillFontDesc(PdfDictionary fontDesc) {
   if (fontDesc == null) return;
   PdfNumber v = fontDesc.getAsNumber(PdfName.ASCENT);
   if (v != null) ascender = v.floatValue();
   v = fontDesc.getAsNumber(PdfName.CAPHEIGHT);
   if (v != null) capHeight = v.floatValue();
   v = fontDesc.getAsNumber(PdfName.DESCENT);
   if (v != null) descender = v.floatValue();
   v = fontDesc.getAsNumber(PdfName.ITALICANGLE);
   if (v != null) italicAngle = v.floatValue();
   v = fontDesc.getAsNumber(PdfName.FONTWEIGHT);
   if (v != null) {
     fontWeight = v.floatValue();
   }
   PdfArray bbox = fontDesc.getAsArray(PdfName.FONTBBOX);
   if (bbox != null) {
     llx = bbox.getAsNumber(0).floatValue();
     lly = bbox.getAsNumber(1).floatValue();
     urx = bbox.getAsNumber(2).floatValue();
     ury = bbox.getAsNumber(3).floatValue();
     if (llx > urx) {
       float t = llx;
       llx = urx;
       urx = t;
     }
     if (lly > ury) {
       float t = lly;
       lly = ury;
       ury = t;
     }
   }
   float maxAscent = Math.max(ury, ascender);
   float minDescent = Math.min(lly, descender);
   ascender = maxAscent * 1000 / (maxAscent - minDescent);
   descender = minDescent * 1000 / (maxAscent - minDescent);
 }
示例#5
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));
 }