pdfstamperimp.java

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

JAVA
1,499
字号
                if (p >= page)                    pages.set(k, new Integer(p + 1));            }        }    }        private static void moveRectangle(PdfDictionary dic2, PdfReader r, int pageImported, PdfName key, String name) {        Rectangle m = r.getBoxSize(pageImported, name);        if (m == null)            dic2.remove(key);        else            dic2.put(key, new PdfRectangle(m));    }        void replacePage(PdfReader r, int pageImported, int pageReplaced) {        PdfDictionary pageN = reader.getPageN(pageReplaced);        if (pagesToContent.containsKey(pageN))            throw new IllegalStateException("This page cannot be replaced: new content was already added");        PdfImportedPage p = getImportedPage(r, pageImported);        PdfDictionary dic2 = reader.getPageNRelease(pageReplaced);        dic2.remove(PdfName.RESOURCES);        dic2.remove(PdfName.CONTENTS);        moveRectangle(dic2, r, pageImported, PdfName.MEDIABOX, "media");        moveRectangle(dic2, r, pageImported, PdfName.CROPBOX, "crop");        moveRectangle(dic2, r, pageImported, PdfName.TRIMBOX, "trim");        moveRectangle(dic2, r, pageImported, PdfName.ARTBOX, "art");        moveRectangle(dic2, r, pageImported, PdfName.BLEEDBOX, "bleed");        dic2.put(PdfName.ROTATE, new PdfNumber(r.getPageRotation(pageImported)));        PdfContentByte cb = getOverContent(pageReplaced);        cb.addTemplate(p, 0, 0);        PageStamp ps = (PageStamp)pagesToContent.get(pageN);        ps.replacePoint = ps.over.getInternalBuffer().size();    }        void insertPage(int pageNumber, Rectangle mediabox) {        Rectangle media = new Rectangle(mediabox);        int rotation = media.getRotation() % 360;        PdfDictionary page = new PdfDictionary(PdfName.PAGE);        PdfDictionary resources = new PdfDictionary();        PdfArray procset = new PdfArray();        procset.add(PdfName.PDF);        procset.add(PdfName.TEXT);        procset.add(PdfName.IMAGEB);        procset.add(PdfName.IMAGEC);        procset.add(PdfName.IMAGEI);        resources.put(PdfName.PROCSET, procset);        page.put(PdfName.RESOURCES, resources);        page.put(PdfName.ROTATE, new PdfNumber(rotation));        page.put(PdfName.MEDIABOX, new PdfRectangle(media, rotation));        PRIndirectReference pref = reader.addPdfObject(page);        PdfDictionary parent;        PRIndirectReference parentRef;        if (pageNumber > reader.getNumberOfPages()) {            PdfDictionary lastPage = reader.getPageNRelease(reader.getNumberOfPages());            parentRef = (PRIndirectReference)lastPage.get(PdfName.PARENT);            parentRef = new PRIndirectReference(reader, parentRef.getNumber());            parent = (PdfDictionary)PdfReader.getPdfObject(parentRef);            PdfArray kids = (PdfArray)PdfReader.getPdfObject(parent.get(PdfName.KIDS), parent);            kids.add(pref);            markUsed(kids);            reader.pageRefs.insertPage(pageNumber, pref);        }        else {            if (pageNumber < 1)                pageNumber = 1;            PdfDictionary firstPage = reader.getPageN(pageNumber);            PRIndirectReference firstPageRef = reader.getPageOrigRef(pageNumber);            reader.releasePage(pageNumber);            parentRef = (PRIndirectReference)firstPage.get(PdfName.PARENT);            parentRef = new PRIndirectReference(reader, parentRef.getNumber());            parent = (PdfDictionary)PdfReader.getPdfObject(parentRef);            PdfArray kids = (PdfArray)PdfReader.getPdfObject(parent.get(PdfName.KIDS), parent);            ArrayList ar = kids.getArrayList();            int len = ar.size();            int num = firstPageRef.getNumber();            for (int k = 0; k < len; ++k) {                PRIndirectReference cur = (PRIndirectReference)ar.get(k);                if (num == cur.getNumber()) {                    ar.add(k, pref);                    break;                }            }            if (len == ar.size())                throw new RuntimeException("Internal inconsistence.");            markUsed(kids);            reader.pageRefs.insertPage(pageNumber, pref);            correctAcroFieldPages(pageNumber);        }        page.put(PdfName.PARENT, parentRef);        while (parent != null) {            markUsed(parent);            PdfNumber count = (PdfNumber)PdfReader.getPdfObjectRelease(parent.get(PdfName.COUNT));            parent.put(PdfName.COUNT, new PdfNumber(count.intValue() + 1));            parent = (PdfDictionary)PdfReader.getPdfObject(parent.get(PdfName.PARENT));        }    }        /** Getter for property rotateContents.     * @return Value of property rotateContents.     *     */    boolean isRotateContents() {        return this.rotateContents;    }        /** Setter for property rotateContents.     * @param rotateContents New value of property rotateContents.     *     */    void setRotateContents(boolean rotateContents) {        this.rotateContents = rotateContents;    }        boolean isContentWritten() {        return body.size() > 1;    }        AcroFields getAcroFields() {        if (acroFields == null) {            acroFields = new AcroFields(reader, this);        }        return acroFields;    }    void setFormFlattening(boolean flat) {        this.flat = flat;    }    	void setFreeTextFlattening(boolean flat) {		this.flatFreeText = flat;    }        boolean partialFormFlattening(String name) {        getAcroFields();        if (acroFields.getXfa().isXfaPresent())            throw new UnsupportedOperationException("Partial form flattening is not supported with XFA forms.");        if (!acroFields.getFields().containsKey(name))            return false;        partialFlattening.add(name);        return true;    }        void flatFields() {        if (append)            throw new IllegalArgumentException("Field flattening is not supported in append mode.");        getAcroFields();        HashMap fields = acroFields.getFields();        if (fieldsAdded && partialFlattening.isEmpty()) {            for (Iterator i = fields.keySet().iterator(); i.hasNext();) {                partialFlattening.add(i.next());            }        }        PdfDictionary acroForm = (PdfDictionary)PdfReader.getPdfObject(reader.getCatalog().get(PdfName.ACROFORM));        ArrayList acroFds = null;        if (acroForm != null) {            PdfArray array = (PdfArray)PdfReader.getPdfObject(acroForm.get(PdfName.FIELDS), acroForm);            if (array != null)                acroFds = array.getArrayList();        }        for (Iterator i = fields.entrySet().iterator(); i.hasNext();) {            Map.Entry entry = (Map.Entry) i.next();            String name = (String) entry.getKey();            if (!partialFlattening.isEmpty() && !partialFlattening.contains(name))                continue;            AcroFields.Item item = (AcroFields.Item) entry.getValue();            for (int k = 0; k < item.merged.size(); ++k) {                PdfDictionary merged = (PdfDictionary)item.merged.get(k);                PdfNumber ff = (PdfNumber)PdfReader.getPdfObject(merged.get(PdfName.F));                int flags = 0;                if (ff != null)                    flags = ff.intValue();                int page = ((Integer)item.page.get(k)).intValue();                PdfDictionary appDic = (PdfDictionary)PdfReader.getPdfObject(merged.get(PdfName.AP));                if (appDic != null && (flags & PdfFormField.FLAGS_PRINT) != 0 && (flags & PdfFormField.FLAGS_HIDDEN) == 0) {                    PdfObject obj = appDic.get(PdfName.N);                    PdfAppearance app = null;                    if (obj != 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 != null && objReal.isDictionary()) {                                PdfName as = (PdfName)PdfReader.getPdfObject(merged.get(PdfName.AS));                                if (as != null) {                                    PdfIndirectReference iref = (PdfIndirectReference)((PdfDictionary)objReal).get(as);                                    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(merged.get(PdfName.RECT)));                        PdfContentByte cb = getOverContent(page);                        cb.setLiteral("Q ");                        cb.addTemplate(app, box.getLeft(), box.getBottom());                        cb.setLiteral("q ");                    }                }                if (partialFlattening.isEmpty())                    continue;                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 ran = (PdfObject)ar.get(idx);                    if (!ran.isIndirect())                        continue;                    PdfObject ran2 = (PdfObject)item.widget_refs.get(k);                    if (!ran2.isIndirect())                        continue;                    if (((PRIndirectReference)ran).getNumber() == ((PRIndirectReference)ran2).getNumber()) {                        ar.remove(idx--);                        PRIndirectReference wdref = (PRIndirectReference)ran2;                        while (true) {                            PdfDictionary wd = (PdfDictionary)PdfReader.getPdfObject(wdref);                            PRIndirectReference parentRef = (PRIndirectReference)wd.get(PdfName.PARENT);                            PdfReader.killIndirect(wdref);                            if (parentRef == null) { // reached AcroForm                                for (int fr = 0; fr < acroFds.size(); ++fr) {                                    PdfObject h = (PdfObject)acroFds.get(fr);                                    if (h.isIndirect() && ((PRIndirectReference)h).getNumber() == wdref.getNumber()) {                                        acroFds.remove(fr);                                        --fr;                                    }                                }                                break;                            }                            PdfDictionary parent = (PdfDictionary)PdfReader.getPdfObject(parentRef);                            PdfArray kids = (PdfArray)PdfReader.getPdfObject(parent.get(PdfName.KIDS));                            ArrayList kar = kids.getArrayList();                            for (int fr = 0; fr < kar.size(); ++fr) {                                PdfObject h = (PdfObject)kar.get(fr);                                if (h.isIndirect() && ((PRIndirectReference)h).getNumber() == wdref.getNumber()) {                                    kar.remove(fr);                                    --fr;                                }                            }                            if (!kar.isEmpty())                                break;                            wdref = parentRef;                        }                    }                }                if (ar.isEmpty()) {                    PdfReader.killIndirect(pageDic.get(PdfName.ANNOTS));                    pageDic.remove(PdfName.ANNOTS);                }            }        }        if (!fieldsAdded && partialFlattening.isEmpty()) {            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;                    if (!annoto.isDictionary() || PdfName.WIDGET.equals(((PdfDictionary)annoto).get(PdfName.SUBTYPE))) {                        ar.remove(idx);                        --idx;                    }                }                if (ar.isEmpty()) {                    PdfReader.killIndirect(pageDic.get(PdfName.ANNOTS));                    pageDic.remove(PdfName.ANNOTS);                }            }            eliminateAcroformObjects();        }    }    void eliminateAcroformObjects() {        PdfObject acro = reader.getCatalog().get(PdfName.ACROFORM);        if (acro == null)            return;        PdfDictionary acrodic = (PdfDictionary)PdfReader.getPdfObject(acro);        reader.killXref(acrodic.get(PdfName.XFA));        acrodic.remove(PdfName.XFA);        PdfObject iFields = acrodic.get(PdfName.FIELDS);        if (iFields != null) {            PdfDictionary kids = new PdfDictionary();            kids.put(PdfName.KIDS, iFields);            sweepKids(kids);            PdfReader.killIndirect(iFields);            acrodic.put(PdfName.FIELDS, new PdfArray());

⌨️ 快捷键说明

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