我是相对较新的编程在铁 rust 和需要一点方向就如何实现我的项目。
目前,我正在尝试建立一个CLI工具,需要一个人的名字,他们也申请的位置,他们也申请的公司和该公司的位置,并自动魔术格式的PDF与他们的求职信的内容。最终,我想把这个变成一个GUI工具,我可以发送给我的朋友,让他们可以在他们的windows/mac机器上使用它。
现在的问题是我使用的“Printpdf”板条箱来生成文档本身.正如你可以看到与下面的图片,文本不自动 Package /line-break/format当它到达行的末尾.不幸的是,我不能简单地打破这到不同的字符串变量作为程序需要能够添加任意用户输入和返回一个完美格式化的PDF文件.
我该如何设置这份文档的格式?我应该使用一个不是“printpdf”的板条箱吗?或者我可以使用其他的东西来让文本按照我想要的方式表现吗?
下面是rust代码和PDF输出的图片。
use std::io;
use printpdf::*;
use std::fs::File;
use std::io::BufWriter;
fn main() {
println!("Enter: Position");
let mut position = String::new();
io:: stdin()
.read_line(&mut position)
.expect("failed to read");
println!("Enter: Company Name");
let mut coname = String::new();
io:: stdin()
.read_line(&mut coname)
.expect("failed to read");
println!("Enter: Company Location");
let mut location = String::new();
io:: stdin()
.read_line(&mut location)
.expect("failed to read");
let ntxt = " ";
let sample = "This is some random Sample text, This text should eventaully be a user input. Currently, this text is not a user input. this text is supposed to be a text of long string data that will eventually be added to the document via user input";
let (doc, page1, layer1) = PdfDocument::new("PDF_Document_title", Mm(216.0), Mm(279.0), "Layer 1");
let current_layer = doc.get_page(page1).get_layer(layer1);
let font = doc.add_external_font(File::open("./fonts/TNR-Regular.ttf").unwrap()).unwrap();
current_layer.use_text(position.clone(), 14.0, Mm(25.0), Mm(250.0), &font);
current_layer.use_text(coname.clone(), 14.0, Mm(25.0), Mm(240.0), &font);
current_layer.use_text(location.clone(), 14.0, Mm(25.0), Mm(230.0), &font);
current_layer.use_text(ntxt.clone(), 14.0, Mm(25.0), Mm(220.0), &font);
current_layer.begin_text_section();
current_layer.set_font(&font, 14.0);
current_layer.set_text_cursor(Mm(25.0), Mm(210.0));
// write one line, but write text2 in superscript
current_layer.write_text(sample.clone(), &font);
current_layer.end_text_section();
doc.save(&mut BufWriter::new(File::create("test_working.pdf").unwrap())).unwrap();
}
the pdf output
我真的不知道从哪里开始解决这个问题。
我试着看了“textwrap”的文档,但它对我来说也是一个谜,我也看了“printpdf”的文档,但它说它不支持格式和对齐。
1条答案
按热度按时间yhuiod9q1#
也许有一个更理智的方法来做到这一点,但这是有效的:
1.我们将
font_data
作为字节向量Vec<u8>
加载;然后,X1 E0 F1 X和X1 E1 F1 X都独立地将该字体作为字节片X1 M4 N1 X来使用。1.我们使用
glyph_brush_layout
来计算字形 * 的位置(我只是修改了README中的示例),具体来说就是在160 mm宽的框中获得y
的垂直位置。1.我们将这些符号分组在
y
位置(它们是每行文本基线的垂直位置),沿着它们在文本中的索引(其中text =sample
)。1.我们只取每组中的第一个字形(
group.next().unwrap().0
),得到它的索引(和y位置)。这些索引是我们将文本分成单独行的位置。这些索引被收集到一个Vector中。1.我们在Vector上循环,将文本写入PDF。为了分割文本,我们创建了一个可查看的迭代器,这样我们就可以将文本切片
sample
作为当前索引和下一个(查看的)索引。由于printpdf
和glyph_brush_layout
处理布局的方式不同,我们需要做一些垂直偏移和转换。assert_eq!(glyphs.len(), sample.chars().count());
。如果不是这样,也许你应该考虑一次直接定位一个字形。main.rs
cargo.toml