pdfstamperimp.java

来自「有关对pdf操作的代码」· Java 代码 · 共 1,499 行 · 第 1/5 页

JAVA
1,499
字号
        }//        PdfReader.killIndirect(acro);//        reader.getCatalog().remove(PdfName.ACROFORM);    }        void sweepKids(PdfObject obj) {        PdfObject oo = PdfReader.killIndirect(obj);        if (oo == null || !oo.isDictionary())            return;        PdfDictionary dic = (PdfDictionary)oo;        PdfArray kids = (PdfArray)PdfReader.killIndirect(dic.get(PdfName.KIDS));        if (kids == null)            return;        ArrayList ar = kids.getArrayList();        for (int k = 0; k < ar.size(); ++k) {            sweepKids((PdfObject)ar.get(k));        }    }        private void flatFreeTextFields() 	{		if (append)			throw new IllegalArgumentException("FreeText flattening is not supported in append mode.");				for (int page = 1; page <= reader.getNumberOfPages(); ++page) 		{			PdfDictionary pageDic = reader.getPageN(page);			PdfArray annots = (PdfArray)PdfReader.getPdfObject(pageDic.get(PdfName.ANNOTS));			if (annots == null)				continue;			ArrayList ar = annots.getArrayList();			for (int idx = 0; idx < ar.size(); ++idx) 			{				PdfObject annoto = PdfReader.getPdfObject((PdfObject)ar.get(idx));				if ((annoto instanceof PdfIndirectReference) && !annoto.isIndirect())					continue;								PdfDictionary annDic = (PdfDictionary)annoto; 				if (!((PdfName)annDic.get(PdfName.SUBTYPE)).equals(PdfName.FREETEXT)) 					continue;				PdfNumber ff = (PdfNumber)PdfReader.getPdfObject(annDic.get(PdfName.F));                int flags = (ff != null) ? ff.intValue() : 0;							if ( (flags & PdfFormField.FLAGS_PRINT) != 0 && (flags & PdfFormField.FLAGS_HIDDEN) == 0) 				{					PdfObject obj1 = annDic.get(PdfName.AP);					if (obj1 == null) 						continue;					PdfDictionary appDic = (obj1 instanceof PdfIndirectReference) ?							(PdfDictionary) PdfReader.getPdfObject(obj1) : (PdfDictionary) obj1;								PdfObject obj = appDic.get(PdfName.N);					PdfAppearance app = null;					PdfObject objReal = PdfReader.getPdfObject(obj);										if (obj instanceof PdfIndirectReference && !obj.isIndirect())						app = new PdfAppearance((PdfIndirectReference)obj);					else if (objReal instanceof PdfStream) 					{						((PdfDictionary)objReal).put(PdfName.SUBTYPE, PdfName.FORM);						app = new PdfAppearance((PdfIndirectReference)obj);					}					else 					{						if (objReal.isDictionary()) 						{							PdfName as_p = (PdfName)PdfReader.getPdfObject(appDic.get(PdfName.AS));							if (as_p != null) 							{								PdfIndirectReference iref = (PdfIndirectReference)((PdfDictionary)objReal).get(as_p);								if (iref != null) 								{									app = new PdfAppearance(iref);									if (iref.isIndirect()) 									{										objReal = PdfReader.getPdfObject(iref);										((PdfDictionary)objReal).put(PdfName.SUBTYPE, PdfName.FORM);									}								}							}						}					}					if (app != null) 					{						Rectangle box = PdfReader.getNormalizedRectangle((PdfArray)PdfReader.getPdfObject(annDic.get(PdfName.RECT)));						PdfContentByte cb = getOverContent(page);						cb.setLiteral("Q ");						cb.addTemplate(app, box.getLeft(), box.getBottom());						cb.setLiteral("q ");					}				}			}			for (int idx = 0; idx < ar.size(); ++idx) 			{				PdfObject annoto = PdfReader.getPdfObject((PdfObject)ar.get(idx));				if (annoto != null && annoto.isDictionary())				{					PdfDictionary annot = (PdfDictionary)annoto;					if (PdfName.FREETEXT.equals(annot.get(PdfName.SUBTYPE)))					{						ar.remove(idx);						--idx;					}				}			}			if (ar.isEmpty()) 			{				PdfReader.killIndirect(pageDic.get(PdfName.ANNOTS));				pageDic.remove(PdfName.ANNOTS);			}		}	}        /**     * @see com.lowagie.text.pdf.PdfWriter#getPageReference(int)     */    public PdfIndirectReference getPageReference(int page) {        PdfIndirectReference ref = reader.getPageOrigRef(page);        if (ref == null)            throw new IllegalArgumentException("Invalid page number " + page);        return ref;    }        /**     * @see com.lowagie.text.pdf.PdfWriter#addAnnotation(com.lowagie.text.pdf.PdfAnnotation)     */    public void addAnnotation(PdfAnnotation annot) {        throw new RuntimeException("Unsupported in this context. Use PdfStamper.addAnnotation()");    }        void addDocumentField(PdfIndirectReference ref) {        PdfDictionary catalog = reader.getCatalog();        PdfDictionary acroForm = (PdfDictionary)PdfReader.getPdfObject(catalog.get(PdfName.ACROFORM), catalog);        if (acroForm == null) {            acroForm = new PdfDictionary();            catalog.put(PdfName.ACROFORM, acroForm);            markUsed(catalog);        }        PdfArray fields = (PdfArray)PdfReader.getPdfObject(acroForm.get(PdfName.FIELDS), acroForm);        if (fields == null) {            fields = new PdfArray();            acroForm.put(PdfName.FIELDS, fields);            markUsed(acroForm);        }        if (!acroForm.contains(PdfName.DA)) {            acroForm.put(PdfName.DA, new PdfString("/Helv 0 Tf 0 g "));            markUsed(acroForm);        }        fields.add(ref);        markUsed(fields);    }        void addFieldResources() throws IOException {        if (fieldTemplates.isEmpty())            return;        PdfDictionary catalog = reader.getCatalog();        PdfDictionary acroForm = (PdfDictionary)PdfReader.getPdfObject(catalog.get(PdfName.ACROFORM), catalog);        if (acroForm == null) {            acroForm = new PdfDictionary();            catalog.put(PdfName.ACROFORM, acroForm);            markUsed(catalog);        }        PdfDictionary dr = (PdfDictionary)PdfReader.getPdfObject(acroForm.get(PdfName.DR), acroForm);        if (dr == null) {            dr = new PdfDictionary();            acroForm.put(PdfName.DR, dr);            markUsed(acroForm);        }        markUsed(dr);        for (Iterator it = fieldTemplates.keySet().iterator(); it.hasNext();) {            PdfTemplate template = (PdfTemplate)it.next();            PdfFormField.mergeResources(dr, (PdfDictionary)template.getResources(), this);        }        if (dr.get(PdfName.ENCODING) == null)            dr.put(PdfName.ENCODING, PdfName.WIN_ANSI_ENCODING);        PdfDictionary fonts = (PdfDictionary)PdfReader.getPdfObject(dr.get(PdfName.FONT));        if (fonts == null) {            fonts = new PdfDictionary();            dr.put(PdfName.FONT, fonts);        }        if (!fonts.contains(PdfName.HELV)) {            PdfDictionary dic = new PdfDictionary(PdfName.FONT);            dic.put(PdfName.BASEFONT, PdfName.HELVETICA);            dic.put(PdfName.ENCODING, PdfName.WIN_ANSI_ENCODING);            dic.put(PdfName.NAME, PdfName.HELV);            dic.put(PdfName.SUBTYPE, PdfName.TYPE1);            fonts.put(PdfName.HELV, addToBody(dic).getIndirectReference());        }        if (!fonts.contains(PdfName.ZADB)) {            PdfDictionary dic = new PdfDictionary(PdfName.FONT);            dic.put(PdfName.BASEFONT, PdfName.ZAPFDINGBATS);            dic.put(PdfName.NAME, PdfName.ZADB);            dic.put(PdfName.SUBTYPE, PdfName.TYPE1);            fonts.put(PdfName.ZADB, addToBody(dic).getIndirectReference());        }        if (acroForm.get(PdfName.DA) == null) {            acroForm.put(PdfName.DA, new PdfString("/Helv 0 Tf 0 g "));            markUsed(acroForm);        }    }        void expandFields(PdfFormField field, ArrayList allAnnots) {        allAnnots.add(field);        ArrayList kids = field.getKids();        if (kids != null) {            for (int k = 0; k < kids.size(); ++k)                expandFields((PdfFormField)kids.get(k), allAnnots);        }    }    void addAnnotation(PdfAnnotation annot, PdfDictionary pageN) {        try {            ArrayList allAnnots = new ArrayList();            if (annot.isForm()) {                fieldsAdded = true;                getAcroFields();                PdfFormField field = (PdfFormField)annot;                if (field.getParent() != null)                    return;                expandFields(field, allAnnots);            }            else                allAnnots.add(annot);            for (int k = 0; k < allAnnots.size(); ++k) {                annot = (PdfAnnotation)allAnnots.get(k);                if (annot.getPlaceInPage() > 0)                    pageN = reader.getPageN(annot.getPlaceInPage());                if (annot.isForm()) {                    if (!annot.isUsed()) {                        HashMap templates = annot.getTemplates();                        if (templates != null)                            fieldTemplates.putAll(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);                        markUsed(pageN);                    }                    else                        annots = (PdfArray)pdfobj;                    annots.add(annot.getIndirectReference());                    markUsed(annots);                    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();                    addToBody(annot, annot.getIndirectReference());                }            }        }        catch (IOException e) {            throw new ExceptionConverter(e);        }    }        void addAnnotation(PdfAnnotation annot, int page) {        addAnnotation(annot, reader.getPageN(page));    }    private void outlineTravel(PRIndirectReference outline) {        while (outline != null) {            PdfDictionary outlineR = (PdfDictionary)PdfReader.getPdfObjectRelease(outline);            PRIndirectReference first = (PRIndirectReference)outlineR.get(PdfName.FIRST);            if (first != null) {                outlineTravel(first);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?