DevExpress(WinForms WPF)中文教程 - 如何減小文檔文件大小?

DevExpress擁有.NET開發需要的所有平臺控件,包含600多個UI控件、報表平臺、DevExpress Dashboard eXpressApp 框架、適用于 Visual Studio的CodeRush等一系列輔助工具。屢獲大獎的軟件開發平臺DevExpress近期重要版本v24.1已正式發布,該版本擁有眾多新產品和數十個具有高影響力的功能,可為桌面、Web和移動應用提供直觀的解決方案,全面解決各種使用場景問題。

減小文檔文件大小可以改善文檔導入/處理相關操作,它還可以幫助最小化數據庫和云服務器中的文件存儲需求。在這篇文章中,我們將使用DevExpress(WinForms & WPF) Word Processing API來減少Microsoft Word文檔文件大小的不同策略。

重要提示:下面列出的策略涉及刪除文檔內容,刪除的內容將無法恢復。

獲取DevExpress v24.1正式版下載(Q技術交流:532598169)

簡化文檔

雖然顯而易見,文檔簡化是減少/優化文件大小的最佳方法,簡化策略包括:

  • 在可能的情況下,使用一組有限的樣式來格式化文檔內容。
  • 將文檔從DOCM格式轉換為DOCX格式來消除宏,您也可以使用RichEditDocumentServer.Options.DocumentCapabilities.Macros?選項來禁用宏。
  • 在保存文檔之前禁用跟蹤更改,RichEditDocumentServer包含RichEditDocumentServer.Options.DocumentCapabilities.TrackChanges屬性用于禁用跟蹤。
  • 減少圖像內容。
  • 使用鏈接OLE對象代替嵌入OLE對象,如果無法使用鏈接的OLE對象,可以減小嵌入OLE對象的大小或在保存之前將其刪除。有關OLE對象支持的其他信息,請參閱以下文章:OLE Objects in Word Documents
  • 減少字段和內容控件的使用,在保存之前取消鏈接或刪除字段。
  • 用壓縮圖像替換圖表。
  • 刪除額外的元數據(XML數據、文檔屬性、注釋、RTF主題數據)。
  • 將長表劃分為多個短表,在大多數情況下,長表不會影響文件大小,但會減慢文檔呈現和布局計算。
使用OpenXML格式替代傳統格式

OpenXML格式(DOCX)是現代的、開放的、跨多個平臺兼容的,雖然在某些情況下更有效,但遺留格式(如DOC、RTF)是專有的,靈活性較差。OpenXML文件本質上是帶有XML文件和附加資源(如圖像和樣式)的ZIP存檔,因此DOCX文件更容易存儲在數據庫中,您可以使用RichEditDocumentServer.Save?方法將文檔轉換為所需的文件格式。

不要嵌入字體

DevExpress?Word Processing Document API允許您在文檔中嵌入字體,雖然具有嵌入式字體的文檔在不同的計算設備上保持外觀特征,但這些文檔的大小要大得多。如果您的解決方案在受控/托管環境中顯示文檔,我們建議使用DevExpress DXFontRepository類。有關更多信息,請參閱以下幫助主題:Load and Use Custom Fonts Without Installation on the System

減小圖像大小

您可以使用第三方應用程序來壓縮文檔圖像,一旦壓縮,只需要調用PictureFormat.SetPicture方法將原始圖像替換為其壓縮后的等效圖像。

下面的代碼片段將原始圖像替換為壓縮后的等效圖像:

using (RichEditDocumentServer wordProcessor = new RichEditDocumentServer()) {
wordProcessor.LoadDocument("doc_with_images.docx");
Document document = wordProcessor.Document;
Shape shape = document.Shapes[0];
DXImage sourceImage = shape.PictureFormat.Picture.DXImage;
MemoryStream imageStream = new MemoryStream();
sourceImage.Save(stream);
//Compress the image saved in the stream
//...
DXImage compressedImage = DXImage.FromStream(updatedImageStream);
shape.PictureFormat.SetPicture(compressedImage);
}

另一個技巧是不要裁剪圖像,使用保存的預裁剪版本。您可以使用PictureFormat.SourceRect屬性在代碼中裁剪圖像,然后保存輸出,PictureFormatSetPicture方法允許您將圖像替換為裁剪后的版本。

下面的代碼片段裁剪圖像,保存它,然后用裁剪后的等效圖像替換原始圖像:

