Word 轉(zhuǎn) pdf 之 Aspose 工具的“科學(xué)使用”

原文地址:http://www.jetchen.cn/crack-aspose/

將 Word 轉(zhuǎn) pdf 的時候灭袁,有很多工具可以使用砸捏,其中有一款很不錯的工具“Aspose”蠢古,可惜是收費軟件派敷,但是不打緊,我們就使用一點點小手段crack之,安排。


一、背景

Word 轉(zhuǎn) pdf 有很多的解決方案狂秦,比如先轉(zhuǎn) html 在轉(zhuǎn) pdf,但是或多或少都有各種奇(yang)怪(shi)的問題推捐,有一款軟件“Aspose”(其實就是一個 jar 包)裂问,體驗下來很不錯,提供了 word 的各種操作 api,但是很可惜是收費的堪簿。

身為“貧窮”程序猿的一員痊乾,能免費肯定要免費啊,于是就想手動處(po)理(jie)一下這個 jar 包椭更。

二哪审、Crack

我們先從官網(wǎng)下載 jar 包,地址:https://downloads.aspose.com/words/java虑瀑,或者也可在文末下載湿滓。

本文下載的是19.1 版本(版本不一致的話,class 中的方法名也可能會有所小差異)舌狗。

原理:原理其實很簡單叽奥,找到 jar 包內(nèi) license 校驗的地方,將其相關(guān)的代碼修改掉就 ok痛侍。

1朝氓、初窺 jar 包內(nèi)詳情

在此查看 jar 包內(nèi)詳情使用的工具是:JByteMod,文末有下載鏈接主届。

追蹤源碼赵哲,我們發(fā)現(xiàn)了罪魁禍?zhǔn)祝鋵嵕褪?License.class 這個文件岂膳,然后發(fā)現(xiàn)license 的方法內(nèi)斗指向了一個類zzZLJ誓竿,所以接著追蹤這個類磅网,然后研究后發(fā)現(xiàn)谈截,只需要將 zzZI0zzZI1 方法的返回值調(diào)整為 true 即可,并將 zzZ 方法內(nèi)的校驗步驟刪掉涧偷。見下圖:

2簸喂、重寫驗證的方法

很簡單,分兩步燎潮。

第一步是清除掉 zzZ 方法內(nèi)的內(nèi)容喻鳄,在此使用的是上文提到的 JByteMod 工具,見下圖:

image

第二步是改寫 zzZI0 和 zzZI1 方法的返回值确封,在此使用的是 javassist 工具除呵,需要手動寫個測試類去修改內(nèi)部的方法并生成一個新的 class 文件,見下述代碼:

<dependency>
    <groupId>org.javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.24.1-GA</version>
</dependency>
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;

public  class  AsposeWordsCrack191  {

    public  static  void  main(String[]  args)  {
        try  {
            AsposeWordsCrack191.changeMethod();
        }  catch  (Exception  e)  {
            e.printStackTrace();
        }
    }

    public  static  void  changeMethod()  throws  Exception  {
        ClassPool.getDefault().insertClassPath("d:\\aspose-words-19.1-jdk16.jar");
        CtClass c2  =  ClassPool.getDefault().getCtClass("com.aspose.words.zzZLJ");

        CtMethod[]  ms  =  c2.getDeclaredMethods();

        for  (CtMethod  c  :  ms)  {
            CtClass[]  ps  =  c.getParameterTypes();
            if  (c.getName().equals("zzZ")  &&  ps.length  ==  3
                    &&  ps[0].getName().equals("org.w3c.dom.Node")
                    &&  ps[1].getName().equals("org.w3c.dom.Node")
                    &&  ps[2].getName().equals("java.lang.String"))  {
                System.out.println("I got you爪喘!zzZ");
                c.insertBefore("{return;}");
            }

            if  (c.getName().equals("zzZI1"))  {
                System.out.println("I got you颜曾!zzZI1");
                c.insertBefore("{return 1;}");
            }

            if  (c.getName().equals("zzZI0"))  {
                System.out.println("I got you!zzZI0");
                c.insertBefore("{return 1;}");
            }

        }

        //輸出到當(dāng)前目錄下
        c2.writeFile();
    }
}

3秉剑、替換字節(jié)碼文件

使用上述代碼可以生成一個 zzZLJ.class 文件泛豪,我們只需要將這個文件替換掉 jar 包內(nèi)的原始文件即可,在此可以隨便找一款壓縮工具即可。

但是需要注意诡曙,為了防止文件指紋校驗臀叙,我們需要刪除掉 jar 包中的 META_INF 文件夾。

最后价卤,需要生成一個許可文件 com.aspose.words.lic_2999.xml劝萤,將其放在 jar 包內(nèi)即可(不放也可以,但是在checkLicense()方法內(nèi)讀取的時候荠雕,需要自己處理下路徑)稳其,如圖:

<License>
  <Data>
    <Products>
      <Product>Aspose.Words for  Java</Product>
    </Products>
    <EditionType>Enterprise</EditionType>
    <SubscriptionExpiry>29991231</SubscriptionExpiry>
    <LicenseExpiry>29991231</LicenseExpiry>
    <SerialNumber>www.jetchen.cn</SerialNumber>
  </Data>
  <Signature>www.jetchen.cn</Signature>
</License>

三、使用

至于使用也相當(dāng)簡單炸卑,但是有一個坑需要注意既鞠,經(jīng)測試發(fā)現(xiàn),在 Windows 平臺一切正常盖文,但是在 centos 環(huán)境下嘱蛋,轉(zhuǎn)換出來的 pdf 文件中,中文都被替換成了小方框五续,很顯然洒敏,是缺少字體的原因。

解決辦法有兩種疙驾,一是在服務(wù)器上安裝相應(yīng)的字體庫凶伙,二是將 Windows 的字體庫 copy 一份到服務(wù)器上,然后在項目里引用即可它碎。在此推薦第二種函荣,因為第一種有可能會面臨重啟服務(wù)器的情況,并且最主要的是扳肛,第一種方案有可能會對服務(wù)器上的其他項目產(chǎn)生影響傻挂。(附Windows 上 font路徑: C:\Windows\Fonts,有好幾百兆哦)

官方文檔: https://docs.aspose.com/display/wordsjava/True+Type+Fonts

public  class  CrackSample  {

    public  static  void  main(String[]  args)  throws  Exception  {
        String  baseDir  =  "D:\\temp\\";
        doc2pdf(baseDir  +  "text.docx",  baseDir  +  "test.pdf");
    }

    /**
    * @Description: 驗證License
    * @Param: []
    * @return: boolean
    * @Author: Jet.Chen
    * @Date: 2019/4/8 11:52
    */
    public  static  boolean  checkLicense()  throws  Exception  {
        boolean  result  =  false;
        try  {
            InputStream is  =  com.aspose.words.Document.class.getResourceAsStream("/com.aspose.words.lic_2999.xml”);
            if (is == null) return false;
            License asposeLicense = new License();
            asposeLicense.setLicense(is);
            System.out.println("Aspose isLicensed:  " + asposeLicense.isLicensed());
            result = true;
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }

        return result;
    }

    public static void doc2pdf(String inPath, String outPath) throws Exception {
        // 驗證License 否則轉(zhuǎn)出的pdf文檔有水印
        if (!checkLicense()) {
            throw new Exception("com.aspose.words lic ERROR!");
        }

        try {
            File file = new File(outPath);
            FileOutputStream os = new FileOutputStream(file);
            if (!System.getProperty("os.name").toLowerCase().startsWith("windows")) {
                // linux 需要配置字體庫
                FontSettings.getDefaultInstance().setFontsFolder("/data/crm/fonts",  false);
            }
            // 讀原始文檔
            Document doc  =  new  Document(inPath);
            // 轉(zhuǎn) pdf
            doc.save(os,  SaveFormat.PDF);
        }  catch  (Exception  e)  {
            e.printStackTrace();
        }

    }
}

四挖息、附件下載

無法貼百度網(wǎng)盤相關(guān)鏈接金拒,需要下載的可以去我博客的原文中點擊鏈接 下載

參考:https://blog.csdn.net/shadowkiss/article/details/80868472

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末套腹,一起剝皮案震驚了整個濱河市绪抛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌电禀,老刑警劉巖幢码,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鞭呕,居然都是意外死亡蛤育,警方通過查閱死者的電腦和手機宛官,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓦糕,“玉大人底洗,你說我怎么就攤上這事」韭Γ” “怎么了亥揖?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長圣勒。 經(jīng)常有香客問我费变,道長,這世上最難降的妖魔是什么圣贸? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任挚歧,我火速辦了婚禮,結(jié)果婚禮上吁峻,老公的妹妹穿的比我還像新娘滑负。我一直安慰自己,他們只是感情好用含,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布矮慕。 她就那樣靜靜地躺著,像睡著了一般啄骇。 火紅的嫁衣襯著肌膚如雪痴鳄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天缸夹,我揣著相機與錄音痪寻,去河邊找鬼。 笑死明未,一個胖子當(dāng)著我的面吹牛槽华,可吹牛的內(nèi)容都是我干的壹蔓。 我是一名探鬼主播趟妥,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼佣蓉!你這毒婦竟也來了披摄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤勇凭,失蹤者是張志新(化名)和其女友劉穎疚膊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虾标,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡寓盗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傀蚌。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡基显,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出善炫,到底是詐尸還是另有隱情撩幽,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布箩艺,位于F島的核電站窜醉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏艺谆。R本人自食惡果不足惜榨惰,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望静汤。 院中可真熱鬧读串,春花似錦、人聲如沸撒妈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狰右。三九已至杰捂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棋蚌,已是汗流浹背嫁佳。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谷暮,地道東北人蒿往。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像湿弦,于是被迫代替她去往敵國和親瓤漏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

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