国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

.NET Core 使用 LibreOffice 實現(xiàn) Office 預覽(Docker 部署)

開發(fā) 架構(gòu)
目前在做的零代碼產(chǎn)品中的表單附件控件,同樣面臨著 Office 文件預覽的問題,現(xiàn)在技術(shù)棧采用了 .NET Core ,并使用容器化部署,自然就拋棄了 OWA 的方案。

前些年做云盤產(chǎn)品的時候,一個很核心的功能就是 Office 文件預覽,當時還沒有使用 .NET Core ,程序部署在 Windows Server 服務器上,文件預覽的方案采用了微軟的 OWA 。

目前在做的零代碼產(chǎn)品中的表單附件控件,同樣面臨著 Office 文件預覽的問題,現(xiàn)在技術(shù)棧采用了 .NET Core ,并使用容器化部署,自然就拋棄了 OWA 的方案。

本文簡單介紹下 OWA 的替代方案。

思路

  1. 在表單的附件控件上傳 Office 文件后,存儲到 MongoDB 中,并發(fā)消息給文件轉(zhuǎn)換程序。
  2. 文件轉(zhuǎn)換程序從 MongoDB 獲取 Office 文件,通過 Libreoffice 轉(zhuǎn)換為 PDF 文件。
  3. 將 PDF 文件存儲到 MongoDB 中,并將 PDF 文件在 MongoDB 中的 FileID 存儲到平臺和原始文件進行關(guān)聯(lián)。
  4. 在表單中點擊文件預覽時使用關(guān)聯(lián)的 PDF 的文件 ID 從 MongoDB 中獲取 PDF 文件進行展示。

準備

1、創(chuàng)建一個 .NET Core 的控制臺程序用來做文件的轉(zhuǎn)換。

2、下載 Libreoffice 安裝包、Libreoffice 中文語言包、jdk1.8 安裝包 、中文字體包。

圖片

3、搭建一臺 centos 虛擬機,并準備好 docker 環(huán)境。

版本

  • .NET Core:3.1
  • CentOS:7.6
  • Docker:
  • Liberoffice:7.3.5
  • RabbitMQ:3.8.2
  • MongoDB:5.0

開始

編寫控制臺程序進行文件轉(zhuǎn)換

1、創(chuàng)建一個名為 OfficeToPdf 的 .NET Core 控制臺程序,在 Main 方法中對消息隊列進行監(jiān)聽。

static void Main(string[] args)  
{
try
{
var mqManager = new MQManager(new MQConfig
{
AutomaticRecoveryEnabled = true,
HeartBeat = 60,
NetworkRecoveryInterval = new TimeSpan(60),
Host = EnvironmentHelper.GetEnvValue("MQHostName"),
UserName = EnvironmentHelper.GetEnvValue("MQUserName"),
Password = EnvironmentHelper.GetEnvValue("MQPassword"),
Port = EnvironmentHelper.GetEnvValue("MQPort")
});
if (mqManager.Connected)
{
_logger.Log(LogLevel.Info, "RabbitMQ連接成功。");
_logger.Log(LogLevel.Info, "RabbitMQ消息接收中...");

mqManager.Subscribe<PowerPointConvertMessage>(Convert);
mqManager.Subscribe<WordConvertMessage>(Convert);
mqManager.Subscribe<ExcelConvertMessage>(Convert);
}
else
{
_logger.Warn("RabbitMQ連接初始化失敗,請檢查連接。");
Console.ReadLine();
}
}catch(Exception ex)
{
_logger.Error(ex.Message);
}
}

2、在 Convert 方法中對消息進行處理,首先根據(jù)消息的中的文件 ID 獲取文件:

Stream sourceStream = fileOperation.GetFile(officeMessage.FileInfo.FileId);  
if(sourceStream == null)
{
logger.Log(LogLevel.Error, $"文件ID:{officeMessage.FileInfo.FileId},不存在");
}
string filename = officeMessage.FileInfo.FileId;
string extension = System.IO.Path.GetExtension(officeMessage.FileInfo.FileName);
sourcePath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), filename + extension);
destPath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), string.Format("{0}.pdf", filename));
logger.Log(LogLevel.Info, $"文件原路徑:{sourcePath}");
logger.Log(LogLevel.Info, $"文件目標路徑:{destPath}");
if (extension != null && (extension.Equals(".xlsx",StringComparison.OrdinalIgnoreCase) ||
extension.Equals(".xls", StringComparison.OrdinalIgnoreCase)))
{
if (!SetExcelScale(sourceStream, sourcePath))
return false;
}
else
{
byte[] sourceBuffer = new Byte[sourceStream.Length];
sourceStream.Read(sourceBuffer, 0, sourceBuffer.Length);
sourceStream.Seek(0, SeekOrigin.Begin);
if (!SaveToFile(sourceBuffer, sourcePath))
return false;
}

