我想生成一个带有我们部门徽标的PDF。当我尝试在我的控制器中使用WickedPdf类时(使用https://github.com/mileszs/wicked_pdf中描述的方法):
def some_action
image_tag_string = image_tag('logo.jpg')
pdf = WickedPdf.new.pdf_from_string(image_tag_string)
save_path = Rails.root.join('testpdfs','logotest.pdf')
File.open(save_path, 'wb') do |file|
file << pdf
end
end
...应用程序将PDF保存到目标目录,但它有一个蓝白色的'?'标记图像的位置。
如果我改为:
image_tag_string = wicked_pdf_image_tag('logo.jpg')
pdf = WickedPdf.new.pdf_from_string(image_tag_string)
我收到以下错误:
NoMethodError:
undefined method `wicked_pdf_image_tag' for #<...
看来我的Rails应用程序也缺少/没有链接到属于wicked-pdf gem的帮助文件。
StackOverflow上类似问题的答案建议编写自定义“图像标记”助手来定位图像或安装wkhtmltopdf。对我来说,当放置在View(whatever.html.erb)中时,image-tag显示徽标就好了。 “logo.jpg”已经位于资产管道和#{RailsRoot} / public / images中。最后,我在Ubuntu 14.04上使用wkhtmltopdf 0.9.9,wicked-pdf 0.11.0和rails 4。
简而言之 - 我做错了什么导致WickedPDF无法渲染图像?
答案 0 :(得分:14)
首先创建一个pdf模板来渲染和使用该模板中的wicked_pdf标签。 例如 -
应用程序/视图/布局/ application.pdf.erb -
<!doctype html>
<html>
<head>
<meta charset='utf-8' />
</head>
<body onload='number_pages'>
<div id="content">
<%= yield %>
</div>
</body>
</html>
应用程序/视图/ PDF / pdf_view.pdf.erb -
<div>
<%= wicked_pdf_image_tag 'logo.jpg' %>
</div>
使用此模板
def save
pdf = WickedPdf.new.pdf_from_string(
render_to_string(
template: 'example/pdf_view.pdf.erb',
layout: 'layouts/application.pdf.erb'))
send_data(pdf,
filename: 'file_name.pdf',
type: 'application/pdf',
disposition: 'attachment')
end
这可能对你有帮助..
答案 1 :(得分:0)
我从“ https”转换为“ http”的图片网址。比工作。
public static String message() {
//Asks the user for the number of lines in the message
Scanner lines = new Scanner(System.in);
System.out.print("Enter how number of lines in the message: ");
//if user doesn't enter a number, it keeps asking for one
while(!lines.hasNextInt()) {
System.out.print("Error! Please Choose a Number:");
lines.next();
}
//the number of lines is stores in an array where each index is a line
String[] input = new String[lines.nextInt()];
System.out.println("Enter the message: ");
lines.nextLine(); //consuming the <enter> from input above
//each index is given a line to store
for (int i = 0; i < input.length; i++) {
input[i] = lines.nextLine();
}
//message if turned into a one line string and returned
String message = (Arrays.toString(input).replaceAll("\\W", "")).toLowerCase();
return message;
}