Beispiel #1
0
  /**
   * Retrieves the page labels from a PDF as an array of String objects.
   *
   * @param reader a PdfReader object that has the page labels you want to retrieve
   * @return a String array or <code>null</code> if no page labels are present
   */
  public static String[] getPageLabels(PdfReader reader) {

    int n = reader.getNumberOfPages();

    PdfDictionary dict = reader.getCatalog();
    PdfDictionary labels =
        (PdfDictionary) PdfReader.getPdfObjectRelease(dict.get(PdfName.PAGELABELS));
    if (labels == null) return null;

    String[] labelstrings = new String[n];

    HashMap<Integer, PdfObject> numberTree = PdfNumberTree.readTree(labels);

    int pagecount = 1;
    Integer current;
    String prefix = "";
    char type = 'D';
    for (int i = 0; i < n; i++) {
      current = Integer.valueOf(i);
      if (numberTree.containsKey(current)) {
        PdfDictionary d = (PdfDictionary) PdfReader.getPdfObjectRelease(numberTree.get(current));
        if (d.contains(PdfName.ST)) {
          pagecount = ((PdfNumber) d.get(PdfName.ST)).intValue();
        } else {
          pagecount = 1;
        }
        if (d.contains(PdfName.P)) {
          prefix = ((PdfString) d.get(PdfName.P)).toUnicodeString();
        }
        if (d.contains(PdfName.S)) {
          type = ((PdfName) d.get(PdfName.S)).toString().charAt(1);
        } else {
          type = 'e';
        }
      }
      switch (type) {
        default:
          labelstrings[i] = prefix + pagecount;
          break;
        case 'R':
          labelstrings[i] = prefix + RomanNumberFactory.getUpperCaseString(pagecount);
          break;
        case 'r':
          labelstrings[i] = prefix + RomanNumberFactory.getLowerCaseString(pagecount);
          break;
        case 'A':
          labelstrings[i] = prefix + RomanAlphabetFactory.getUpperCaseString(pagecount);
          break;
        case 'a':
          labelstrings[i] = prefix + RomanAlphabetFactory.getLowerCaseString(pagecount);
          break;
        case 'e':
          labelstrings[i] = prefix;
          break;
      }
      pagecount++;
    }
    return labelstrings;
  }
Beispiel #2
0
 /**
  * Retrieves the page labels from a PDF as an array of {@link PdfPageLabelFormat} objects.
  *
  * @param reader a PdfReader object that has the page labels you want to retrieve
  * @return a PdfPageLabelEntry array, containing an entry for each format change or <code>null
  *     </code> if no page labels are present
  */
 public static PdfPageLabelFormat[] getPageLabelFormats(PdfReader reader) {
   PdfDictionary dict = reader.getCatalog();
   PdfDictionary labels =
       (PdfDictionary) PdfReader.getPdfObjectRelease(dict.get(PdfName.PAGELABELS));
   if (labels == null) return null;
   HashMap<Integer, PdfObject> numberTree = PdfNumberTree.readTree(labels);
   Integer numbers[] = new Integer[numberTree.size()];
   numbers = numberTree.keySet().toArray(numbers);
   Arrays.sort(numbers);
   PdfPageLabelFormat[] formats = new PdfPageLabelFormat[numberTree.size()];
   String prefix;
   int numberStyle;
   int pagecount;
   for (int k = 0; k < numbers.length; ++k) {
     Integer key = numbers[k];
     PdfDictionary d = (PdfDictionary) PdfReader.getPdfObjectRelease(numberTree.get(key));
     if (d.contains(PdfName.ST)) {
       pagecount = ((PdfNumber) d.get(PdfName.ST)).intValue();
     } else {
       pagecount = 1;
     }
     if (d.contains(PdfName.P)) {
       prefix = ((PdfString) d.get(PdfName.P)).toUnicodeString();
     } else {
       prefix = "";
     }
     if (d.contains(PdfName.S)) {
       char type = ((PdfName) d.get(PdfName.S)).toString().charAt(1);
       switch (type) {
         case 'R':
           numberStyle = UPPERCASE_ROMAN_NUMERALS;
           break;
         case 'r':
           numberStyle = LOWERCASE_ROMAN_NUMERALS;
           break;
         case 'A':
           numberStyle = UPPERCASE_LETTERS;
           break;
         case 'a':
           numberStyle = LOWERCASE_LETTERS;
           break;
         default:
           numberStyle = DECIMAL_ARABIC_NUMERALS;
           break;
       }
     } else {
       numberStyle = EMPTY;
     }
     formats[k] = new PdfPageLabelFormat(key.intValue() + 1, numberStyle, prefix, pagecount);
   }
   return formats;
 }
