pdfstamperimp.java

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

JAVA
1,499
字号
            root,            info,            encryption,            fileID, prevxref);            trailer.toPdf(this, os);        }        os.flush();        if (isCloseStream())            os.close();        reader.close();    }        void applyRotation(PdfDictionary pageN, ByteBuffer out) {        if (!rotateContents)            return;        Rectangle page = reader.getPageSizeWithRotation(pageN);        int rotation = page.getRotation();        switch (rotation) {            case 90:                out.append(PdfContents.ROTATE90);                out.append(page.getTop());                out.append(' ').append('0').append(PdfContents.ROTATEFINAL);                break;            case 180:                out.append(PdfContents.ROTATE180);                out.append(page.getRight());                out.append(' ');                out.append(page.getTop());                out.append(PdfContents.ROTATEFINAL);                break;            case 270:                out.append(PdfContents.ROTATE270);                out.append('0').append(' ');                out.append(page.getRight());                out.append(PdfContents.ROTATEFINAL);                break;        }    }        void alterContents() throws IOException {        for (Iterator i = pagesToContent.values().iterator(); i.hasNext();) {            PageStamp ps = (PageStamp)i.next();            PdfDictionary pageN = ps.pageN;            markUsed(pageN);            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;                markUsed(ar);            }            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 (ps.under != null) {                out.append(PdfContents.SAVESTATE);                applyRotation(pageN, out);                out.append(ps.under.getInternalBuffer());                out.append(PdfContents.RESTORESTATE);            }            if (ps.over != null)                out.append(PdfContents.SAVESTATE);            PdfStream stream = new PdfStream(out.toByteArray());            stream.flateCompress();            ar.addFirst(addToBody(stream).getIndirectReference());            out.reset();            if (ps.over != null) {                out.append(' ');                out.append(PdfContents.RESTORESTATE);                ByteBuffer buf = ps.over.getInternalBuffer();                out.append(buf.getBuffer(), 0, ps.replacePoint);                out.append(PdfContents.SAVESTATE);                applyRotation(pageN, out);                out.append(buf.getBuffer(), ps.replacePoint, buf.size() - ps.replacePoint);                out.append(PdfContents.RESTORESTATE);                stream = new PdfStream(out.toByteArray());                stream.flateCompress();                ar.add(addToBody(stream).getIndirectReference());            }            alterResources(ps);        }    }    void alterResources(PageStamp ps) {        ps.pageN.put(PdfName.RESOURCES, ps.pageResources.getResources());    }        protected int getNewObjectNumber(PdfReader reader, int number, int generation) {        IntHashtable ref = (IntHashtable)readers2intrefs.get(reader);        if (ref != null) {            int n = ref.get(number);            if (n == 0) {                n = getIndirectReferenceNumber();                ref.put(number, n);            }            return n;        }        if (currentPdfReaderInstance == null) {            if (append && number < initialXrefSize)                return number;            int n = myXref.get(number);            if (n == 0) {                n = getIndirectReferenceNumber();                myXref.put(number, n);            }            return n;        }        else            return currentPdfReaderInstance.getNewObjectNumber(number, generation);    }        RandomAccessFileOrArray getReaderFile(PdfReader reader) {        if (readers2intrefs.containsKey(reader)) {            RandomAccessFileOrArray raf = (RandomAccessFileOrArray)readers2file.get(reader);            if (raf != null)                return raf;            return reader.getSafeFile();        }        if (currentPdfReaderInstance == null)            return file;        else            return currentPdfReaderInstance.getReaderFile();    }        /**     * @param reader     * @param openFile     * @throws IOException     */    public void registerReader(PdfReader reader, boolean openFile) throws IOException {        if (readers2intrefs.containsKey(reader))            return;        readers2intrefs.put(reader, new IntHashtable());        if (openFile) {            RandomAccessFileOrArray raf = reader.getSafeFile();            readers2file.put(reader, raf);            raf.reOpen();        }    }        /**     * @param reader     */    public void unRegisterReader(PdfReader reader) {        if (!readers2intrefs.containsKey(reader))            return;        readers2intrefs.remove(reader);        RandomAccessFileOrArray raf = (RandomAccessFileOrArray)readers2file.get(reader);        if (raf == null)            return;        readers2file.remove(reader);        try{raf.close();}catch(Exception e){}    }    static void findAllObjects(PdfReader reader, PdfObject obj, IntHashtable hits) {        if (obj == null)            return;        switch (obj.type()) {            case PdfObject.INDIRECT:                PRIndirectReference iref = (PRIndirectReference)obj;                if (reader != iref.getReader())                    return;                if (hits.containsKey(iref.getNumber()))                    return;                hits.put(iref.getNumber(), 1);                findAllObjects(reader, PdfReader.getPdfObject(obj), hits);                return;            case PdfObject.ARRAY:                ArrayList lst = ((PdfArray)obj).getArrayList();                for (int k = 0; k < lst.size(); ++k) {                    findAllObjects(reader, (PdfObject)lst.get(k), hits);                }                return;            case PdfObject.DICTIONARY:            case PdfObject.STREAM:                PdfDictionary dic = (PdfDictionary)obj;                for (Iterator it = dic.getKeys().iterator(); it.hasNext();) {                    PdfName name = (PdfName)it.next();                    findAllObjects(reader, dic.get(name), hits);                }                return;        }    }        /**     * @param fdf     * @throws IOException     */    public void addComments(FdfReader fdf) throws IOException{        if (readers2intrefs.containsKey(fdf))            return;        PdfDictionary catalog = fdf.getCatalog();        catalog = (PdfDictionary)PdfReader.getPdfObject(catalog.get(PdfName.FDF));        if (catalog == null)            return;        PdfArray annots = (PdfArray)PdfReader.getPdfObject(catalog.get(PdfName.ANNOTS));        if (annots == null || annots.size() == 0)            return;        registerReader(fdf, false);        IntHashtable hits = new IntHashtable();        HashMap irt = new HashMap();        ArrayList an = new ArrayList();        ArrayList ar = annots.getArrayList();        for (int k = 0; k < ar.size(); ++k) {            PdfObject obj = (PdfObject)ar.get(k);            PdfDictionary annot = (PdfDictionary)PdfReader.getPdfObject(obj);            PdfNumber page = (PdfNumber)PdfReader.getPdfObject(annot.get(PdfName.PAGE));            if (page == null || page.intValue() >= reader.getNumberOfPages())                continue;            findAllObjects(fdf, obj, hits);            an.add(obj);            if (obj.type() == PdfObject.INDIRECT) {                PdfObject nm = PdfReader.getPdfObject(annot.get(PdfName.NM));                if (nm != null && nm.type() == PdfObject.STRING)                    irt.put(nm.toString(), obj);            }        }        int arhits[] = hits.getKeys();        for (int k = 0; k < arhits.length; ++k) {            int n = arhits[k];            PdfObject obj = fdf.getPdfObject(n);            if (obj.type() == PdfObject.DICTIONARY) {                PdfObject str = PdfReader.getPdfObject(((PdfDictionary)obj).get(PdfName.IRT));                if (str != null && str.type() == PdfObject.STRING) {                   PdfObject i = (PdfObject)irt.get(str.toString());                   if (i != null) {                       PdfDictionary dic2 = new PdfDictionary();                       dic2.merge((PdfDictionary)obj);                       dic2.put(PdfName.IRT, i);                       obj = dic2;                   }                }            }            addToBody(obj, getNewObjectNumber(fdf, n, 0));        }        for (int k = 0; k < an.size(); ++k) {            PdfObject obj = (PdfObject)an.get(k);            PdfDictionary annot = (PdfDictionary)PdfReader.getPdfObject(obj);            PdfNumber page = (PdfNumber)PdfReader.getPdfObject(annot.get(PdfName.PAGE));            PdfDictionary dic = reader.getPageN(page.intValue() + 1);            PdfArray annotsp = (PdfArray)PdfReader.getPdfObject(dic.get(PdfName.ANNOTS), dic);            if (annotsp == null) {                annotsp = new PdfArray();                dic.put(PdfName.ANNOTS, annotsp);                markUsed(dic);            }            markUsed(annotsp);            annotsp.add(obj);        }    }        PageStamp getPageStamp(int pageNum) {        PdfDictionary pageN = reader.getPageN(pageNum);        PageStamp ps = (PageStamp)pagesToContent.get(pageN);        if (ps == null) {            ps = new PageStamp(this, reader, pageN);            pagesToContent.put(pageN, ps);        }        return ps;    }        PdfContentByte getUnderContent(int pageNum) {        if (pageNum < 1 || pageNum > reader.getNumberOfPages())            return null;        PageStamp ps = getPageStamp(pageNum);        if (ps.under == null)            ps.under = new StampContent(this, ps);        return ps.under;    }        PdfContentByte getOverContent(int pageNum) {        if (pageNum < 1 || pageNum > reader.getNumberOfPages())            return null;        PageStamp ps = getPageStamp(pageNum);        if (ps.over == null)            ps.over = new StampContent(this, ps);        return ps.over;    }        void correctAcroFieldPages(int page) {        if (acroFields == null)            return;        if (page > reader.getNumberOfPages())            return;        HashMap fields = acroFields.getFields();        for (Iterator it = fields.values().iterator(); it.hasNext();) {            AcroFields.Item item = (AcroFields.Item)it.next();            ArrayList pages = item.page;            for (int k = 0; k < pages.size(); ++k) {                int p = ((Integer)pages.get(k)).intValue();

⌨️ 快捷键说明

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