C#: 使用 PDFSharp 在 PDF 加上浮水印和檔案密碼吧

接續前一篇 C#: 使用 DinkToPdf 把 HTML 轉成 PDF,這篇要來用 PDFSharp 對 PDF 檔案進行一些小小的調整。基本上就是紀錄一下這次遇到的需求和一些坑,主要的內容會有:

  • 替 PDF 加上浮水印
  • 實作 FontResolver 以支援中文字,避免 ⎕⎕⎕
  • 替 PDF 加上檔案密碼

首先當然是要先安裝 PDFSharp 套件:

接續上次的進度,我們把 PDF 檔案弄成了一組 byte[]

// 在上一篇文章,我們使用 DinkToPdf 把 Html 轉成了 PDF 檔案的 byte[]
var pdfBytes = converter.Convert(doc);

// 或是打開已存在的 PDF 檔案(留著讓我以後複製貼上)
// var pdfBytes = File.ReadAllBytes(@"C:\temp\output.pdf");

// 使用 PdfSharp 由記憶體串流讀取轉換後的 PDF,開啟模式設定為 Modify(可以進行修改)
using var document = PdfReader.Open(new MemoryStream(pdfBytes), PdfDocumentOpenMode.Modify);

現在我們已經用 PDFSharp 開啟這個 PDF 檔案了,接著就讓我們從加上簡單的浮水印開始吧!

……

閱讀全文



.Net: 善用 IServiceCollection Extension 和自製 Builder,讓服務註冊更有約束吧

在之前的依賴注入文章的「組合根請稍作分類」小節,我們介紹過使用 IServiceCollection 的擴充方法來對要註冊的服務進行分類和管理的做法:

public static class ServiceCollectionExtensions
{
    /// <summary>
    /// 註冊 Nice Service
    /// </summary>
	public static IServiceCollection AddNiceServices(this IServiceCollection services)
	{
		services.AddScoped<INiceService, NiceService>();
        // ...一些相關的註冊

		return services;
	}
}
// Program.cs
builder.Services.AddNiceServices();

一直以來我都採用這個方法來簡單地拆分我的服務註冊,在大多數的場合已經足夠使用(尤其是只關注目前的專案時)。

但前幾天在看某個套件的實作時,開發的朋朋跟我分享了一些延伸的做法,感覺合理又常見,屬於有注意到就會記得的小技巧,決定馬上來記錄一篇筆記。

……

閱讀全文



Imgur 一直 temporarily over capacity 嗎?先檢查網路看看吧

直接先講結論,給正在查這條錯誤訊息而來到這邊的朋朋參考:

  1. 先看 imgur status 確定 Imgur 服務有沒有正常
  2. 優先判斷是不是網路問題:如果有其他網路,更換網路試試看
  3. 如果開著 VPN,關掉再試試看; 反之如果沒開 VPN,找一組跳去外國試看看
  4. 到這邊還是不行的話,代表你遇到的狀況跟我不一樣,就,祝你好運

“Imgur is temporarily over capacity” 這組錯誤訊息除了服務異常,也有可能是 IP 或地區被阻擋。目前(2025/06/14)在 PTT巴哈也有台灣 IP 被擋(官方未證實)的討論。
因此有遇到並且找到這篇文的朋友,請先從網路問題開始檢查,最好能用 VPN 之類的跳到國外驗證試試,祝順利。

前陣子寫文章要上傳圖片的時候一直無法上傳,覺得奇怪就去 Imgur 看了一下,結果登入按了啥反應也沒有,忘記密碼也沒反應。

開 F12 只看到 “Imgur is temporarily over capacity. Please try again later.",例如忘記密碼的回應:

{
    "data": {
        "error": "Imgur is temporarily over capacity. Please try again later."
    },
    "success": false,
    "status": 500
}

奇怪的是用手機的 Imgur 可以正常登入,但換成筆電仍然是不能登入。但既然錯誤訊息都說它們已經 over capacity 了,這點輕微的靈異現象應該也都是合理的(吧)

本來想說「那就等等唄,誰系統沒壞過」,秉持一份工程師不為難工程師的善心,大不了就等系統恢復再用就好

但幾天過去了,感覺事情越來越不對勁……

……

閱讀全文



Windows: 關閉 OneDrive 同步,並把我的文件移回預設路徑

Image

最近因緣際會必須重灌電腦,安裝過程中忘記把 OneDrive 取消掉,結果進 Windows 才發現我的文件夾跑去 C:\Users\xxx\OneDrive\文件,差點昏過去囧

先不論我一堆遊戲存檔都在 Documents 資料夾裡,預設的 5GB 根本吃不下(硬吃還會導致信箱不能收信),一些自己寫的小腳本都已經把 C:\Users\xxx\Documents 當作「我的文件」的預設路徑了,實在不想為了 OneDrive 調整…

因此決定留一篇筆記,把「我的文件」從 C:\Users\xxx\OneDrive\文件 搬回 C:\Users\xxx\Documents,給下次重灌的我(對,我下次還是會忘記的),順便也給網路上遇到同樣問題的朋朋跟他們的 AI Search 參考。