using (RichEditDocumentServer wordProcessor = new RichEditDocumentServer()) {
wordProcessor.LoadDocument("CroppedImages.docx");
Document document = wordProcessor.Document;
Shape shape = document.Shapes[0];
if (shape.PictureFormat != null) {
DXBitmap image = shape.PictureFormat.Picture.DXImage as DXBitmap;
var rectOffset = shape.PictureFormat.SourceRect;
RectangleF imageRect = new RectangleF(image.Width * rectOffset.LeftOffset,
image.Height * rectOffset.TopOffset,
image.Width - image.Width * rectOffset.LeftOffset - image.Width * rectOffset.RightOffset,
image.Height - image.Height * rectOffset.TopOffset - image.Height * rectOffset.BottomOffset);
MemoryStream imageStream = new MemoryStream();
image.Crop(imageRect).Save(imageStream, image.ImageFormat);
DocumentImageSource source = DocumentImageSource.FromStream(imageStream);
shape.PictureFormat.SetPicture(source);
shape.PictureFormat.SourceRect = new RectangleOffset();
}
}

如果需要使用大圖像,并且應用程序架構允許您單獨存儲圖像,則可以采用以下解決方案。迭代文檔的形狀集合,并將所有圖像保存到具有唯一標識符的數據庫中。完成后,用空圖像或DOCVARIABLE字段(用于動態圖像替換)替換原始文檔圖像,或者刪除圖像并用書簽標記其在文檔中的位置。通過使用此策略,您將能夠保存文檔的輕量級版本,并在必要時恢復原始文檔圖像:

Document document = wordProcessor.Document;
// iterate through document images, save them to the database
// and replace original images with an empty image
int imageID = 1; // generate an image ID as you require
DocumentImageSource emptyImageSource = DocumentImageSource.FromImage(new DXBitmap(1, 1));
for (int i = document.Shapes.Count - 1; i >= 0; i--)
{
Shape shape = document.Shapes[i];
if (shape.PictureFormat != null)
{
DXBitmap image = shape.PictureFormat.Picture.DXImage as DXBitmap;
using (MemoryStream imageStream = new MemoryStream()) {
image.Save(imageStream, image.ImageFormat);
byte[] imageBytes = imageStream.ToArray();
// save image bytes to the database with the specified image ID
// ...
// change the image name (if required) to identify it later
shape.Name = "Image " + imageID.ToString();
// replace the current image with the empty image
shape.PictureFormat.SetPicture(emptyImageSource);
}
imageID++;
}
}
// save the document with dummy images
using (MemoryStream documentStream = new MemoryStream())
document.SaveDocument(documentStream, DocumentFormat.OpenXml);//...
// restore document images
richEditControl.LoadDocument(documentStream, DocumentFormat.OpenXml);
Document document = richEditControl.Document;
for (int i = document.Shapes.Count - 1; i >= 0; i--)
{
Shape shape = document.Shapes[i];
if (shape.PictureFormat != null)
{
string imageName = shape.Name;
// extract the required image from the database by name
byte[] imageBytes = ...;
using(MemoryStream imageStream = new MemoryStream(imageBytes))
{
// replace the empty image with the original image
DocumentImageSource imageSource = DocumentImageSource.FromStream(imageStream);
shape.PictureFormat.SetPicture(imageSource);
}
}
}

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

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

相關文章

PlugLink 與 AI 大模型:深入 COZE API 鏈接實踐(附源碼)

在這個技術日新月異的時代,AI 不再是遙不可及的概念,而是逐漸成為我們日常生活與工作中不可或缺的一部分。作為技術領域的探路者,我深感榮幸地向大家介紹 PlugLink —— 一個旨在簡化 AI 應用集成并促進跨領域協作的開源平臺,以及…

開源數字人項目Hallo

硬件條件: gpu最低12G 軟件: cuda需支持 Python選擇3.10吧,我的版本3.11 源碼: GitHub - fudan-generative-vision/hallo: Hallo: Hierarchical Audio-Driven Visual Synthesis for Portrait Image Animation models文件&…

閱讀筆記——《Fuzz4All: Universal Fuzzing with Large Language Models》

【參考文獻】Xia C S, Paltenghi M, Le Tian J, et al. Fuzz4all: Universal fuzzing with large language models[C]//Proceedings of the IEEE/ACM 46th International Conference on Software Engineering. 2024: 1-13.【注】本文僅為作者個人學習筆記,如有冒犯&…

android paddingStart paddingLeft 使用區別

在 Android 開發中,paddingStart 和 paddingLeft 都是用來設置視圖的內邊距,但它們有一些重要的區別,尤其是在處理國際化和不同的布局方向(LTR 和 RTL)時: paddingLeft: 設置視圖內容左側的內邊距。只在從左…

科研繪圖系列:python語言實驗線圖(line Chart)

