コード例 #1
0
ファイル: PdfArray.java プロジェクト: sunrenjie/itext
  /**
   * Writes the PDF representation of this <CODE>PdfArray</CODE> as an array of <CODE>byte</CODE> to
   * the specified <CODE>OutputStream</CODE>.
   *
   * @param writer for backwards compatibility
   * @param os the <CODE>OutputStream</CODE> to write the bytes to.
   */
  @Override
  public void toPdf(final PdfWriter writer, final OutputStream os) throws IOException {
    PdfWriter.checkPdfIsoConformance(writer, PdfIsoKeys.PDFISOKEY_OBJECT, this);
    os.write('[');

    Iterator<PdfObject> i = arrayList.iterator();
    PdfObject object;
    int type = 0;
    if (i.hasNext()) {
      object = i.next();
      if (object == null) object = PdfNull.PDFNULL;
      object.toPdf(writer, os);
    }
    while (i.hasNext()) {
      object = i.next();
      if (object == null) object = PdfNull.PDFNULL;
      type = object.type();
      if (type != PdfObject.ARRAY
          && type != PdfObject.DICTIONARY
          && type != PdfObject.NAME
          && type != PdfObject.STRING) os.write(' ');
      object.toPdf(writer, os);
    }
    os.write(']');
  }
コード例 #2
0
ファイル: PdfCopy.java プロジェクト: thomashunziker/SIAPDF
 /**
  * Translate a PRIndirectReference to a PdfIndirectReference In addition, translates the object
  * numbers, and copies the referenced object to the output file. NB: PRIndirectReferences (and
  * PRIndirectObjects) really need to know what file they came from, because each file has its own
  * namespace. The translation we do from their namespace to ours is *at best* heuristic, and
  * guaranteed to fail under some circumstances.
  */
 protected PdfIndirectReference copyIndirect(PRIndirectReference in)
     throws IOException, BadPdfFormatException {
   PdfIndirectReference theRef;
   RefKey key = new RefKey(in);
   IndirectReferences iRef = (IndirectReferences) indirects.get(key);
   if (iRef != null) {
     theRef = iRef.getRef();
     if (iRef.getCopied()) {
       return theRef;
     }
   } else {
     theRef = body.getPdfIndirectReference();
     iRef = new IndirectReferences(theRef);
     indirects.put(key, iRef);
   }
   PdfObject obj = PdfReader.getPdfObjectRelease(in);
   if (obj != null && obj.isDictionary()) {
     PdfObject type = PdfReader.getPdfObjectRelease(((PdfDictionary) obj).get(PdfName.TYPE));
     if (type != null && PdfName.PAGE.equals(type)) {
       return theRef;
     }
   }
   iRef.setCopied();
   obj = copyObject(obj);
   addToBody(obj, theRef);
   return theRef;
 }
コード例 #3
0
  public void setDictionary(int id, PdfObject value) {

    value.setID(id);

    switch (id) {
      case PdfDictionary.Encrypt:
        Encrypt = value;
        break;

      case PdfDictionary.Extends:
        Extends = value;
        break;

      case PdfDictionary.Info:
        Info = value;
        break;

      case PdfDictionary.Root:
        Root = value;
        break;

        //            case PdfDictionary.XObject:
        //            	XObject=value;
        //    		break;

      default:
        super.setDictionary(id, value);
    }
  }
コード例 #4
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;
     }
   }
 }
コード例 #5
0
 /**
  * Add a chained action.
  *
  * @param na the next action
  */
 public void next(PdfAction na) {
   PdfObject nextAction = get(PdfName.NEXT);
   if (nextAction == null) put(PdfName.NEXT, na);
   else if (nextAction.isDictionary()) {
     PdfArray array = new PdfArray(nextAction);
     array.add(na);
     put(PdfName.NEXT, array);
   } else {
     ((PdfArray) nextAction).add(na);
   }
 }
コード例 #6
0
  @Override
  public void setDictionary(final int id, final PdfObject value) {

    value.setID(id);

    switch (id) {
      case PdfDictionary.TR:
        TR = value;
        break;

      default:
        super.setDictionary(id, value);
    }
  }
コード例 #7
0
 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;
 }