備註:如果你是遇到 OneDrive 名稱自動帶了空格跟中文(例如 “OneDrive - 超棒公司”,像是微軟社區的這個問題)導致一堆路徑沒加引號的腳本炸掉,但又不打算關閉 OneDrive 同步功能的話,只需要用改名的方式來迴避就可以了。請參考 更改 OneDrive 預設資料夾名稱

……

閱讀全文



C#: 使用 DinkToPdf 把 HTML 轉成 PDF 吧

Image

最近做的一項需求是要把 HTML 轉換成 PDF,過程中決定使用 DinkToPdf 來處理這一段。

考慮到現在拿到的一些文件模板都是 HTML 檔了,感覺以後會蠻常碰到這個場景,決定來筆記一篇,給未來的我複製貼上。

環境準備

首先,當然是要先到 Nuget 安裝這篇的主角:DinkToPdf

Image

由於 DinkToPdf 只負責包裝給 C# 這段,實際上要產出 PDF 還得用到 wkhtmltopdf 這個工具,因此還需要先弄到 wkhtmltopdf 的檔案。

不過作者也知道大家不是很想另外跑去找,所以 wkhtmltopdf 的組件檔案可以直接從 DinkToPdf 的 Repo 拿。但要記得要按照作業系統下載對應的 wkhtmltopdf 檔案:

  • Windows => libwkhtmltox.dll
  • Linux => libwkhtmltox.so
  • macOS => libwkhtmltox.dylib

但全部都載也不會有人阻止你就是了。

