IText解保受保護的PDF

科普:PDF加密有兩種方式婿崭,分別為owner password和user password。它們有什么區(qū)別呢肴颊?簡單來說逛球,設置了user password,在打開PDF的時候就需要輸入密碼苫昌;設置了owner password,可以打開PDF幸海,但是不能修改祟身、拷貝里面的內(nèi)容。

本文講述的是破解owner password物独。

· 重寫PdfReader

import com.itextpdf.text.pdf.PdfReader;

import java.io.IOException;
import java.io.InputStream;

public class MyPdfReader extends PdfReader {
    public MyPdfReader(final String filename) throws IOException {
        super(filename);
    }
    
    public MyPdfReader(final byte[] bytes) throws IOException {
        super(bytes);
    }
    
    public MyPdfReader(final InputStream is) throws IOException {
        super(is);
    }

    public void decryptOnPurpose() {
        encrypted = false;
    }
}

· 實現(xiàn)解保護

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.exceptions.BadPasswordException;
import com.itextpdf.text.exceptions.InvalidPdfException;
import com.itextpdf.text.pdf.PdfStamper;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class UnProtectedPDFUtil {

    private static MyPdfReader pdfReader = null;

    public static byte[] unProtected(byte[] fileBytes) throws Exception {
        ByteArrayOutputStream bos = null;
        ByteArrayInputStream bis = null;

        try {
            bos = new ByteArrayOutputStream();
            bis = new ByteArrayInputStream(fileBytes);

            initPdfReader(bis);

            if (checkProtected()) {
                unProtectedPdf(bos);
                byte[] newBytes = bos.toByteArray();
                bos.flush();
                return newBytes;
            } else {
                return fileBytes;
            }
        } catch (Exception e) {
            throw e;
        } finally {
            if (null != bos) {
                bos.close();
            }
            if (null != bis) {
                bis.close();
            }
        }
    }

    /**
     * Will check user password or owner password. If user password, will throws
     * BadPasswordException.
     * 
     * @param is
     * @throws BadPasswordException
     */
    private static void initPdfReader(final InputStream is) throws BadPasswordException {
        try {
            pdfReader = new MyPdfReader(is);
        } catch (BadPasswordException e) {
            // if catch BadPasswordException. it should be user password.
            throw new BadPasswordException("Bad password. It should be user password.");
        } catch (IOException e) {
            return;
        }
    }

    private static boolean checkProtected() throws InvalidPdfException {
        if (null == pdfReader) {
            throw new InvalidPdfException("Invalid pdf.");
        }

        // check is owner password (protected).
        if (pdfReader.isEncrypted()) {
            return true;
        } else {
            return false;
        }
    }

    private static void unProtectedPdf(OutputStream os) {
        PdfStamper stamper = null;
        try {
            MyPdfReader.unethicalreading = true;
            pdfReader.decryptOnPurpose();

            stamper = new PdfStamper(pdfReader, os);
        } catch (DocumentException e) {
            return;
        } catch (IOException e) {
            return;
        } finally {
            try {
                if (null != stamper) {
                    stamper.close();
                }
            } catch (Exception e) {
                return;
            }
        }
    }
}

· 使用樣例

byte[] unProtectedBytes = UnProtectedPdfUtil.unProtected(byte[] fileBytes);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末袜硫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挡篓,更是在濱河造成了極大的恐慌婉陷,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件官研,死亡現(xiàn)場離奇詭異秽澳,居然都是意外死亡,警方通過查閱死者的電腦和手機戏羽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門担神,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人始花,你說我怎么就攤上這事妄讯『⑽” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵亥贸,是天一觀的道長躬窜。 經(jīng)常有香客問我,道長炕置,這世上最難降的妖魔是什么荣挨? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮讹俊,結(jié)果婚禮上垦沉,老公的妹妹穿的比我還像新娘。我一直安慰自己仍劈,他們只是感情好厕倍,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贩疙,像睡著了一般讹弯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上这溅,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天组民,我揣著相機與錄音,去河邊找鬼悲靴。 笑死臭胜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的癞尚。 我是一名探鬼主播耸三,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼浇揩!你這毒婦竟也來了仪壮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤胳徽,失蹤者是張志新(化名)和其女友劉穎积锅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體养盗,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡缚陷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了往核。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹬跃。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝶缀,到底是詐尸還是另有隱情丹喻,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布翁都,位于F島的核電站碍论,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏柄慰。R本人自食惡果不足惜鳍悠,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坐搔。 院中可真熱鬧藏研,春花似錦、人聲如沸概行。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凳忙。三九已至业踏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涧卵,已是汗流浹背勤家。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留柳恐,地道東北人伐脖。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像乐设,于是被迫代替她去往敵國和親讼庇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 29,373評論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,097評論 1 32
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理伤提,服務發(fā)現(xiàn),斷路器认烁,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 1,當執(zhí)行scanf函數(shù)的時候,并不是直接讓我們從鍵盤中輸入的,而是先檢查緩沖區(qū)中是否有數(shù)據(jù),如果有數(shù)據(jù)才會從緩沖...
    ITman007閱讀 530評論 0 0
  • 【長篇原創(chuàng)】圖文:風聽雨夜寐荷 但行好事肿男,莫問輪回! 笑兒走出會場却嗡,打量著整潔有序的校園舶沛。 一排修剪的恰到好處的冬...
    風聽雨夜寐荷閱讀 318評論 3 3