一個開源的工具類輪子是怎么造出來的

心路歷程

為什么要做

在22年9月的某一天,在公司開需求評審時,接到了一個給PDF、圖片添加水印的需求。
做為一個剛工作的CURD程序員,在遇到這些問題時,第一反應是去github上找找有沒有類似的開源框架。
但是,出乎我意料的是竟然沒有一個統一的框架,都是各個文件有著各個文件添加水印的框架。并沒有一個大一統的框架。此時就萌生出一個想法了,我能不能寫一個呢?
于是EasyWatermark出現了,在一開始的想法中,框架的主要的作用就是傳入一個文件,并設置本次要添加的水印,即可在文件中添加水印內容。
但在開發的途中,卻意外連連。

自我懷疑以及堅持下去

從git提交記錄可以發現一點端倪,整個倉庫的提交時間可以大致的分為三個階段

  1. 2022年11月:框架初期搭建,自我懷疑期

框架剛搭建時,由于已經在工作上實現了PDF添加水印的功能了,所以能夠很快的搭建完初始框架。
但是問題也隨之而來了,那個時候我常常在想,這個框架真的有人用嘛,添加水印這么簡單的功能,為什么要寫一個框架出來呢?
這個時候陷入了深深的懷疑當中,于是乎,開發進度也就停止了下來。
image.png

  1. 2023年2月:確定框架入口類

在2月這個時間點,我也忘記了為什么自己又重新開始了框架的開發😂。
但是在這個月中,實際上是沒有開發任何框架的功能的,只是在想著框架該如何規劃好

  • 項目名稱變更:從all-watermark變為easy-watermark
  • 增加框架入口類:參照easy-excel的使用方式進行了開發,創建了EasyWatermark入口類
  • 毫無用處的水印位置計算策略類

寫著寫著代碼,問題又出現了,內部邏輯設計已經規劃好了,但是該如何設計簡單易用的API供其他人使用呢?開發進度又雙叒叕停滯了。
image.png

  1. 以及最近的4月5月

忘記是在4月的哪一天了,在床上刷抖音時看到一個視頻,視頻的大致內容是兩個人,其中一個人讓一個男生去做一件事情,一開始這個男生就說不會,做得不好,別讓他做。那個人又說,我本來就沒想著讓你做的多好,你先去試試。于是乎那個男生就去做了,做完之后覺得,自己做的蠻不錯的。那個人又說一開始肯定做的不好,但是你一直想著做得不好,就不去做,那永遠都不會好。

不要一開始就想要做的多好,重要的是得先開始做,哪怕做的再不好,也好過不去嘗試。

正是看了這個視頻之后,我又想起了我還有一個開源框架仍在開發中,并且開發這個框架的經歷跟視頻的差不多,于是乎我又開始完善的我水印框架了。
在最近的兩個月中,我重構了大部分代碼,定義好了四種水印渲染類型,定義了一個擴展接口用于用戶自定義頁面的水印。
說了這么多,簡單介紹一下我開發的水印框架吧。

Easy-Watermark

框架功能

抽象了各個文件類型對于添加水印的API,內部提供了多種預設水印類型以供使用,無需二次開發。

快速開始

pom文件中引入依賴

<dependency><groupId>org.easywatermark</groupId><artifactId>easy-watermark</artifactId><version>0.0.2</version>
</dependency>

使用水印框架

byte[] result = EasyWatermark.create().file(fileData).text("Easy-Watermark").execute();

支持文件類型

PDF、圖片類型、Office套件文件(仍在開發中)

內置水印類型

  • CUSTOM:自定義水印,使用框架抽象的統一方法,對傳入文件的每個頁面進行特殊處理
  • CENTER:居中,在頁面的各個居中位置上添加。
  • OVERSPREAD:頁面鋪滿,可設置傾斜角度
  • DIAGONAL:頁面對角水印

最后

更多的信息可以去到倉庫頁面查看:https://github.com/AzirZsk/easy-watermark,如果覺得我的框架寫的還不錯,請幫忙在GitHub點個??Star,你的支持是我開發的動力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/14303.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14303.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/14303.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2024年 電工杯 (B題)大學生數學建模挑戰賽 | 大學生平衡膳食食譜的優化設計 | 數學建模完整代碼解析

