Word 轉 pdf 之 Aspose 工具的“科學使用”

搜尋微信公眾【

Jet與程式設計

】體驗更多有趣功能和文章哦。

一、背景

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

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

二、Crack

我們先從官網下載 jar 包,地址:https://downloads。aspose。com/words/java,或者也可在文末下載。

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

原理:原理其實很簡單,找到 jar 包內 license 校驗的地方,將其相關的程式碼修改掉就 ok。

1、初窺 jar 包內詳情

在此檢視 jar 包內詳情使用的工具是:JByteMod,文末有下載連結。

追蹤原始碼,我們發現了罪魁禍首,其實就是 License。class 這個檔案,然後發現license 的方法內鬥指向了一個類zzZLJ,所以接著追蹤這個類,然後研究後發現,只需要將

zzZI0

zzZI1

方法的返回值調整為 true 即可,並將

zzZ

方法內的校驗步驟刪掉。見下圖:

Word 轉 pdf 之 Aspose 工具的“科學使用”

-

Word 轉 pdf 之 Aspose 工具的“科學使用”

-

Word 轉 pdf 之 Aspose 工具的“科學使用”

2、重寫驗證的方法

很簡單,分兩步。

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

Word 轉 pdf 之 Aspose 工具的“科學使用”

第二步是改寫 zzZI0 和 zzZI1 方法的返回值,在此使用的是 javassist 工具,需要手動寫個測試類去修改內部的方法並生成一個新的 class 檔案,見下述程式碼:

org。javassist javassist 3。24。1-GA

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) { System。out。println(“method name: ” + c。getName() + “() ,Parameter:”); 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;}”); } } //輸出到當前目錄下 c2。writeFile(); }}

3、替換位元組碼檔案

使用上述程式碼可以生成一個 zzZLJ。class 檔案,我們只需要將這個檔案替換掉 jar 包內的原始檔案即可,在此可以隨便找一款壓縮工具即可。

但是需要注意,為了防止檔案指紋校驗,我們需要刪除掉 jar 包中的 META_INF 資料夾。

最後,需要生成一個許可檔案 com。aspose。words。lic_2999。xml,將其放在 jar 包內即可(不放也可以,但是在checkLicense()方法內讀取的時候,需要自己處理下路徑),如圖:

Aspose。Words for Java Enterprise 29991231 29991231 www。jetchen。cn www。jetchen。cn

-

Word 轉 pdf 之 Aspose 工具的“科學使用”

三、使用

至於使用也相當簡單,但是有一個坑需要注意,經測試發現,在 Windows 平臺一切正常,但是在 centos 環境下,轉換出來的 pdf 檔案中,中文都被替換成了小方框,很顯然,是缺少字型的原因。

解決辦法有兩種,一是在伺服器上安裝相應的字型庫,二是將 Windows 的字型庫 copy 一份到伺服器上,然後在專案裡引用即可。在此推薦第二種,因為第一種有可能會面臨重啟伺服器的情況,並且最主要的是,第一種方案有可能會對伺服器上的其他專案產生影響。(附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 否則轉出的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); // 轉 pdf doc。save(os, SaveFormat。PDF); } catch (Exception e) { e。printStackTrace(); } }}

四、附件下載

1、aspose 原版 jar 包:

2、aspose track 版 jar 包:

3、JByteMod:

附件內容請點選

瞭解更更多

下載。