コード例 #8
0
ファイル: PdfCopy.java プロジェクト: thomashunziker/SIAPDF
 /** convenience method. Given a reader, set our "globals" */
 protected void setFromReader(PdfReader reader) {
   this.reader = reader;
   indirects = (HashMap) indirectMap.get(reader);
   if (indirects == null) {
     indirects = new HashMap();
     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));
   }
 }
コード例 #9
0
  public void setIntNumber(int id, int value) {

    switch (id) {
      case PdfDictionary.First:
        First = value;
        break;

      case PdfDictionary.Prev:

        // some PDFs can get multiple values and second one wrong
        if (Prev == -1) Prev = value;
        break;

      case PdfDictionary.Size:
        Size = value;
        break;
        //
        //	        case PdfDictionary.Height:
        //	            Height=value;
        //	        break;
        //
      case PdfDictionary.XRefStm:
        XRefStm = value;
        break;

      default:
        super.setIntNumber(id, value);
    }
  }
コード例 #10
0
  @Override
  public void setFloatNumber(final int id, final float value) {

    switch (id) {
      default:
        super.setFloatNumber(id, value);
    }
  }
コード例 #11
0
  @Override
  public void setDoubleArray(final int id, final double[] value) {

    switch (id) {
      default:
        super.setDoubleArray(id, value);
    }
  }
コード例 #12
0
 /** @since 2.1.5; before 2.1.5 the method was private */
 protected void updateCalculationOrder(PdfReader reader) {
   PdfDictionary catalog = reader.getCatalog();
   PdfDictionary acro = catalog.getAsDict(PdfName.ACROFORM);
   if (acro == null) return;
   PdfArray co = acro.getAsArray(PdfName.CO);
   if (co == null || co.size() == 0) return;
   AcroFields af = reader.getAcroFields();
   for (int k = 0; k < co.size(); ++k) {
     PdfObject obj = co.getPdfObject(k);
     if (obj == null || !obj.isIndirect()) continue;
     String name = getCOName(reader, (PRIndirectReference) obj);
     if (af.getFieldItem(name) == null) continue;
     name = "." + name;
     if (calculationOrder.contains(name)) continue;
     calculationOrder.add(name);
   }
 }
コード例 #13
0
  @Override
  public void setStringArray(final int id, final byte[][] value) {

    switch (id) {
      default:
        super.setStringArray(id, value);
    }
  }
コード例 #14
0
  @Override
  public void setFloatArray(final int id, final float[] value) {

    switch (id) {
      default:
        super.setFloatArray(id, value);
    }
  }
コード例 #15
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"));
       }
   }
 }
コード例 #16
0
ファイル: PdfCopy.java プロジェクト: thomashunziker/SIAPDF
 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());
 }
コード例 #17
0
  public void checkParentForResources(final PdfObject pdfObject) {

    /** if no resource, check parent for one (in theory should recurse up whole tree) */
    if (pdfObject.getDictionary(PdfDictionary.Resources) == null) {

      final String parent = pdfObject.getStringKey(PdfDictionary.Parent);

      if (parent != null) {
        final PdfObject parentObj = new PageObject(parent);
        readObject(parentObj);

        final PdfObject resObj = parentObj.getDictionary(PdfDictionary.Resources);

        if (resObj != null) {
          pdfObject.setDictionary(PdfDictionary.Resources, resObj);
        }
      }
    }
  }
コード例 #18
0
  public void setStringArray(int id, byte[][] value) {

    switch (id) {
      case PdfDictionary.ID:
        ID = value;
        break;

      default:
        super.setStringArray(id, value);
    }
  }
