- 浏览: 244592 次
文章分类
最新评论
-
bluky999:
中间的兼职例子很逗 哈哈哈
tornado: web.py 之 Application -
flingfox63:
学习了,详细,赞个
Ruby变量作用域的类目录结构 -
zhou6711411:
不知是版本问题还是怎么的
class A
...
Ruby变量作用域的类目录结构 -
t284299773:
你在方法中定义方法就相当于在方法中调用lambda!
Ruby变量作用域的类目录结构(补二) -
lnj888:
很是有用 不错Powerpoint converter
一个简单的link_to,ROR到底在背后做了些什么?(未完)
原文出处:http://www.thesatya.com/blog/2007/09/inkscaperailspdf.html
This HOWTO explains how, given your database, a PDF form, Ruby on Rails, plus a few other things, you can produce filled-out PDF documents. This assumes Debian/Ubuntu.
You will need a PNG to PNM convertor, an XSL transformer, Inkscape for producing and converting SVG files, and a PNG quantiser (optional).
Overview: The page layout template is produced as an SVG file in Inkscape, from an existing (blank) PDF. Inkscape is also used by Ruby on Rails (RoR) to convert the merged SVG into a PDF that is served to the user via the web.
First, get all the stuff besides Ruby on Rails and so on, stuff which isn't likely to be on your average Rails server:
apt-get install netpbm libxslt-ruby inkscape pngquant
(netpbm for pngtopnm)
Making the template
Convert the original PDF to PNM
pdf2ps | pstopnm or whatever
Open the PNM file in inkscape. This gets the right size of page.
Delete everything.
Create new layers: scan, trace, borders, boilerplate, dynamic
.
Set fonts to something ghostscript understands, like the URW family.
Import the PNM into the 'scan' layer. That is, keep the scan layer selected in the layers dialog, and then Import.
Select all, Path -> trace bitmap (long, memory intensive process starts)
Move the path to the 'trace' layer.
Delete the extra nodes, i.e. text etc. (long, memory-intensive process ends)
Put any extra "drawn" stuff you need into the 'borders' layer, such as empty checkboxes or borders that don't show up properly in 'trace'
In 'boilerplate', put all the text that won't change, i.e. what's always there.
In 'dynamic' layer, put placeholders for the fields. I'd insert as text the field name from the database, such as where the last name would normally go I'd put the actual string 'last_name'. This will later be replaced by XSL markup.
Save as SVG.
The SVG file is just XML. Fix the saved SVG file as an XSL stylesheet by adding these lines in a text editor:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/claim">
instead of claim, whatever the xml root node is, and close the tags at the bottom of the file.
Use xsl tags instead of the dynamic fields elements. The text 'last_name' becomes: <xsl:select name="last_name" />
or whatever the correct XPath is.
Transforming the template in RoR
Now you write the RoR methods to convert your data to PDF. Take the data from the database, convert it to XML, and "transform" the XML using the XSL stylesheet you created in the previous section. Then you will use Inkscape to convert the transformed XML into a (PNG, then a) PDF.
Get your XML and transform it with (Ruby). The following can probably be a method of your ActiveRecord model, say, to_pdf
:
xml_string=to_xml require 'xml/libxslt' xslt = XML::XSLT.new() xslt.xml = "string containing the xml" xslt.xsl = "your.xsl" xslt.save("/tmp/something.svg")
to_xml is another method that works something like this:
def to_xml buffer="" xm=Builder::XmlMarkup.new(buffer) xm.instruct! buffer += xm.report { xm.employee_name("#{employee_name}") %w(address1 address2 name).each do |col| xm.tag!('employer_'+col, employer.send(col)) end #and so on } return buffer end
Making the PDF
Back to your to_pdf method. Remember, stuff like #{id} in a string gets the current object's id:
fileprefix='/tmp/your_app_#{id}" inkscape="/usr/bin/inkscape #{fileprefix}.svg --export-background=#ffffff --export-png=#{fileprefix}.png" system(inkscape) system("pngquant 8 #{fileprefix}.png") system("pngtopnm #{fileprefix}-fs8.png | pnmtops | ps2pdf - > #{fileprefix}.pdf")Basically just a series of system() calls.
Then read the PDF in like so:
pdf_data = IO.read("#{fileprefix}.pdf")
You should save 'data' into the database. It's raw PDF code, so use a blob or other large binary type. When you create this column in the migration, use something like: add_column :table, :pdf_data, :binary, :limit => 512.kilobyte
If your PDF table is separate from your data table (may make things easier on the db engine), you probably want something like this:
if pdf_id.nil? pdfo=Pdf.new else pdfo=Pdf.find(pdf_id) end pdfo.data = IO.read("#{fileprefix}.pdf") pdfo.save update_attributes(:pdf_id => pdfo.id)where your table belongs_to :pdf and the pdfs table has_one :your_data_table
I also use a 'dirty' column, so anytime the controller's pdf method is hit, it checks the dirty bit; if set, it calls to_pdf on the object. Then it sends_data. Pseudo-code:
def add obj.dirty=true obj.save end def pdf obj=Model.find(id) obj.to_pdf if obj.dirty send_data(obj.pdf.data, :type => 'application/x-pdf', :filename => "something_#{obj.id}.pdf") end
Inkscape uses Gnome's VFS, which wants the user's home directory to be writeable. The user it runs as, that is. Now your RoR is probably running as a mongrel process, as www-data or something. So, create a user for running this app, call it inkscape-pdf-makr or something. Run mongrel as that user by putting USER=inkscape-pdf-makr in /etc/mongrel/sites-enabled/your-site.conf. Make sure the permissions on log/ and tmp/ are correct.
发表评论
-
(ZZ)Ror on svn
2007-12-20 19:34 1516正好需要,zz过来,抄袭自:http://www.surui. ... -
用GetText来进行ROR的国际化和本地化
2007-11-22 15:17 1445IBM developerWorks上的一篇文章,直接贴地址, ... -
advanced act_as_solr
2007-10-31 19:40 1789原文出处:http://www.quarkruby.com/2 ... -
act_as_solr
2007-10-31 19:39 1987原文出处:http://www.quarkruby.com/2 ... -
Ambition
2007-10-31 19:36 1366原文出处:http://railsontherun.com/2 ... -
给will_paginate加上ajax效果
2007-10-31 19:30 2157原文出处:http://railsontherun.com/2 ... -
使用rails制作图表
2007-10-31 19:21 2816原文出处:http://www.railsontherun.c ... -
如果定制attachment_fu上传文件的路径和文件名
2007-10-31 16:59 2749原文出处:http://the.railsi.st/2007/ ... -
attachment_fu使用指南
2007-10-31 16:56 3205原文出处:http://clarkware.com/cgi/b ... -
(ZZ)Cache in Rails
2007-09-25 15:49 1517很经典的文章,留在blog里面做个收藏 Ruby on Rai ... -
(ZZ)Ruby on Rails Security Guide
2007-09-24 21:28 2683Ruby on Rails Security Gui ... -
学到三招
2007-09-24 01:54 1397第一招:用ruby-debug来调试rails程序 具体使用方 ... -
一个action的process过程
2007-09-17 00:11 2552ruby 代码 def process(req ... -
在线查看rails代码和edge rails api的网址,备份,以免忘记
2007-09-14 18:38 1333Edge Rails API: http://caboo.se ... -
总是看到returning,这到底是个什么东东,查了一下找到了源代码
2007-09-14 18:37 1391A Ruby-ized realization of the ... -
一个简单的link_to,ROR到底在背后做了些什么?(未完)
2007-09-14 18:20 3464滥用link_to会造成ror程序 ... -
学到关于include的一点儿知识
2007-08-23 18:09 1167ruby 代码 module Test ... -
在一个controller中render另外一个controller中view的时候出现问题
2007-08-21 18:27 2155我想在posts这个controller中的show.rh ... -
因为Rjs试用NetBeans
2007-06-20 09:44 1130因为昨天看Rails Recipe的时候提到了rjs,于是四处 ...
相关推荐
本教程描述了 Inkscape的基本操作方法。本文档以 Inkscape的通用文件格式保,你可以用 Inkscape进行查看、复制、编辑、保存等操作。 该教程的主要内容包括:画布浏览、文档管理、形状工具基础,图形选取、变形,组、...
综上所述,这份Inkscape激光雕刻教程文件详细介绍了使用Inkscape软件结合激光雕刻插件进行雕刻项目的整个过程,从软件安装、插件应用、设计转换到最终雕刻的每一步操作,以及对应的技巧和提示。通过这份教程,初学者...
总结来说,这个资源包提供了一种将Inkscape与3D打印和CNC加工紧密结合的方式,通过G代码生成和实心填充插件,设计者可以直接在Inkscape中完成从概念设计到制造准备的全部工作。无论是对个人创作者还是专业工程师,这...
关于这两个插件的使用教程,PDF文档中应该包含详细的步骤和截图,指导用户如何安装插件,设置参数,以及在实际操作中遇到问题时的解决方案。这些教程对于初学者尤其有价值,因为它们提供了一个逐步学习和实践的框架...
本篇将详细讲解如何利用Inkscape生成G代码的插件以及实心填充插件,并提供使用教程。 首先,Inkscape生成G代码插件允许用户将设计的SVG路径转换为适合CNC切割或3D打印的G代码。这个插件通常适用于那些希望将...
通过这套全面的Inkscape教程,无论是初学者还是有经验的设计师,都能系统地提升自己的技能,掌握这款强大的矢量图形编辑软件。不断地实践和探索,将使你在创作道路上越走越远,实现无限的设计可能。
Inkscape主要分为七大章节,分别是: 基础、形状、高级、书法、描绘、要素、技巧和秘诀七章。
值得注意的是,在使用Inkscape的过程中,由于软件可能存在的稳定性问题,用户应养成频繁保存文档的习惯。 - **界面布局**:Inkscape的界面由工具栏、命令栏、工具控制栏和状态栏等部分组成。左侧是工具栏,集中了...
7. **导入与导出**:除了SVG,Inkscape还支持导入和导出多种格式,如PNG、JPEG、PDF、EPS等,方便与其他软件兼容。 8. **扩展插件**:Inkscape拥有活跃的开发者社区,提供许多扩展插件,可以增加更多功能,如符号库...
Inkscape是一款强大的开源矢量图形编辑工具,它在IT领域中被广泛使用,尤其对于设计师、艺术家和程序员来说,是必备的软件之一。这款软件支持Windows、Mac OS X和Linux等多种操作系统,实现了真正的跨平台体验。...
6. **导出和导入**:Inkscape可以导出为多种格式,包括SVG、PDF、EPS、PNG等,便于在其他应用程序中使用。同时,它也可以导入许多格式的文件,如JPEG、PNG等,以便于编辑和复用。 7. **扩展和脚本**:Inkscape具有...
在LaTeX中使用SVG图像时,我们可以先用Inkscape打开SVG文件,然后将其导出为PDF+LaTeX格式。导出时,Inkscape会生成一个PDF文件和一个包含图像位置和大小信息的TeX文件,这两个文件可以与LaTeX文档合并。 ...
8. **导出和导入**:学习将Inkscape作品导出为其他格式,如PNG、PDF或EPS,以及如何导入外部图像和图形。 9. **模板和样式**:了解如何使用模板和样式库来快速统一设计元素的外观,提高工作效率。 10. **实例项目*...
4. **导出高质量图像**:Inkscape支持多种导出格式,包括SVG、PDF、PNG等,方便在各种场合下使用。 总的来说,Inkscape Portable 0.48是一款强大的工具,尤其是对于那些需要在图形设计中频繁使用数学公式的用户。它...
DEV Inkscape x64 V0.91 便携版是一款专为64位操作系统设计的图形编辑软件,提供了一种便捷的方式来处理矢量图形。Inkscape是一款开源的图形设计工具,它允许用户创建、编辑和导出SVG(Scalable Vector Graphics)...
Inkscape支持导入和导出多种矢量图格式,如SVG、EPS、PDF等,同时也能够处理位图文件,如JPEG、PNG等,并将其转换为矢量图。 在雕刻领域,Inkscape是一个不可或缺的工具。通过其内置的功能或配合外部插件,用户可以...
在提供的压缩包中,有`inkscape-0.92.3-x86.exe`是Inkscape的安装程序,适用于32位Windows系统;`下载说明.htm`可能包含了下载和安装的步骤或注意事项;`使用说明.txt`是Inkscape的基本操作指南;`使用帮助(河东软件...
该程序包首先将文本与图形分开,然后使用Inkscape将SVG图形转换为PDF。 文本存储在扩展名为.pdf_tex的LaTeX文件中。 SVG转换为PDF,文本包含在PDF中。 该软件包使用Inkscape将整个SVG转换为PDF。 仅当PDF文件早于...
这款软件致力于为用户提供专业强大的矢量图编程服务,界面清爽直观,拥有丰富的功能模块,内置多个实用的形状工具,能够为用户提供人性化的操作,支持SVG、AI、PDF等多种格式图片的导入,应用十分广泛。
构造函数可以选择使用inkscape二进制文件的命令行选项数组: var Inkscape = require ( 'inkscape' ) , svgToPdfConverter = new Inkscape ( [ '--export-pdf' , '--export-width=1024' ] ) ; sourceStream . ...