介紹 兩組數據在不同時間點的差異檢驗結果線圖 導入包 import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from scipy import stats輸入數據 ctr = [2, 2, 3, 3, 4, 5, 5, 6, 4, 8, 6, 6, 9, 11, 12, 12, 15, 16, 20, 25, 27] drug = [2, 3, …

python開發prometheus exporter--用于hadoop-yarn監控

首先寫python的exporter需要知道Prometheus提供4種類型Metrics 分別是:Counter, Gauge, Summary和Histogram * Counter可以增長,并且在程序重啟的時候會被重設為0,常被用于任務個數,總處理時間,錯誤個數等只增不減的指…

查看wsl 版本

要查看Windows Subsystem for Linux (WSL) 的版本,您通常需要查看WSL的版本號以及正在運行的Linux發行版的版本。以下是檢查這兩個版本的方法: 1. 查看WSL的版本(WSL 1 或 WSL 2) 要檢查您的計算機上是否啟用了WSL 2&#xff0c…

如何錄制屏幕視頻?4款軟件,輕松錄屏

在數字化飛速發展的時代,如何錄制屏幕視頻已經成為我們工作、學習和娛樂中不可省略的一個重要問題。無論是制作教學教程還是錄制游戲視頻等,屏幕視頻錄制都為我們提供了極大的便利。今天,就讓我們一起探索如何錄制屏幕視頻的精彩方式&#xf…

多數據源配置導致注解Transactional失效

多數據源配置時,向事務管理器中注入數據源時可以直接注入DynamicRoutingDataSource而不要注入ItemDataSource類型,否則可能會出現事務失效問題。 其他事務失效問題參考: 注解Transaction踩坑指南 注解Transaction失效場景

Windows環境+C#實現顯示接口測試

代碼如下: using Models; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.Design; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; …

大模型“聚會”:國內卷價格,國外卷能力

[ GPT-4o和谷歌Gemini不斷宣傳現階段AI能力大幅度提高,那么這兩家,誰的大模型能力更強呢?這篇文章里,作者就展開了多維度的測試和體驗,想了解的同學,可以來看一下。 在中美AI大模型的競爭上,正衍…

從數據倉庫到數據湖(上):數據湖導論

文章目錄 一、什么是數據湖?起源數據湖的特征 二、為什么要用數據湖?三、數據湖與數據倉庫的區別數據倉庫和數據湖的對比 四、數據湖本質數據存儲架構數據處理工具:三類第一類工具第二類工具第三類工具 小結 五、總結六、參考資料 一、什么是…

[運維平臺]泛微運維平臺

運維平臺點擊登錄沒有反應,是因為H2數據庫損壞,H2數據庫在服務器異常重啟,磁盤滿等情況下容易損壞,請按照下面的步驟操作Linux: 運維平臺升級包https://www.weaver.com.cn/cs/monitorDownload.html 1)請停…

常見數據庫類型和選取詳解

數據庫是用于存儲、檢索和管理數據的系統。它們可以根據數據模型的不同被分類為不同類型。以下是一些常見的數據庫類型和它們的選取詳解: 1. 關系型數據庫(RDBMS) 特點: 使用表格(tables)來組織數據。基…

百日筑基第十六天-java多線程編程淺學一下4-各種線程池學習和使用

百日筑基第十六天-java多線程編程淺學一下4-各種線程池學習和使用 使用線程池 Java語言雖然內置了多線程支持,啟動一個新線程非常方便,但是,創建線程需要操作系統資源(線程資源,棧空間等),頻繁…

MQ四兄弟:如何保證消息順序性

在當今的分布式系統架構中,消息隊列(MQ)是不可或缺的組成部分。它們在確保系統組件之間高效通信方面發揮著關鍵作用。特別是在金融交易、物流跟蹤等對消息處理順序有嚴格要求的場景中,消息隊列的順序性保證顯得更為重要。接下來&a…

使用libguestfs掛載qcow2磁盤鏡像

掛載qcow2磁盤鏡像的第一種方法是使用 libguestfs,它提供了一系列工具來訪問和編輯 VM 磁盤鏡像。libguestfs 支持幾乎所有類型的磁盤鏡像,包括 qcow2。你可以像下面這樣,在Linux上安裝libguestfs工具集。 1、安裝guestmount工具 在基于 De…

主干網絡篇 | YOLOv5/v7 更換骨干網絡之 MobileNetV3 | 基于神經網絡搜索的輕量級網絡(2)

主干網絡篇 | YOLOv5/v7 更換骨干網絡之 MobileNetV3 | 基于神經網絡搜索的輕量級網絡 概述 YOLOv5和YOLOv7是目前主流的輕量級目標檢測模型,在速度和精度方面取得了良好的平衡。然而,傳統的YOLOv5/v7模型使用FPN和CSPNet等結構作為主干網絡&#xff0…

SMU Summer 2024 Contest Round 2

[ABC357C] Sierpinski carpet - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) 思路:通過因為圖形的生成過程是完全一樣的。可以通過遞歸,不斷分形。函數process(x,y,k)定義為以坐標(x,y)為左上角,填充sqrt3(k)級的地毯。 int n; int c[800][800]; 默認全為…

【雜說咋說】近年來國土空間規劃行業人員轉行分析

這幾年,國土空間規劃行業的人員流動引起了不少關注。我們可以從幾個方面來看這些變化: 考公務員 許多從事國土空間規劃的專業人員選擇了考公務員。這種選擇相對穩定,不需要熬夜加班,工作環境也更為舒適。尤其是進入國家機關或住…