DeepVisionary 每日深度學習前沿科技推送&頂會論文&數學建模與科技信息前沿資訊分享&#xff0c;與你一起了解前沿科技知識&#xff01; 本次DeepVisionary帶來的是電工杯的詳細解讀&#xff1a; 完整內容可以在文章末尾全文免費領取&閱讀&#xff01; 問題1&…

快手二面準備【面試準備】

快手二面準備【面試準備】 前言版權快手二面準備秋招一面中的問題實習一面中的問題計算機網絡和操作系統論壇項目登錄注冊ThreadLocal代替session存儲用戶秒殺項目登錄注冊->阿里驗證碼->rpcsession為什么改為token實現&#xff0c;redis存儲用戶信息由binlog的用法->…

Python魔法學院:PySpider篇——網絡世界的探險與征服

Hi&#xff0c;我是阿佑&#xff0c;迎來到Python魔法學院&#xff0c;今天阿佑要帶大家學習的是PySpider篇——一門讓你在網絡世界中探險與征服的魔法課程。從環境搭建到高級功能應用&#xff0c;再到性能優化&#xff0c;每一個章節都是成為數據大師的必經之路&#xff01; 文…

為什么拼命賺錢:窮怕了

我內心深處比較自卑。 從小在農村長大&#xff0c;爸不管媽不愛。 這么說大家沒感覺&#xff0c;從小什么都干&#xff0c;六歲開始做飯&#xff0c;每次開學都會全員大掃除&#xff0c;站在那里腳踩泥土地、眼神呆滯、雙手無處安放、眼神都不敢直視的小伙子就是我&#xff0…

VS Code中使用 Anaconda 環境

在 Visual Studio Code (VS Code) 中使用 Anaconda 環境進行 Python 開發&#xff0c;可以充分利用 Anaconda 提供的包管理和虛擬環境功能&#xff0c;同時享受 VS Code 提供的強大開發工具和調試功能。以下是詳細步驟&#xff1a; 1. 安裝 Visual Studio Code 和 Anaconda 首…

JavaScript Window對象

一、BOM&#xff08;瀏覽器對象模型&#xff09; window對象是一個全局對象&#xff0c;也可以說是JavaScript中的頂級對象。 像document、alert()、console.log()這些都是window的屬性&#xff0c;基本BOM的屬性和方法都是window的。 所有通過var定義在全局作用域中的變量、…

GitLab的原理及應用詳解(四)

本系列文章簡介&#xff1a; 隨著軟件開發的不斷進步和發展&#xff0c;版本控制系統成為了現代軟件開發過程中不可或缺的一部分。而GitLab作為其中一種流行的版本控制工具&#xff0c;在軟件開發領域享有廣泛的應用。GitLab不僅提供了強大的版本控制功能&#xff0c;還集成了項…

四川古力科技抖音小店,創新科技點亮購物新體驗

在這個數字化浪潮洶涌的時代&#xff0c;四川古力科技以其前瞻性的戰略眼光和創新能力&#xff0c;閃耀于抖音小店這片電商新藍海&#xff0c;開啟了未來購物的新紀元。作為一家集技術研發、產品創新、市場營銷于一體的科技型企業&#xff0c;古力科技不僅為消費者帶來了前所未…

idea中顯示git的Local Changes

1. 第一打開idea中的Settings文件 2. 找到Version Contro中的commint 3. 取消勾選應用即可 4. 本地提交就會顯示出來

ruoyi出現的那些bug

1、 npm install --registryhttps://registry.npm.taobao.org/element-ui request to https://registry.npm.taobao.org/element-ui failed, reason: certificate has expired 路徑錯誤 ? npm install https://registry.npmmirror.com 2、自定義模塊401 {"msg"…

Google Earth Engine(GEE)深度學習入門教程-Python數據讀入篇

