`

使用Inkscape提供自己的pdf服务

    博客分类:
  • 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.

分享到:
评论

相关推荐

    inkscape教程中文版.pdf

    本教程描述了 Inkscape的基本操作方法。本文档以 Inkscape的通用文件格式保,你可以用 Inkscape进行查看、复制、编辑、保存等操作。 该教程的主要内容包括:画布浏览、文档管理、形状工具基础,图形选取、变形,组、...

    Inkscape激光雕刻教程.pdf

    综上所述,这份Inkscape激光雕刻教程文件详细介绍了使用Inkscape软件结合激光雕刻插件进行雕刻项目的整个过程,从软件安装、插件应用、设计转换到最终雕刻的每一步操作,以及对应的技巧和提示。通过这份教程,初学者...

    inkscape生成代码插件,inkscape实心填充插件,以及插件使用教程_

    总结来说,这个资源包提供了一种将Inkscape与3D打印和CNC加工紧密结合的方式,通过G代码生成和实心填充插件,设计者可以直接在Inkscape中完成从概念设计到制造准备的全部工作。无论是对个人创作者还是专业工程师,这...

    inkscape生成G代码的插件,inkscape实心填充插件,以及插件的使用教程

    关于这两个插件的使用教程,PDF文档中应该包含详细的步骤和截图,指导用户如何安装插件,设置参数,以及在实际操作中遇到问题时的解决方案。这些教程对于初学者尤其有价值,因为它们提供了一个逐步学习和实践的框架...

    inkscape生成G代码插件,inkscape实心填充插件,以及插件使用教程

    本篇将详细讲解如何利用Inkscape生成G代码的插件以及实心填充插件,并提供使用教程。 首先,Inkscape生成G代码插件允许用户将设计的SVG路径转换为适合CNC切割或3D打印的G代码。这个插件通常适用于那些希望将...

    Inkscape教程

    通过这套全面的Inkscape教程,无论是初学者还是有经验的设计师,都能系统地提升自己的技能,掌握这款强大的矢量图形编辑软件。不断地实践和探索,将使你在创作道路上越走越远,实现无限的设计可能。

    inkScape中文教程 类似CoreDraw Illustrator .pdf

    Inkscape主要分为七大章节,分别是: 基础、形状、高级、书法、描绘、要素、技巧和秘诀七章。

    Inkscape_tutorial_中文指南

    值得注意的是,在使用Inkscape的过程中,由于软件可能存在的稳定性问题,用户应养成频繁保存文档的习惯。 - **界面布局**:Inkscape的界面由工具栏、命令栏、工具控制栏和状态栏等部分组成。左侧是工具栏,集中了...

    Inkscape矢量绘图工具.rar

    7. **导入与导出**:除了SVG,Inkscape还支持导入和导出多种格式,如PNG、JPEG、PDF、EPS等,方便与其他软件兼容。 8. **扩展插件**:Inkscape拥有活跃的开发者社区,提供许多扩展插件,可以增加更多功能,如符号库...

    Inkscape 1.0 win64 版

    Inkscape是一款强大的开源矢量图形编辑工具,它在IT领域中被广泛使用,尤其对于设计师、艺术家和程序员来说,是必备的软件之一。这款软件支持Windows、Mac OS X和Linux等多种操作系统,实现了真正的跨平台体验。...

    Inkscape矢量图绘制工具

    6. **导出和导入**:Inkscape可以导出为多种格式,包括SVG、PDF、EPS、PNG等,便于在其他应用程序中使用。同时,它也可以导入许多格式的文件,如JPEG、PNG等,以便于编辑和复用。 7. **扩展和脚本**:Inkscape具有...

    svg:使用Inkscape,ImageMagick和/或Ghostscript处理LaTeX文档中的SVG图片

    在LaTeX中使用SVG图像时,我们可以先用Inkscape打开SVG文件,然后将其导出为PDF+LaTeX格式。导出时,Inkscape会生成一个PDF文件和一个包含图像位置和大小信息的TeX文件,这两个文件可以与LaTeX文档合并。 ...

    Inkscape 0.48 Illustrators Cookbook (with example)

    8. **导出和导入**:学习将Inkscape作品导出为其他格式,如PNG、PDF或EPS,以及如何导入外部图像和图形。 9. **模板和样式**:了解如何使用模板和样式库来快速统一设计元素的外观,提高工作效率。 10. **实例项目*...

    inkscape_portable0.48

    4. **导出高质量图像**:Inkscape支持多种导出格式,包括SVG、PDF、PNG等,方便在各种场合下使用。 总的来说,Inkscape Portable 0.48是一款强大的工具,尤其是对于那些需要在图形设计中频繁使用数学公式的用户。它...

    DEV Inkscape x64 V0.91 便携版

    DEV Inkscape x64 V0.91 便携版是一款专为64位操作系统设计的图形编辑软件,提供了一种便捷的方式来处理矢量图形。Inkscape是一款开源的图形设计工具,它允许用户创建、编辑和导出SVG(Scalable Vector Graphics)...

    (64位系统)Inkscape-0.92.1-x64-1.exe.zip

    Inkscape支持导入和导出多种矢量图格式,如SVG、EPS、PDF等,同时也能够处理位图文件,如JPEG、PNG等,并将其转换为矢量图。 在雕刻领域,Inkscape是一个不可或缺的工具。通过其内置的功能或配合外部插件,用户可以...

    矢量绘图软件(Inkscape)

    在提供的压缩包中,有`inkscape-0.92.3-x86.exe`是Inkscape的安装程序,适用于32位Windows系统;`下载说明.htm`可能包含了下载和安装的步骤或注意事项;`使用说明.txt`是Inkscape的基本操作指南;`使用帮助(河东软件...

    svglatex:通过Inkscape在LaTeX中包含SVG图形

    该程序包首先将文本与图形分开,然后使用Inkscape将SVG图形转换为PDF。 文本存储在扩展名为.pdf_tex的LaTeX文件中。 SVG转换为PDF,文本包含在PDF中。 该软件包使用Inkscape将整个SVG转换为PDF。 仅当PDF文件早于...

    inkscape.rar

    这款软件致力于为用户提供专业强大的矢量图编程服务,界面清爽直观,拥有丰富的功能模块,内置多个实用的形状工具,能够为用户提供人性化的操作,支持SVG、AI、PDF等多种格式图片的导入,应用十分广泛。

    node-inkscape:inkscape实用程序作为可读可写流

    构造函数可以选择使用inkscape二进制文件的命令行选项数组: var Inkscape = require ( 'inkscape' ) , svgToPdfConverter = new Inkscape ( [ '--export-pdf' , '--export-width=1024' ] ) ; sourceStream . ...

Global site tag (gtag.js) - Google Analytics