#pdf #office #converter #server-port #load-balancing

office-to-pdf

将办公文件转换为PDF文件

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算法

Download history 131/week @ 2024-07-29 377/week @ 2024-08-12

508 每月下载量

MIT 许可证

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