透過反射注入去除Spire.Office的PDF水印

Echo_xxx發表於2024-06-29

Excel

Workbook wb = new Workbook();
wb.Crack();
//或者
Workbook wb = InjectLicense(new Workbook());

  

Word

Document dc = new Document();
dc.Crack();
//或者
Document dc = InjectLicense(new Document());

  

實現類

public static class SpireOfficeHelpers
{
    /// <summary>
    /// 注入啟用資訊
    /// </summary>
    /// <param name="workbook"></param>
    public static void Crack(this Workbook workbook)
    {
        InjectLicense(workbook);
    }
    /// <summary>
    /// 注入啟用資訊
    /// </summary>
    /// <param name="document"></param>
    public static void Crack(this Document document)
    {
        InjectLicense(document);
    }
    /// <summary>
    /// 注入啟用資訊,並返回該型別
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="t"></param>
    /// <returns></returns>
    public static T InjectLicense<T>(T t) where T : class
    {
        var InternalLicense = t.GetType().GetProperty("InternalLicense", BindingFlags.NonPublic | BindingFlags.Instance);
        var TypeLic = InternalLicense.PropertyType.Assembly.CreateInstance(InternalLicense.PropertyType.GetTypeInfo().FullName);
        foreach (var item in TypeLic.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
        {
            if (item.FieldType.IsArray)
            {
                item.SetValue(TypeLic, new string[] { "Spire.Spreadsheet", "Spire.DocViewer.Wpf" });
            }
            else if (item.FieldType.IsEnum)
            {
                item.SetValue(TypeLic, 3);
            }
        }
        InternalLicense.SetValue(t, TypeLic);
        return t;
    }
}

  

相關文章