4个版本
0.2.2 | 2024年8月16日 |
---|---|
0.2.1 | 2024年8月15日 |
0.2.0 | 2024年8月15日 |
0.1.0 | 2024年7月31日 |
316 在 算法 中
508 每月下载量
53KB
618 行
包含 (Cab文件,9KB) samples/sample-xlsx-encrypted.xlsx,(Cab文件,9KB) samples/sample-docx-encrypted.docx
Office To PDF
将办公文件转换为PDF文件
此库是围绕unoserver的Rust包装器,它使用LibreOffice将办公文件转换为PDF。
支持处理远程unoserver实例和多个unoserver实例之间的流量负载均衡
[!IMPORTANT] 仅支持Linux目标
安装
安装LibreOffice、Python 3和Python 3 pip(适用于Debian的命令,apt软件包管理器。根据您的发行版进行调整)
sudo apt-get install -y libreoffice python3 python3-pip
安装unoserver pip模块
sudo pip install unoserver
unoserver
必须位于您的路径中,如果您想启动服务器 unoconvert
必须位于您的路径中,如果您想转换文件
在安装unoserver后,两者都应该位于您的路径中。
启动服务器实例
您可以使用以下代码启动unoserver
use office_to_pdf::{start_unoserver, ConvertServer, ConvertLoadBalancer, ConvertServerHost};
use std::time::Duration;
// Create the server
let server = ConvertServer::new(ConvertServerHost::Local { port: 2003 });
// Check the server isn't already running
if server.is_running(ConvertServer::DEFAULT_RUNNING_TIMEOUT).await {
// Start the server (The second port must be unique and not in use, its used by libreoffice)
start_unoserver(2003, 2002).await.unwrap();
}
由于这个原因,如果您使用此作为长时间运行的服务器,建议您将unoserver作为后台OS服务运行。
默认服务器
默认示例将使用默认服务器端口(2003)
use office_to_pdf::ConvertServer;
let input_bytes = &[/* YOUR INPUT BYTES */]
let output = ConvertServer::default()
.convert_to_pdf(input_bytes)
.await
.unwrap();
[!INFO] 您必须同时运行unoserver,以便此功能正常工作。
或者您可以使用上面的命令启动一个
自定义本地服务器端口
您可以使用以下方法为本地服务器指定自定义端口
use office_to_pdf::{ConvertServer, ConvertServerHost};
let input_bytes = &[/* YOUR INPUT BYTES */]
let output = ConvertServer::new(ConvertServerHost::Local { port: 5000 })
.convert_to_pdf(input_bytes)
.await
.unwrap();
远程unoserver
您可以使用以下方法指定远程服务器
use office_to_pdf::{ConvertServer, ConvertServerHost};
let input_bytes = &[/* YOUR INPUT BYTES */]
let output = ConvertServer::new(ConvertServerHost::Remote {
host: "10.0.2.1".to_string(),
port: 5000,
})
.convert_to_pdf(input_bytes)
.await
.unwrap();
负载均衡
转换大文件可能会在一段时间内阻塞unoserver
。您可以运行多个unoserver
实例,并使用负载均衡器在各个服务器之间分配负载。
将检查服务器是否忙碌,并使用下一个空闲服务器
use office_to_pdf::{ConvertServer, ConvertLoadBalancer, ConvertServerHost};
use std::time::Duration;
use tokio::task::JoinSet;
let pool = ConvertLoadBalancer::new(
// Available servers
vec![
ConvertServer::new(ConvertServerHost::Remote {
host: "localhost".to_string(),
port: 9250,
}),
ConvertServer::new(ConvertServerHost::Remote {
host: "localhost".to_string(),
port: 9251,
}),
ConvertServer::new(ConvertServerHost::Remote {
host: "localhost".to_string(),
port: 9252,
}),
ConvertServer::new(ConvertServerHost::Remote {
host: "localhost".to_string(),
port: 9253,
}),
ConvertServer::new(ConvertServerHost::Remote {
host: "localhost".to_string(),
port: 9254,
}),
],
// Maximum connect timeout
Duration::from_millis(200),
// Busy check timeout (Time allowed for a response before server is considered busy)
Duration::from_millis(500),
);
let mut join_set = JoinSet::new();
// Sample test to spawn 50 conversions distributed amongst the servers
for _ in 0..50 {
let pool = pool.clone();
join_set.spawn(async move {
let input_bytes = &[ /* YOUR INPUT BYTES */ ];
pool.handle(input_bytes).await.unwrap();
});
}
while (join_set.join_next().await).is_some() {}
检查可转换性
您可以使用以下方法检查是否支持将MIME类型转换为以下内容
use office_to_pdf::is_known_convertable;
let mime = "text/plain";
let is_convertable = is_known_convertable(mime);
依赖关系
~3–9.5MB
估算值:~80K SLoC