如何在Rust中将genpdf生成的PDF发送到Response?

sdnqo3pr  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(97)

我在研究Rust,没有找到这个问题的答案。我正在尝试将生成的PDF发送给客户端,我使用时雄+ axum来生成API Rest和genpdf来生成PDF。我该怎么做?
这是我的代码:

async fn make_pdf() -> impl IntoResponse {
    let font_family = genpdf::fonts::from_files("./fonts", "Calibri", None)
        .expect("Failed to load font");
    let mut doc = genpdf::Document::new(font_family);
    doc.set_title("Test Title");
    let mut decorator = genpdf::SimplePageDecorator::new();
    decorator.set_margins(10);
    doc.set_page_decorator(decorator);

    doc.push(genpdf::elements::Text::new("First PDF Text"));

    let mut stream = Reade::new(doc.render(w).unwrap());

    let headers = HeaderMap::new();
    headers.insert(header::CONTENT_TYPE, "application/pdf; charset=utf-8".parse().unwrap());
    headers.insert(header::CONTENT_DISPOSITION, "attachment; filename=\"Cargo.pdf\"".parse().unwrap());

    let body = StreamBody::new(stream);

    Ok((headers, body))
}

我试着用时雄_util::io::ReaderStream进行流式传输,但它返回了一个错误。我真的不知道该怎么办

rkkpypqq

rkkpypqq1#

doc.render()的签名如下所示:

pub fn render(self, w: impl Write) -> Result<(), Error>

它期望一个参数来写入字节(通过std::io::Write trait),并且除了潜在的错误之外不会返回任何东西。最简单的方法是写入Vec<u8>,然后从Axum处理程序返回:

let mut pdf_bytes: Vec<u8> = Vec::new();
doc.render(&mut pdf_bytes).unwrap(); // TODO: handle error properly

// ... headers ...

Ok((headers, pdf_bytes))

注意:如果.render()需要很长时间才能运行,最好使用时雄的spawn_blocking来独立于async环境进行处理。注意:你的代码还有其他一些错误(在headers上没有mut,在返回impl IntoResponse时不清楚Ok),但我不会详细说明如何修复这些错误。

相关问题