コード例 #19
0
ファイル: PdfDictionary.java プロジェクト: dquangsinh/fb2pdf
 /**
  * Writes the PDF representation of this <CODE>PdfDictionary</CODE> as an array of <CODE>byte
  * </CODE> to the given <CODE>OutputStream</CODE>.
  *
  * @param writer for backwards compatibility
  * @param os the <CODE>OutputStream</CODE> to write the bytes to.
  * @throws IOException
  */
 @Override
 public void toPdf(final PdfWriter writer, final OutputStream os) throws IOException {
   os.write('<');
   os.write('<');
   // loop over all the object-pairs in the HashMap
   PdfObject value;
   int type = 0;
   for (Entry<PdfName, PdfObject> e : hashMap.entrySet()) {
     e.getKey().toPdf(writer, os);
     value = e.getValue();
     type = value.type();
     if (type != PdfObject.ARRAY
         && type != PdfObject.DICTIONARY
         && type != PdfObject.NAME
         && type != PdfObject.STRING) os.write(' ');
     value.toPdf(writer, os);
   }
   os.write('>');
   os.write('>');
 }
コード例 #20
0
ファイル: DocumentFont.java プロジェクト: dquangsinh/fb2pdf
 private IntHashtable readWidths(PdfArray ws) {
   IntHashtable hh = new IntHashtable();
   if (ws == null) return hh;
   for (int k = 0; k < ws.size(); ++k) {
     int c1 = ((PdfNumber) PdfReader.getPdfObjectRelease(ws.getPdfObject(k))).intValue();
     PdfObject obj = PdfReader.getPdfObjectRelease(ws.getPdfObject(++k));
     if (obj.isArray()) {
       PdfArray a2 = (PdfArray) obj;
       for (int j = 0; j < a2.size(); ++j) {
         int c2 = ((PdfNumber) PdfReader.getPdfObjectRelease(a2.getPdfObject(j))).intValue();
         hh.put(c1++, c2);
       }
     } else {
       int c2 = ((PdfNumber) obj).intValue();
       int w = ((PdfNumber) PdfReader.getPdfObjectRelease(ws.getPdfObject(++k))).intValue();
       for (; c1 <= c2; ++c1) hh.put(c1, w);
     }
   }
   return hh;
 }
コード例 #21
0
  public void setBoolean(int id, boolean value) {

    switch (id) {

        //        case PdfDictionary.ImageMask:
        //        	ImageMask=value;
        //        	break;

      default:
        super.setBoolean(id, value);
    }
  }
コード例 #22
0
  @Override
  public void setFloatArray(final int id, final float[] value) {

    switch (id) {
      case PdfDictionary.Matrix:
        Matrix = value;
        break;

      default:
        super.setFloatArray(id, value);
    }
  }
コード例 #23
0
  public void setDoubleArray(int id, double[] value) {

    switch (id) {

        //            case PdfDictionary.FontMatrix:
        //                FontMatrix=value;
        //            break;

      default:
        super.setDoubleArray(id, value);
    }
  }
コード例 #24
0
  public void setMixedArray(int id, byte[][] value) {

    switch (id) {

        //            case PdfDictionary.Differences:
        //                Differences=value;
        //            break;

      default:
        super.setMixedArray(id, value);
    }
  }
コード例 #25
0
  @Override
  public void setMixedArray(final int id, final byte[][] value) {

    switch (id) {
      case PdfDictionary.BM:
        BM = value;
        break;

      default:
        super.setMixedArray(id, value);
    }
  }
コード例 #26
0
  public void setFloatArray(int id, float[] value) {

    switch (id) {

        //	        case PdfDictionary.Matrix:
        //	            Matrix=value;
        //	        break;

      default:
        super.setFloatArray(id, value);
    }
  }
コード例 #27
0
  public void setName(int id, byte[] value) {

    switch (id) {

        //            case PdfDictionary.CMapName:
        //                rawCMapName=value;
        //            break;

      default:
        super.setName(id, value);
    }
  }
コード例 #28
0
  public void setKeyArray(int id, byte[][] value) {

    switch (id) {

        //            case PdfDictionary.TR:
        //                TR=value;
        //            break;

      default:
        super.setKeyArray(id, value);
    }
  }
コード例 #29
0
  @Override
  public void setName(final int id, final byte[] value) {

    switch (id) {
      case PdfDictionary.Name:
        rawName = value;
        break;

      default:
        super.setName(id, value);
    }
  }
コード例 #30
0
  public void setTextStreamValue(int id, byte[] value) {

    switch (id) {

        //	        case PdfDictionary.ID:
        //	            rawID=value;
        //	        break;
        //

      default:
        super.setTextStreamValue(id, value);
    }
  }