Beispiel #3
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 (Object element : in.getKeys()) {
      PdfName key = (PdfName) element;
      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;
  }
 void createWidgets(ArrayList<Object> list, AcroFields.Item item) {
   for (int k = 0; k < item.size(); ++k) {
     list.add(item.getPage(k));
     PdfDictionary merged = item.getMerged(k);
     PdfObject dr = merged.get(PdfName.DR);
     if (dr != null)
       PdfFormField.mergeResources(resources, (PdfDictionary) PdfReader.getPdfObject(dr));
     PdfDictionary widget = new PdfDictionary();
     for (Object element : merged.getKeys()) {
       PdfName key = (PdfName) element;
       if (widgetKeys.containsKey(key)) widget.put(key, merged.get(key));
     }
     widget.put(iTextTag, new PdfNumber(item.getTabOrder(k).intValue() + 1));
     list.add(widget);
   }
 }
 /**
  * If the child of a structured element is a dictionary, we inspect the child; we may also draw a
  * tag.
  *
  * @param k the child dictionary to inspect
  */
 public void inspectChildDictionary(PdfDictionary k) throws IOException {
   if (k == null) return;
   PdfName s = k.getAsName(PdfName.S);
   if (s != null) {
     String tagN = PdfName.decodeName(s.toString());
     String tag = fixTagName(tagN);
     out.print("<");
     out.print(tag);
     out.print(">");
     PdfDictionary dict = k.getAsDict(PdfName.PG);
     if (dict != null) parseTag(tagN, k.getDirectObject(PdfName.K), dict);
     inspectChild(k.get(PdfName.K));
     out.print("</");
     out.print(tag);
     out.println(">");
   } else inspectChild(k.get(PdfName.K));
 }
Beispiel #6
0
 public void alterContents() throws IOException {
   if (over == null && under == null) return;
   PdfArray ar = null;
   PdfObject content = PdfReader.getPdfObject(pageN.get(PdfName.CONTENTS), pageN);
   if (content == null) {
     ar = new PdfArray();
     pageN.put(PdfName.CONTENTS, ar);
   } else if (content.isArray()) {
     ar = (PdfArray) content;
   } else if (content.isStream()) {
     ar = new PdfArray();
     ar.add(pageN.get(PdfName.CONTENTS));
     pageN.put(PdfName.CONTENTS, ar);
   } else {
     ar = new PdfArray();
     pageN.put(PdfName.CONTENTS, ar);
   }
   ByteBuffer out = new ByteBuffer();
   if (under != null) {
     out.append(PdfContents.SAVESTATE);
     applyRotation(pageN, out);
     out.append(under.getInternalBuffer());
     out.append(PdfContents.RESTORESTATE);
   }
   if (over != null) out.append(PdfContents.SAVESTATE);
   PdfStream stream = new PdfStream(out.toByteArray());
   stream.flateCompress(cstp.getCompressionLevel());
   PdfIndirectReference ref1 = cstp.addToBody(stream).getIndirectReference();
   ar.addFirst(ref1);
   out.reset();
   if (over != null) {
     out.append(' ');
     out.append(PdfContents.RESTORESTATE);
     out.append(PdfContents.SAVESTATE);
     applyRotation(pageN, out);
     out.append(over.getInternalBuffer());
     out.append(PdfContents.RESTORESTATE);
     stream = new PdfStream(out.toByteArray());
     stream.flateCompress(cstp.getCompressionLevel());
     ar.add(cstp.addToBody(stream).getIndirectReference());
   }
   pageN.put(PdfName.RESOURCES, pageResources.getResources());
 }
Beispiel #7
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);
    }
  }