Python數據讀入篇 前置條件&#xff1a; GEE預處理影像導出保存為tfrecord的數據包&#xff0c;并下載到本地tensorflow的深度學習環境 本篇文章的目的主要是把Tfrecord格式的數據加載為tf可使用的數據集格式 設定超參數 首先需要設定導出時的波段名稱和數據格式&#xff…

Java日期時間差計算-Hutool 多少天多少時多少分多少秒

在Java中&#xff0c;使用Hutool庫來計算兩個日期之間具體相差的天數、小時數、分鐘數和秒數&#xff0c;可以通過一系列步驟實現。這里提供一個示例代碼&#xff0c;演示如何完成這個需求&#xff1a; 首先&#xff0c;確保你的項目中已添加Hutool依賴&#xff0c;如之前所述…

ARTS Week 30

Algorithm 本周的算法題為 747. 至少是其他數字兩倍的最大數 給你一個整數數組 nums &#xff0c;其中總是存在 唯一的 一個最大整數 。 請你找出數組中的最大元素并檢查它是否 至少是數組中每個其他數字的兩倍 。如果是&#xff0c;則返回 最大元素的下標 &#xff0c;否則返回…

SpringBoot集成Logback將日志寫入文件夾

一、logback簡介&#xff1a; 目前比較常用的ava日志框架:Logback、log4j、log4j2、JUL等等。 Logback是在log4j的基礎上重新開發的一套日志框架&#xff0c;是完全實現SLF4J接口API(也叫日志門面)。 Logback 的架構非常通用&#xff0c;可以應用于不同的環境。目前logback分為…

LeetCode題練習與總結:從前序與中序遍歷序列構造二叉樹--105

一、題目描述 給定兩個整數數組 preorder 和 inorder &#xff0c;其中 preorder 是二叉樹的先序遍歷&#xff0c; inorder 是同一棵樹的中序遍歷&#xff0c;請構造二叉樹并返回其根節點。 示例 1: 輸入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 輸出: [3,9,20,nul…

什么是經典藍牙模塊?

什么是經典藍牙模塊&#xff1f;   前面我們已經就藍牙模塊的概念做了了解&#xff0c;隨著時間的推移&#xff0c;產品越來越智能&#xff0c;需要的藍牙模塊也就越來越廣泛&#xff0c;本篇文章我們就一起了解下什么是經典藍牙模塊。   經典藍牙模塊(BT)泛指支持藍牙協議…

SwiftUI中的手勢(DragGesture拖拽手勢及Drag動畫組件)

上一篇文章我們了解了如何使用.gesture修飾符和GestureState屬性包裝器&#xff0c;讓我們看看另一種常見的手勢&#xff1a;DragGesture拖拽手勢。 下面先看個效果圖&#xff1a; 這個效果中&#xff0c;我們實現了一個Text文本&#xff0c;并添加了拖拽手勢&#xff0c;可以…

代碼隨想錄算法訓練營第三十八天| 435. 無重疊區間 、763.劃分字母區間、56. 合并區間

435. 無重疊區間 題目鏈接&#xff1a;435. 無重疊區間 文檔講解&#xff1a;代碼隨想錄/無重疊區間 視頻講解&#xff1a;視頻講解-無重疊區間 狀態&#xff1a;已完成&#xff08;1遍&#xff09; 解題過程 看到題目的第一想法 這道題我的想法是首先將集合按照start從小到…

看上去好坑的運算符重載

#include <iostream> using namespace std; class MyInt {int nVal; public:MyInt(int n) { nVal n};MyInt & operator-(int n){ //運算符重載-nVal - n;return *this; } operator int() {return nVal;} //類型轉換函數};int Inc(int n){return n1; }int ma…

代碼隨想錄訓練營|一刷總結

代碼隨想錄一刷完成啦&#xff01;&#xff01;&#xff01; 自己曾經嘗試過刷力扣&#xff0c;但是卻不知道從何刷起、按什么順序刷題&#xff0c;直到遇到了卡哥、遇到了代碼隨想錄。研一上有著刷題的決心&#xff0c;但是卻沒有刷題的動力很難堅持下去&#xff0c;所以也就只…