原文地址: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)谈截,只需要將 zzZI0 和 zzZI1 方法的返回值調(diào)整為 true 即可,并將 zzZ 方法內(nèi)的校驗步驟刪掉涧偷。見下圖:
2簸喂、重寫驗證的方法
很簡單,分兩步燎潮。
第一步是清除掉 zzZ 方法內(nèi)的內(nèi)容喻鳄,在此使用的是上文提到的 JByteMod 工具,見下圖:
第二步是改寫 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