Beispiel #8
0
 /** convenience method. Given a reader, set our "globals" */
 protected void setFromReader(PdfReader reader) {
   this.reader = reader;
   indirects = indirectMap.get(reader);
   if (indirects == null) {
     indirects = new HashMap<RefKey, IndirectReferences>();
     indirectMap.put(reader, indirects);
     PdfDictionary catalog = reader.getCatalog();
     PRIndirectReference ref = null;
     PdfObject o = catalog.get(PdfName.ACROFORM);
     if (o == null || o.type() != PdfObject.INDIRECT) return;
     ref = (PRIndirectReference) o;
     if (acroForm == null) acroForm = body.getPdfIndirectReference();
     indirects.put(new RefKey(ref), new IndirectReferences(acroForm));
   }
 }
 private static String getCOName(PdfReader reader, PRIndirectReference ref) {
   String name = "";
   while (ref != null) {
     PdfObject obj = PdfReader.getPdfObject(ref);
     if (obj == null || obj.type() != PdfObject.DICTIONARY) break;
     PdfDictionary dic = (PdfDictionary) obj;
     PdfString t = dic.getAsString(PdfName.T);
     if (t != null) {
       name = t.toUnicodeString() + "." + name;
     }
     ref = (PRIndirectReference) dic.get(PdfName.PARENT);
   }
   if (name.endsWith(".")) name = name.substring(0, name.length() - 1);
   return name;
 }
 @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;
     }
   }
 }
 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"));
       }
   }
 }
Beispiel #12
0
  /**
   * Copy the acroform for an input document. Note that you can only have one, we make no effort to
   * merge them.
   *
   * @param reader The reader of the input file that is being copied
   * @throws IOException, BadPdfFormatException
   */
  public void copyAcroForm(PdfReader reader) throws IOException, BadPdfFormatException {
    setFromReader(reader);

    PdfDictionary catalog = reader.getCatalog();
    PRIndirectReference hisRef = null;
    PdfObject o = catalog.get(PdfName.ACROFORM);
    if (o != null && o.type() == PdfObject.INDIRECT) hisRef = (PRIndirectReference) o;
    if (hisRef == null) return; // bugfix by John Englar
    RefKey key = new RefKey(hisRef);
    PdfIndirectReference myRef;
    IndirectReferences iRef = indirects.get(key);
    if (iRef != null) {
      acroForm = myRef = iRef.getRef();
    } else {
      acroForm = myRef = body.getPdfIndirectReference();
      iRef = new IndirectReferences(myRef);
      indirects.put(key, iRef);
    }
    if (!iRef.getCopied()) {
      iRef.setCopied();
      PdfDictionary theForm = copyDictionary((PdfDictionary) PdfReader.getPdfObject(hisRef));
      addToBody(theForm, myRef);
    }
  }
