我在研究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进行流式传输,但它返回了一个错误。我真的不知道该怎么办
1条答案
按热度按时间rkkpypqq1#
doc.render()
的签名如下所示:它期望一个参数来写入字节(通过
std::io::Write
trait),并且除了潜在的错误之外不会返回任何东西。最简单的方法是写入Vec<u8>
,然后从Axum处理程序返回:注意:如果
.render()
需要很长时间才能运行,最好使用时雄的spawn_blocking
来独立于async
环境进行处理。注意:你的代码还有其他一些错误(在headers
上没有mut
,在返回impl IntoResponse
时不清楚Ok
),但我不会详细说明如何修复这些错误。