3、啟用 LibreOffice 進行文件轉(zhuǎn)換:

var psi = new ProcessStartInfo(  
"libreoffice7.3",
string.Format("--invisible --convert-to pdf {0}", filename + extension))
{RedirectStandardOutput = true};
// 啟動
var proc = Process.Start(psi);
if (proc == null)
{
logger.Error("請檢查 LibreOffice 是否成功安裝.");
return false;
}
logger.Log(LogLevel.Info, "文件轉(zhuǎn)換開始......");
using (var sr = proc.StandardOutput)
{
while (!sr.EndOfStream)
{ Console.WriteLine(sr.ReadLine());
} if (!proc.HasExited)
{ proc.Kill();
}}

logger.Log(LogLevel.Info, "文件轉(zhuǎn)成完成");

4、文件轉(zhuǎn)換成功后,存儲轉(zhuǎn)換后的 PDF 文件到 MongoDB,然后和原始文件進行關(guān)聯(lián),下面代碼是調(diào)用了零代碼平臺中的接口進行處理,這里可以根據(jù)自己的業(yè)務需求自行修改 :

string host = EnvironmentHelper.GetEnvValue("ApiHost");  
string api = EnvironmentHelper.GetEnvValue("AssociationApi");
if (string.IsNullOrEmpty(api))
{
logger.Warn("請檢查 AssociationApi 環(huán)境變量的配置");
return false;
}
if (string.IsNullOrEmpty(host))
{
logger.Warn("請檢查 ApiHost 環(huán)境變量的配置");
return false;
}
string result = APIHelper.RunApiGet(host, $"{api}/{fileId}/{destFileId}");

構(gòu)建 Libreoffice 基礎(chǔ)鏡像

1、在 centos 服務器上 /data 目錄中創(chuàng)建目錄 liberoffice-docker-build ,將上面提到的 Libreoffice 安裝包、Libreoffice 中文語言包、jdk1.8 安裝包 、中文字體包拷貝到該目錄中。

2、在該目錄中創(chuàng)建 Dockerfile 文件,內(nèi)容如下:

RUN yum update -y && \
yum reinstall -y glibc-common && \
yum install -y telnet net-tools && \
yum clean all && \
rm -rf /tmp/* rm -rf /var/cache/yum/* && \
localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#加入windows字體包
ADD chinese.tar.gz /usr/share/fonts/
ADD LibreOffice_7.3.5_Linux_x86-64_rpm.tar.gz /home/
ADD LibreOffice_7.3.5_Linux_x86-64_rpm_langpack_zh-CN.tar.gz /usr/
#執(zhí)行安裝
RUN cd /home/LibreOffice_7.3.5.2_Linux_x86-64_rpm/RPMS/ \
&& yum localinstall *.rpm -y \
&& cd /usr/LibreOffice_7.3.5.2_Linux_x86-64_rpm_langpack_zh-CN/RPMS/ \
&& yum localinstall *.rpm -y \
#安裝依賴
&& yum install ibus -y \
#加入中文字體支持并賦權(quán)限
&& cd /usr/share/fonts/ \
&& chmod -R 755 /usr/share/fonts \
&& yum install mkfontscale -y \
&& mkfontscale \
&& yum install fontconfig -y \
&& mkfontdir \
&& fc-cache -fv \
&& mkdir /usr/local/java/ \
#清理緩存,減少鏡像大小
&& yum clean all
#安裝java環(huán)境
ADD jdk-8u341-linux-x64.tar.gz /usr/local/java/
RUN ln -s /usr/local/java/jdk1.8.0_314 /usr/local/java/jdk
#配置環(huán)境變量
ENV JAVA_HOME /usr/local/java/jdk
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH ${JAVA_HOME}/bin:$PATH
#安裝 dotnet core 3.1 運行環(huán)境
RUN rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm \
&& yum install -y aspnetcore-runtime-3.1 \
&& yum clean all
WORKDIR /usr
EXPOSE 80
CMD /bin/bash

3、執(zhí)行命令 docker build -t libreofficebase:v1.0 . 進行基礎(chǔ)鏡像的構(gòu)建,構(gòu)建好的基礎(chǔ)鏡像供文件預覽鏡像構(gòu)建時使用。

構(gòu)建文件預覽鏡像

1、在 centos 服務器的 /data 目錄中創(chuàng)建目錄 doc-preview-docker-build 。

2、將轉(zhuǎn)換程序 OfficeToPdf 進行編譯發(fā)布,將發(fā)布后的文件拷貝到目錄 doc-preview-docker-build 中。

3、在該目錄中創(chuàng)建 Dockerfile 文件,內(nèi)容如下:

FROM libreofficebase:v1 #此處的鏡像就是上面構(gòu)建的 Libreoffice 基礎(chǔ)鏡像
COPY . /app
WORKDIR /app
EXPOSE 80/tcp
ENTRYPOINT ["dotnet", "OfficeToPdf.dll"]

4、執(zhí)行命令 docker build -t office-preview:v1.0 . 進行預覽鏡像的構(gòu)建。

運行預覽容器

執(zhí)行下面命令進行容器的創(chuàng)建:

docker run -d --name office-preview office-preview

最后

Office 預覽肯定有很多種方案,上面只是目前找到的一種可行的方法。

責任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2016-12-06 10:23:24

.NETCore首例Office

2022-03-30 14:23:48

LibreOfficOffice開源

2022-02-21 12:05:49

LibreOffiLinux工具欄

2024-06-27 10:48:48

2017-09-25 07:58:20

DockerNet Core2.0均衡

2016-11-21 15:13:19

LinuxDocker.NET Core

2024-11-12 07:28:39

2021-11-14 07:34:57

.NETEventCounte性能

2024-05-10 07:31:32

IIS應用程序.NET Core

2024-11-28 08:57:21

分布式鏈路Skywalking

2012-07-17 10:17:13

Office 2013微軟

2023-08-08 10:23:34

2024-06-12 07:48:24

C#WebService.NET

2025-01-10 00:41:38

版本控制API

2024-05-31 13:07:29

.NET Core定時任務編程

2025-01-02 15:16:26

Docker容器云計算

2021-02-28 20:56:37

NCache緩存框架

2021-01-31 22:56:50

FromServiceASP

2021-03-10 09:40:43

LamarASP容器

2021-01-07 07:39:07

工具接口 Swagger
點贊
收藏

51CTO技術(shù)棧公眾號

成人黄网大全在线观看| 91精品国产高清一区二区三区 | 日韩国产欧美区| 一本久道久久综合狠狠爱| 成人免费在线观看| 欧美激情视频一区二区三区| 69精品人人人人| 日本成人在线一区| 成人软件在线观看| 分分操这里只有精品| 欧美乱大交xxxxx| 中文字幕一区在线| 91精品国产麻豆国产在线观看| freemovies性欧美| 四虎永久在线精品免费一区二区| 亚洲精品一区av在线播放| www.亚洲激情.com| 久久久久97| 欧美日韩国产综合视频| 日韩免费电影一区二区三区| 一区二区中文字幕| 国产精品福利影院| 激情综合电影网| xxxxxx欧美| 日本超碰在线观看| 福利视频一区二区三区| 亚洲女人被黑人巨大进入al| 国产精品久久久久久久久免费桃花| 欧美疯狂party性派对| 欧洲在线视频| 国产xxxxx在线观看| 91精品中文在线| 亚洲国产日韩欧美在线图片| 久久婷婷综合激情| 欧美一区二区| av在线不卡精品| 在线免费视频你懂得| 亚洲一区三区| 久久人人97超碰精品888 | 日韩美女中文字幕| 欧美在线不卡一区| 国产精品一二三在| 精品产国自在拍| ririsao久久精品一区| www.99热.com| 日韩电影天堂视频一区二区| 海角国产乱辈乱精品视频| 欧美精品一二三区| 国产精品丝袜在线| 丝袜亚洲精品中文字幕一区| 97精品久久| 在线观看中文字幕的网站| 在线观看av日韩| 欧美日韩一区综合| 91爱爱小视频k| 欧美变态tickle挠乳网站| 欧美激情综合在线| 国产欧美午夜| 国内视频在线精品| 国产激情小视频在线| xxxx一级片| 日本一区高清不卡| 欧洲精品久久久| 日韩av在线资源| 欧美日韩国产精品一区| 不卡av电影在线播放| 中文一区一区三区免费在线观看| 天堂久久午夜av| 成年人视频免费在线观看| 日本激情视频在线| 亚洲蜜桃av| 91久久嫩草影院一区二区| 日韩中文字幕在线播放| 欧美日韩在线一区二区| 日本一区二区三区dvd视频在线| 久久激情一区| 欧美h版在线| 亚洲一区二区三区免费| 国产丝袜在线播放| 日本在线一二三| 亚洲天堂网一区| 四虎影院一区二区| 99r国产精品视频| 午夜美女久久久久爽久久| 亚洲精品久久久久久久久| 色综合网站在线| 日本一区二区成人在线| 狠狠色综合日日| 亚洲韩日在线| 欧美色就是色| 日韩三级精品| 日韩天堂在线| av剧情在线观看| 免费网站黄在线观看| 在线播放中文字幕| 美女xx视频| 激情婷婷综合网| 欧美日韩中文字幕在线播放 | 欧美一区二区三区的| 亚洲成av人片在线观看无码| 欧美国产精品劲爆| 成人综合婷婷国产精品久久蜜臀| 免费欧美在线| 亚洲国内精品| 欧美福利视频| 国产电影一区二区在线观看| 久久91在线| 4438全国亚洲精品观看视频| 国产精品久久乐| 欧美日韩视频网站| 182在线视频观看| 国产丝袜视频在线播放| av片在线观看永久免费| 秋霞成人影院| av电影在线播放高清免费观看| 午夜亚洲成人| 三级在线电影| 毛片网站在线观看| 亚洲kkk444kkk在线观看| 黄色污网站在线免费观看| 成人在线看片网站| 亚洲性图一区二区| 各处沟厕大尺度偷拍女厕嘘嘘| 大地资源网在线观看免费官网| 亚洲bbw性色大片| 精品国产aⅴ麻豆| 国产原创精品| 久久亚洲精品欧美| 欧美成ee人免费视频| 97se国产在线视频| 国产淫片在线观看| 成人免费视频一区二区| 77777亚洲午夜久久多人| 日韩精品成人av| 欧美日韩三级| 这里只有精品丝袜| 大地资源网在线观看免费官网| 天堂а√在线资源在线| 久国产精品韩国三级视频| 精品一区二区电影| 黑人另类av| 女子免费在线观看视频www| 看电视剧不卡顿的网站| 久久视频中文字幕| 精品电影在线| 国产拍揄自揄精品视频麻豆 | 欧美一卡二卡三卡四卡| 在线免费av播放| 久久久久久网| 久久久久久久久亚洲| 日本精品在线一区| 亚洲第一成人在线| 亚洲啊啊啊啊啊| 99精品视频免费观看视频| 日韩一区二区三区国产| 麻豆最新免费在线视频| 樱花草国产18久久久久| 欧美jiizzhd精品欧美| 免费高清视频精品| 国内精品伊人久久| www.成人.com| 国产成人免费视频网站| 2021久久精品国产99国产精品| 国产色婷婷在线| 性久久久久久久久| 日本久久电影网| 欧美精品一区二区三区蜜桃| 在线观看视频亚洲| 77777少妇光屁股久久一区| 亚洲在线免费看| 欧洲精品亚洲精品| 秋霞无码一区二区| 日本粉色视频在线观看| 午夜激情视频在线观看| 电影一区二区三| 妖精视频一区二区三区免费观看| 国产一区视频在线观看免费| 国产综合色在线视频区| 国产精品国产三级国产| 欧美专区日韩专区| 国产偷国产偷亚洲清高网站| 97国产精品人人爽人人做| 国产精品精品软件视频| 超碰人人爱人人| 日本调教视频在线观看| av片在线观看网站| 韩国三级成人在线| 91青青国产在线观看精品| 免费欧美在线视频| 国产精品久久久99| 欧美日韩成人在线一区| 日韩中文在线中文网三级| 国产日本欧美一区二区三区在线| 亚洲高清视频一区二区| 成人免费看黄网址| a级影片在线| 欧美午夜18电影| 日韩成人精品在线| 亚洲同性同志一二三专区| 日韩欧美精品三级|