Beispiel #13
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));
 }
 /**
  * Business logic that checks if a certain object is in conformance with PDF/X.
  *
  * @param key the type of PDF ISO conformance that has to be checked
  * @param obj1 the object that is checked for conformance
  */
 public void checkPdfIsoConformance(int key, Object obj1) {
   if (writer == null || !writer.isPdfX()) return;
   int conf = writer.getPDFXConformance();
   switch (key) {
     case PdfIsoKeys.PDFISOKEY_COLOR:
       switch (conf) {
         case PdfWriter.PDFX1A2001:
           if (obj1 instanceof ExtendedColor) {
             ExtendedColor ec = (ExtendedColor) obj1;
             switch (ec.getType()) {
               case ExtendedColor.TYPE_CMYK:
               case ExtendedColor.TYPE_GRAY:
                 return;
               case ExtendedColor.TYPE_RGB:
                 throw new PdfXConformanceException(
                     MessageLocalization.getComposedMessage("colorspace.rgb.is.not.allowed"));
               case ExtendedColor.TYPE_SEPARATION:
                 SpotColor sc = (SpotColor) ec;
                 checkPdfIsoConformance(
                     PdfIsoKeys.PDFISOKEY_COLOR, sc.getPdfSpotColor().getAlternativeCS());
                 break;
               case ExtendedColor.TYPE_SHADING:
                 ShadingColor xc = (ShadingColor) ec;
                 checkPdfIsoConformance(
                     PdfIsoKeys.PDFISOKEY_COLOR,
                     xc.getPdfShadingPattern().getShading().getColorSpace());
                 break;
               case ExtendedColor.TYPE_PATTERN:
                 PatternColor pc = (PatternColor) ec;
                 checkPdfIsoConformance(
                     PdfIsoKeys.PDFISOKEY_COLOR, pc.getPainter().getDefaultColor());
                 break;
             }
           } else if (obj1 instanceof BaseColor)
             throw new PdfXConformanceException(
                 MessageLocalization.getComposedMessage("colorspace.rgb.is.not.allowed"));
           break;
       }
       break;
     case PdfIsoKeys.PDFISOKEY_CMYK:
       break;
     case PdfIsoKeys.PDFISOKEY_RGB:
       if (conf == PdfWriter.PDFX1A2001)
         throw new PdfXConformanceException(
             MessageLocalization.getComposedMessage("colorspace.rgb.is.not.allowed"));
       break;
     case PdfIsoKeys.PDFISOKEY_FONT:
       if (!((BaseFont) obj1).isEmbedded())
         throw new PdfXConformanceException(
             MessageLocalization.getComposedMessage(
                 "all.the.fonts.must.be.embedded.this.one.isn.t.1",
                 ((BaseFont) obj1).getPostscriptFontName()));
       break;
     case PdfIsoKeys.PDFISOKEY_IMAGE:
       PdfImage image = (PdfImage) obj1;
       if (image.get(PdfName.SMASK) != null)
         throw new PdfXConformanceException(
             MessageLocalization.getComposedMessage("the.smask.key.is.not.allowed.in.images"));
       switch (conf) {
         case PdfWriter.PDFX1A2001:
           PdfObject cs = image.get(PdfName.COLORSPACE);
           if (cs == null) return;
           if (cs.isName()) {
             if (PdfName.DEVICERGB.equals(cs))
               throw new PdfXConformanceException(
                   MessageLocalization.getComposedMessage("colorspace.rgb.is.not.allowed"));
           } else if (cs.isArray()) {
             if (PdfName.CALRGB.equals(((PdfArray) cs).getPdfObject(0)))
               throw new PdfXConformanceException(
                   MessageLocalization.getComposedMessage("colorspace.calrgb.is.not.allowed"));
           }
           break;
       }
       break;
     case PdfIsoKeys.PDFISOKEY_GSTATE:
       PdfDictionary gs = (PdfDictionary) obj1;
       // The example PdfXPdfA threw a NullPointerException because gs was null
       if (gs == null) break;
       PdfObject obj = gs.get(PdfName.BM);
       if (obj != null && !PdfGState.BM_NORMAL.equals(obj) && !PdfGState.BM_COMPATIBLE.equals(obj))
         throw new PdfXConformanceException(
             MessageLocalization.getComposedMessage("blend.mode.1.not.allowed", obj.toString()));
       obj = gs.get(PdfName.CA);
       double v = 0.0;
       if (obj != null && (v = ((PdfNumber) obj).doubleValue()) != 1.0)
         throw new PdfXConformanceException(
             MessageLocalization.getComposedMessage(
                 "transparency.is.not.allowed.ca.eq.1", String.valueOf(v)));
       obj = gs.get(PdfName.ca);
       v = 0.0;
       if (obj != null && (v = ((PdfNumber) obj).doubleValue()) != 1.0)
         throw new PdfXConformanceException(
             MessageLocalization.getComposedMessage(
                 "transparency.is.not.allowed.ca.eq.1", String.valueOf(v)));
       break;
     case PdfIsoKeys.PDFISOKEY_LAYER:
       throw new PdfXConformanceException(
           MessageLocalization.getComposedMessage("layers.are.not.allowed"));
   }
 }
