從零開始用C#做產品:私人日記(24)Rtf內容複製為Html

上一節我們完成了基本的設定,應該說,至少目前對我來說,現在的功能已經基本夠用了。

於是我計劃從這篇文章開始,我就不再使用Word進行編輯了,用我這個私人日記軟體來編輯,實際驗證下是否實用。

如下圖,這是我之前教程的編寫模式:

從零開始用C#做產品:私人日記(24)Rtf內容複製為Html

之前也交待過,在word文件中編輯,只要是包含了圖片的,複製後再貼上到頭條都沒辦法成功,還需要把圖片一個個另外貼上過去才行。如果是遇到gif動圖,從word複製只能複製靜態的截圖,還得再次複製原檔案才能貼上到頭條的編輯器中,操作起來比較麻煩。

於是我就在我的程式中嘗試複製貼上,發現跟word是一樣的效果。這對我來說是不實用的,需要對它進行改造。

要解決這個問題,首先要分析下為什麼會造成這種情況。我們使用的文字編輯控制元件是RichTextBox,這個預設是rtf格式的,跟word是一樣的。我們把帶圖文的內容貼上到word文件中,圖片就是可以正常顯示的。這就說明我們Ctrl+C的內容是rtf格式的,而不是透過瀏覽器貼上能夠識別出來的格式。那麼瀏覽器能夠識別的格式是不是每個瀏覽器特有的呢?於是我嘗試在FireFox中複製圖片和文字,貼上到用Chrome開啟的頭條編輯器,發現圖片是可以顯示的,上述的猜測可以排除了。那麼這個格式究竟是怎樣的呢?我需要在程式中截獲一下貼上的內容。在ContentManagerForm。cs檔案中,新增鍵盤截獲事件,截獲Ctrl+V時的內容:

從零開始用C#做產品:私人日記(24)Rtf內容複製為Html

我們發現,如果從瀏覽器上按Ctrl+C,到我們的軟體中按Ctrl+V,用DataFormats。Html做引數可以取到值,值的內容大概是這樣:

從零開始用C#做產品:私人日記(24)Rtf內容複製為Html

前面紅線部分相當於資訊頭,定義了一些引數,後面從

開始就是我們剛剛複製的內容了。我原封不動地將這些內容再寫回到剪貼簿中,然後在瀏覽器中按Ctrl+V,瀏覽器也能夠正常顯示了。

這樣我們基本上就明白了,想要跟瀏覽器正常通訊,需要兩步:第一步是要將rtf格式轉換為html格式,第二步是要將html再轉換成瀏覽器能夠識別的格式到剪貼簿。

一、rtf格式轉html格式

一般這種格式轉換需要的工作量都比較大,自己從頭開發不大現實,需要網上找找看是否有現成的類庫。對比了幾家,找到了一個rftpipe的,而且是mit授權的。於是從Nuget獲取安裝,使用起來很容易:

Encoding。RegisterProvider(CodePagesEncodingProvider。Instance);

string

html = RtfPipe。Rtf。ToHtml(tbxMainBody。Rtf);

如此兩行程式碼就實現了第一步的轉換。

二、從html到剪貼簿

同樣也是先網上查資料,找到了一個

ClipboardHelper

的類,同樣也是mit授權的。把程式碼加入到工程,然後在ContentManagerForm中增加一個專門用於複製成html格式到剪貼簿的按鈕:

從零開始用C#做產品:私人日記(24)Rtf內容複製為Html

按鈕處理程式碼:

private void btnCopyAsHtml_Click(object sender, EventArgs e){Encoding。RegisterProvider(CodePagesEncodingProvider。Instance);string html = RtfPipe。Rtf。ToHtml(tbxMainBody。Rtf);ClipboardHelper。CopyToClipboard(html, “”);}

在使用了類庫的基礎上,三行程式碼就完成了我想要的功能。

功能演示:

從零開始用C#做產品:私人日記(24)Rtf內容複製為Html

以上解決了從軟體複製到頭條的問題。

還有一種場景,就是把瀏覽器當成來源,從瀏覽器複製到軟體的功能。如果是純文字RichEdit編輯器自帶就支援,如果是圖文混排的,就需要從html到rtf的轉換,我找了一下相關的類庫,貌似沒有類似rftpipe這種免費且直接支援字元轉換的庫,很多都是透過文件來轉換,而且還是收費的。好不容易找到一個符合要求的,結果這個專案比較老,是在Framework下開發的,不支援。netcore。

鑑於找到合適的庫有點困難,隨後仔細分析了下需求,其實這種從瀏覽器圖文混排複製到軟體的場景對我來說意義不大,通篇複製是不大可能的,關鍵位置複製文字做摘抄,真的有特別需要的圖片,單張截圖就好,所以這個功能暫時擱置吧。

這個小專案伴著教程做到了24節,終於有了一點實際作用了:)

——————————————————————————

本教程儘量保證2天一更,專案原始碼已作為開源專案加入到Gitee,程式碼內容會隨教程實時更新,大家有興趣的話可以關注我,以獲得最及時的更新。私信:

私人日記

可以獲取Gitee的連結;

sqlitestudio

可以獲取sqlitestudio的連結;

菜鳥

可以獲取菜鳥教程連結;

QQ群

可以獲取教程交流Q群號;

大家閱讀過程中有哪些看不懂或未盡興的地方,可以在評論區留言,我會先記下來在後續的教程中找機會再說。

教程有幫助的話請大家幫忙關注、轉發、擴散,能不能開專欄還需要你們的支援!