最後把 libwkhtmltox 放到專案的根目錄底下,DinkToPdf 就呼叫得到囉!
(問就是魔法,不服的自己去啃 P/Invoke

……

閱讀全文



《真三國無雙:起源》白金心得

Image

前陣子成功把《真三國無雙:起源》給白金了,按照慣例趁休假來把遊玩紀錄整理成一篇心得吧!

補充:這篇是我個人遊玩《真三國無雙:起源》的心得。
如果你是在找《真三國無雙:起源》的白金獎盃攻略,推薦你這篇:
《真・三國無雙 起源》全成就指南 - Steam 社群

作為一名從2代玩到現在的老玩家,對這次的起源蠻滿意的。

雖然一開始玩的時候,對於不能像系列作一樣操作各式各樣的無雙武將這點感到很可惜,但隨著遊戲推進,覺得操作一名主角跟這些武將互動、參與戰役也挺有意思的。

同樣是操作路人甲(?)闖蕩三國,原本還有點擔心會不會變得像《臥龍》,但《無雙》還是保留了很多自家的特色,兩者對戰場的詮釋完全不同,尤其是一騎當千、馳聘戰場的部份很讓人滿意。

既然「無雙」都已經能作為一種遊戲類型的代稱了,聊無雙就一定會聊到戰鬥,這也是我對本作最滿意的點:有做出大軍團相撞跟亂軍衝殺的感覺

……

閱讀全文



《河狸浮生記》體驗版遊玩心得

Image

在 Steam 城市營造和殖民模擬節購入了這款河狸浮生記,玩了一兩輪覺得挺不錯的,反正這款遊戲還沒有成就系統,也不用像前幾款一樣等白金再整理,決定來順手紀錄一下心得。

河狸浮生記的主軸是在人類滅亡後的世界裡率領河狸們建造都市,是款偏小品休閒的城市營造遊戲,我個人玩得還蠻開心的,除了河狸蠻可愛的以外,這遊戲的可玩性也符合我對小品城市營造的要求。

在指揮河狸們建立都市的過程中,我們主要會面臨三個課題:資源管理、災難處理、城市規劃。

資源管理和大多城市營造遊戲相同,就是在不同階段會有不同的主要資源目標,在生產既有資源的同時,逐步疊加生產新資源的需求。因此需要一步步提升城市蒐集、處理和儲藏資源的能力,同時維持所有資源的生產量和儲藏量,讓城市能夠持續運行。

而在這款遊戲,因為是河狸當主角,建築大多依賴木頭來製作,初期就需要積極開採木頭拓荒,同時規劃種植樹木來產生長期、持續的木頭收入,畢竟木頭自由就是持續擴張的本錢。

開伐一定木頭、開始有基本的建築之後,就開始面臨河狸的生存需求,尤其是食物和飲水。這時候就需要採集並種植漿果和胡蘿蔔等食物來源,並在河岸邊採水儲存,才能保證河狸們能夠長期存活。

在前期階段,擴張跟存活就是我們的主要目標了,吃飽穿暖就是我們河狸村的夢想。

……

閱讀全文



JMeter: 使用 Constant Throughput Timer 設置固定吞吐量

Image

我們在之前 JMeter 的筆記時,介紹過直接對服務爆打一波的作法:簡單來說就是打好幾輪看看服務撐不撐得住,然後紀錄能吃的最大數量,可以說是非常暴力的做法。

但如果我們想要模擬某個固定數值的請求量(例如每分鐘 100 次請求)、又或是需要用固定速率打出去(例如每 5 秒得敲一下),就不能像上次一樣粗暴地全力出擊了。

這時候,我們就可以用 JMeter 提供的 Constant Throughput Timer(固定吞吐量計時器)來限制呼叫頻率,馬上來筆記一篇。


以下範例會使用到 JMeter 的 HTTP Request 等功能,還不太瞭解的朋友推薦先閱讀上一篇筆記:使用 JMeter 來對 API 壓力測試吧

先確認一下環境:我們有一組腳本,內容只是簡單地戳一下 API

Image

現在我們希望可以模擬線上使用者在尖峰時段的使用頻率,並確認我們服務挺得過去,所以需要把這組腳本調整成:「每分鐘戳 20 次,持續五分鐘」

補充:有時候我們收到的需求會是「持續五分鐘,然後總量為 100」這種,意思是差不多的,反正先確認好 「每分鐘的數量 x 持續幾分鐘 = 總量」 這幾個關鍵數字再說嚕。

首先讓我們加入一組 Constant Throughput Timer: Image

……

閱讀全文



WakaTime: 隱藏敏感資訊、開啟離線暫存、卡在 Initialized 時的參考解法

Image

WakaTime 是一款紀錄 Coding 時間的好用工具,只要安裝 IDE 的擴充套件,就可以輕鬆地記錄各個語言、編輯器、專案所用的時間。我從 2020 年寫了篇 WakaTime 介紹文章 開始,也一路用到現在 2025 了,已經習慣動不動上去看兩眼的生活。

但在相對封閉的一些環境進行開發時,我們可能需要先對 WakaTime 調整一些設定才能用得安心,這篇筆記就分享一下最近遇到的三個場景,供有興趣的朋友參考參考。

在 WakaTime 隱藏敏感資訊(檔案名稱、專案名稱…)

Wakatime 除了會記錄使用的程式語言和 IDE 等工具以外,也會紀錄專案、檔案路徑等等。但有時候我們可能並不希望記錄這些資訊(像是業主委託的專案名稱有點敏感啦、路徑可能有個人姓名之類的),這時就需要調整 Wakatime 的 Config,來把相關的資訊隱藏起來。

Wakatime 的設定會放在 .wakatime.cfg
(Windows 預設會在 C:\Users\{User}\C:\Users\{User}\.wakatime

開啟之後就會看見自己的 API Key 等設定,像這樣:

[settings]
api_key = ***

能在 .wakatime.cfg 調整的設定值可以參考官方文檔:USAGE.md

因為這次我們的目標是隱藏資訊,所以會用到的主要是 Hide 四兄弟:

  • hide_file_names:隱藏檔案名稱
  • hide_branch_names:隱藏分支名稱
  • hide_project_names:隱藏專案名稱
  • hide_project_folder:隱藏專案資料夾

全打開的話會像這樣:

[settings]
api_key = ***
hide_file_names = true
hide_branch_names = true
hide_project_names = true
hide_project_folder = true

接下來讓我們簡單認識一下它們。

……

閱讀全文



菜雞出門玩:2024 韓國釜山

今年難得有機會出國逛逛(雖然是蹭女友公司的員工旅遊,謝謝隔壁老闆!),想說 2024 也要結束了,決定趁著放長假的時候來整理一下。

因為是第一次嘗試發旅遊文,打算順著路上景點丟丟照片、簡單寫一下心得就好。如果之後有繼續發同系列的文章再來慢慢微調吧。說不定就趁勢轉型成旅遊美食部落格了呢

這篇主要會分成三個部份:行前準備、景點紀錄、個人心得。那麼就開始囉!

Image ▲ 海東龍宮寺的燈,放這張當封面只是因為我喜歡。

行前準備

這趟除了出門必須的整頓行李和旅平險以外,還另外買了有交通卡和換匯功能的 WOWPass、提供手機網路的 SKT eSIM,這兩個在 KKday 購買的話可以選擇直接在機場取貨。

但我們交通卡跟 eSIM 取貨的航廈選錯,導致我們要在桃園機場兩個航廈之間來回跑囧,如果有一樣蠢的朋友,提醒一下桃園機場有接駁電車可以往來第一航廈跟第二航廈…

此外要特別注意的應該是地圖 APP 了。

由於韓國的法規限制(主要是因為跟北韓的尷尬狀況),較精密的地理資訊只能放在國內的伺服器。這也導致 Google Map 在韓國……不是那麼好用。

因此要前往韓國之前,通常會在 Naver MapKakao Map 裡面選一個用

我們這趟用的是 Naver Map,主要是因為 APP 裡至少還有簡中能選。
我們這些英文不好的孩子是這樣的

延伸閱讀:為什麼 Google Maps 在韓國不行用?有什麼替代方案? - ExitTaiwan

……

閱讀全文



系列文

轉貼文

最近文章

分類

友鏈

標籤

統計資訊

工商服務

    DDDTaiwan