Beispiel #15
0
 public void addAnnotation(PdfAnnotation annot) {
   try {
     ArrayList<PdfAnnotation> allAnnots = new ArrayList<PdfAnnotation>();
     if (annot.isForm()) {
       PdfFormField field = (PdfFormField) annot;
       if (field.getParent() != null) return;
       expandFields(field, allAnnots);
       if (cstp.fieldTemplates == null) cstp.fieldTemplates = new HashSet<PdfTemplate>();
     } else allAnnots.add(annot);
     for (int k = 0; k < allAnnots.size(); ++k) {
       annot = allAnnots.get(k);
       if (annot.isForm()) {
         if (!annot.isUsed()) {
           HashSet<PdfTemplate> templates = annot.getTemplates();
           if (templates != null) cstp.fieldTemplates.addAll(templates);
         }
         PdfFormField field = (PdfFormField) annot;
         if (field.getParent() == null) addDocumentField(field.getIndirectReference());
       }
       if (annot.isAnnotation()) {
         PdfObject pdfobj = PdfReader.getPdfObject(pageN.get(PdfName.ANNOTS), pageN);
         PdfArray annots = null;
         if (pdfobj == null || !pdfobj.isArray()) {
           annots = new PdfArray();
           pageN.put(PdfName.ANNOTS, annots);
         } else annots = (PdfArray) pdfobj;
         annots.add(annot.getIndirectReference());
         if (!annot.isUsed()) {
           PdfRectangle rect = (PdfRectangle) annot.get(PdfName.RECT);
           if (rect != null
               && (rect.left() != 0
                   || rect.right() != 0
                   || rect.top() != 0
                   || rect.bottom() != 0)) {
             int rotation = reader.getPageRotation(pageN);
             Rectangle pageSize = reader.getPageSizeWithRotation(pageN);
             switch (rotation) {
               case 90:
                 annot.put(
                     PdfName.RECT,
                     new PdfRectangle(
                         pageSize.getTop() - rect.bottom(),
                         rect.left(),
                         pageSize.getTop() - rect.top(),
                         rect.right()));
                 break;
               case 180:
                 annot.put(
                     PdfName.RECT,
                     new PdfRectangle(
                         pageSize.getRight() - rect.left(),
                         pageSize.getTop() - rect.bottom(),
                         pageSize.getRight() - rect.right(),
                         pageSize.getTop() - rect.top()));
                 break;
               case 270:
                 annot.put(
                     PdfName.RECT,
                     new PdfRectangle(
                         rect.bottom(),
                         pageSize.getRight() - rect.left(),
                         rect.top(),
                         pageSize.getRight() - rect.right()));
                 break;
             }
           }
         }
       }
       if (!annot.isUsed()) {
         annot.setUsed();
         cstp.addToBody(annot, annot.getIndirectReference());
       }
     }
   } catch (IOException e) {
     throw new ExceptionConverter(e);
   }
 }
 @SuppressWarnings("unchecked")
 protected PdfArray branchForm(
     HashMap<String, Object> level, PdfIndirectReference parent, String fname) throws IOException {
   PdfArray arr = new PdfArray();
   for (Map.Entry<String, Object> entry : level.entrySet()) {
     String name = entry.getKey();
     Object obj = entry.getValue();
     PdfIndirectReference ind = getPdfIndirectReference();
     PdfDictionary dic = new PdfDictionary();
     if (parent != null) dic.put(PdfName.PARENT, parent);
     dic.put(PdfName.T, new PdfString(name, PdfObject.TEXT_UNICODE));
     String fname2 = fname + "." + name;
     int coidx = calculationOrder.indexOf(fname2);
     if (coidx >= 0) calculationOrderRefs.set(coidx, ind);
     if (obj instanceof HashMap) {
       dic.put(PdfName.KIDS, branchForm((HashMap<String, Object>) obj, ind, fname2));
       arr.add(ind);
       addToBody(dic, ind);
     } else {
       ArrayList<Object> list = (ArrayList<Object>) obj;
       dic.mergeDifferent((PdfDictionary) list.get(0));
       if (list.size() == 3) {
         dic.mergeDifferent((PdfDictionary) list.get(2));
         int page = ((Integer) list.get(1)).intValue();
         PdfDictionary pageDic = pageDics.get(page - 1);
         PdfArray annots = pageDic.getAsArray(PdfName.ANNOTS);
         if (annots == null) {
           annots = new PdfArray();
           pageDic.put(PdfName.ANNOTS, annots);
         }
         PdfNumber nn = (PdfNumber) dic.get(iTextTag);
         dic.remove(iTextTag);
         adjustTabOrder(annots, ind, nn);
       } else {
         PdfArray kids = new PdfArray();
         for (int k = 1; k < list.size(); k += 2) {
           int page = ((Integer) list.get(k)).intValue();
           PdfDictionary pageDic = pageDics.get(page - 1);
           PdfArray annots = pageDic.getAsArray(PdfName.ANNOTS);
           if (annots == null) {
             annots = new PdfArray();
             pageDic.put(PdfName.ANNOTS, annots);
           }
           PdfDictionary widget = new PdfDictionary();
           widget.merge((PdfDictionary) list.get(k + 1));
           widget.put(PdfName.PARENT, ind);
           PdfNumber nn = (PdfNumber) widget.get(iTextTag);
           widget.remove(iTextTag);
           PdfIndirectReference wref = addToBody(widget).getIndirectReference();
           adjustTabOrder(annots, wref, nn);
           kids.add(wref);
           propagate(widget, null, false);
         }
         dic.put(PdfName.KIDS, kids);
       }
       arr.add(ind);
       addToBody(dic, ind);
       propagate(dic, null, false);
     }
   }
   return arr;
 }