- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Ruby on Rails 3 开发一个网络应用程序。该应用程序的一个功能是使用 MySQL 数据库中的数据来填写在 Adobe LiveCycle Designer 中设计的 PDF 模板表单。
我正在使用使用数据生成 XFDF 文件的技术,并用它来填充实际的 PDF 文件。我正在使用 PDFtk 来执行此操作,如果我从命令提示符(Windows 7 64 位)运行它,它工作正常。
我在 http://bleep.lapcominc.com/2012/02/07/filling-pdf-forms-with-ruby-and-pdftk/ 使用了 Greg Lappen 的代码在我的 Rails 应用程序中实现这个过程,但它似乎不起作用
输出的 PDF 无法在 Acrobat 中打开,因为它指出文件已损坏。如果我使用普通的文本编辑器打开它,它包含的所有内容都是 #<StringIO:0x5958f30>
每次输出后十六进制值都会发生变化。
生成 XML 数据的代码是正确的。我能够将它保存到一个文件中并自己通过命令提示符运行它。
def self.generate_xfdf(fields, filename)
xml = Builder::XmlMarkup.new
xml.instruct!
xml.xfdf("xmlns" => "http://ns.adobe.com/xfdf/", "xml:space" => "preserve") {
xml.f :href => filename
xml.fields {
fields.each do |field, value|
xml.field(:name => field) {
if value.is_a? Array
value.each {|item| xml.value(item.to_s) }
else
xml.value(value.to_s)
end
}
end
}
}
xml.target!
end
我怀疑真正的问题出在下面两个代码片段中的任何一个。我刚开始学习 Ruby on Rails,我无法调试它。我尝试了各种不同的方法,但到目前为止没有成功。如果有任何帮助,我将不胜感激。
def self.stamp(input_pdf, fields)
stdin, stdout, stderr = Open3.popen3("pdftk #{input_pdf} fill_form - output - flatten")
stdin << generate_xfdf(fields, File.basename(input_pdf))
stdin.close
yield stdout
stdout.close
stderr.close
end
PdfStamper.stamp('C:/clean-it-template.pdf', { 'LastName' => "Test Last Name", 'FirstName' => "Test First Name" }) do |pdf_io|
pdf_content = StringIO.new
pdf_content << pdf_io.read
send_data pdf_content.string, :filename=>'output.pdf', :disposition=>'inline', :type=>'application/pdf'
end
这是我的 Controller 类中的完整代码
require 'pdf_stamper'
class FormPagesController < ApplicationController
def pdftest
PdfStamper.stamp('C:/clean-it-template.pdf', { 'LastName' => "Test Last Name", 'FirstName' => "Test First Name" }) do |pdf_io|
pdf_content = StringIO.new
pdf_content << pdf_io.read
send_data pdf_content.string, :filename=>'output.pdf', :disposition=>'inline', :type=>'application/pdf'
end
end
end
这是我正在使用的 pdf_stamper 类的完整代码
require 'builder'
require 'open3'
class PdfStamper
def self.stamp(input_pdf, fields)
stdin, stdout, stderr = Open3.popen3("pdftk #{input_pdf} fill_form - output - flatten")
stdin << generate_xfdf(fields, File.basename(input_pdf))
stdin.close
yield stdout
stdout.close
stderr.close
end
def self.generate_xfdf(fields, filename)
xml = Builder::XmlMarkup.new
xml.instruct!
xml.xfdf("xmlns" => "http://ns.adobe.com/xfdf/", "xml:space" => "preserve") {
xml.f :href => filename
xml.fields {
fields.each do |field, value|
xml.field(:name => field) {
if value.is_a? Array
value.each {|item| xml.value(item.to_s) }
else
xml.value(value.to_s)
end
}
end
}
}
xml.target!
#file = File.new("C:/debug.xml", "w+")
#file.write(xml_data)
#file.close
end
end
更新 #1:
我在 Ubuntu 上运行 Web 应用程序,但仍然遇到相同的错误。在网上四处搜索后,我将 Controller 中的代码更改为:
def pdftest
PdfStamper.stamp('/home/nikolaos/clean-it-template.pdf', { 'LastName' => "Test Last Name", 'FirstName' => "Test First Name" }) do |pdf_io|
pdf_content = StringIO.new("", 'wb')
pdf_content << pdf_io.read
send_data pdf_content.string, :filename=>'output.pdf', :disposition=>'inline', :type=>'application/pdf'
end
end
我将 StringIO 更改为二进制写入模式,它在 Ubuntu 中工作! PDF 正确打开并填写了所有字段。我使用 Acrobat 在 Windows 上打开了相同的文件并且没有问题,但是如果我在 Windows 上运行网络应用程序,它仍然会生成损坏的 PDF 文件。
有没有人有任何关于如何在 Windows 中运行它的解决方案?我猜这与 Windows 和 Linux 解释换行符的方式或类似的方式有关?
最佳答案
在对 Ruby 文档进行更多搜索后,我设法解决了我的问题。现在我的应用程序能够在 Windows 上生成有效的 PDF 文件。这是我为遇到相同问题的任何人提供的解决方案。
解决方案是在 Controller 中使用 IO 而不是 StringIO。
我的 FormPages Controller 代码
require 'pdf_stamper'
class FormPagesController < ApplicationController
def pdftest
PdfStamper.stamp('C:/clean-it-template.pdf', { 'LastName' => "Bukas", 'FirstName' => "Nikolaos" }) do |pdf_io|
pdf_content = IO.new(pdf_io.to_i, "r+b")
pdf_content.binmode
send_data pdf_content.read, :filename=>'output.pdf', :disposition=>'inline', :type=>'application/pdf'
end
end
end
pdf_stamper 类负责使用 PDFtk 填充和生成 PDF
require 'builder'
require 'open3'
class PdfStamper
def self.stamp(input_pdf, fields)
Open3.popen3("pdftk #{input_pdf} fill_form - output -") do |stdin, stdout, stderr|
stdin << generate_xfdf(fields, File.basename(input_pdf))
stdin.close
yield stdout
stdout.close
stderr.close
end
end
def self.generate_xfdf(fields, filename)
xml = Builder::XmlMarkup.new
xml.instruct!
xml.xfdf("xmlns" => "http://ns.adobe.com/xfdf/", "xml:space" => "preserve") {
xml.f :href => filename
xml.fields {
fields.each do |field, value|
xml.field(:name => field) {
if value.is_a? Array
value.each {|item| xml.value(item.to_s) }
else
xml.value(value.to_s)
end
}
end
}
}
xml.target!
end
end
关于ruby-on-rails - 无法使用 PDFtk 生成正确的 PDF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17454998/
pdftk -v没有用。 pdftk -h也不行.那只是用手册填满屏幕,超过可用的历史记录。但它没有告诉我我正在运行什么版本。 有任何想法吗? 我正在运行 Windows。 最佳答案 在我的 WinX
如何使用 pdftk 将文件名与源文件加一个数字进行分页? 示例输入 source.pdf 期望的输出 source-1.pdf (it is ok if page number has leadin
如何使用 pdftk 将文件名与源文件加一个数字进行分页? 示例输入 source.pdf 期望的输出 source-1.pdf (it is ok if page number has leadin
我正在使用 pdftk multistamp在服务器上为大型(500-1200 页)PDF 文件添加自定义页码、页眉和页脚。我通过计算输入中的页数来做到这一点,使用 LaTeX 创建带有页码、页眉和页
从查看 PDFtk 服务器 product page , manual , 和 example usages ,看来这是实际上不是服务器 应用程序 - 在后台作为守护进程运行,并处理来自网络或其他进程
我正在使用该工具 pdftk ,我有一个可编辑的 PDF,我在文档中看到了参数 dump_data_fields应该向我展示表单的字段。 我使用这个命令(windows):pdftk my-pdf-f
我们有时会收到带有空白/空密码的pdf文件。我们使用pdftk,在这种情况下它会失败。我们尝试过: pdftk input.pdf input_pw output output.pdf pdftk
我正在尝试使用以下命令(作为 root)以用户 www-data 身份运行 pdftk: sudo -u www-data /snap/bin/pdftk 但是我收到了这个错误: cannot cre
当我做 pdftk samplex.pdf dump_data_fields 我返回格式如下的字段: FieldType: Text FieldName: form1[0].Page1[0].
我使用pdftk通过以下命令行压缩pdf pdftk file1.pdf output file2.pdf compress 它随着我的文件重量的减少而起作用。 有[选项]来改变压缩吗??? 或者也许
我在使用带有 true type 字体的文本字段的 pdftk 填写表单时遇到困难。 字体文件 (.ttf) 已添加到/Library/Fonts (OSX Mavericks) 该表单是使用 Ado
我正在尝试使用 pdftk 将一个 PDF 文件(多页)标记为另一个(单页)PDF 文件邮票操作。 pdftk large.pdf stamp stamp.pdf output stamped
我是新手,所以 ssh 和终端命令我使用 stack overflow 在我的 Web 服务器(Linus Cent-Os 专用虚拟服务器)上安装了 pdftk| . 虽然一开始遇到了问题,因为我所有
我正在使用 Linux 服务器并尝试安装 Pdftk,但我在尝试弄清楚具体要做什么时遇到了问题。 我找到了以下关于如何安装它的文档,但它们主要指的是在本地 Windows 机器上安装它。 它们是: h
在 PDFTK 的文档中没有提到如何去做。命令: pdftk file.pdf attach_files attachDoc.pdf to_page 2 output - 会将文件附加到原件的第 2
从 PDF 表单中删除 XFA 格式是否会出现任何问题?我正在使用 PDFTK 填写表单,发现如果表单是 XFA,那么除非我先执行 drop_xfa 命令来创建新的模板表单,否则 PDFTK 不起作用
我像这样拆分和合并一些 pdf 文件 pdftk A=content.pdf B=frontside.pdf cat B1 A5-2 output output.pdf 2>&1 结果很好,但不再有
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我们一直在使用一个名为 PDFTK 的免费命令行实用程序,我们从 Ruby on Rails 应用程序对其进行系统调用,以将 PDF 拆分为单独的页面。但是,它仅支持 PDF 版本 1.4 及更高版本
这个问题在这里已经有了答案: 关闭 9 年前。 Possible Duplicate: Flatten FDF / XFDF forms to PDF in PHP with utf-8 chara
我是一名优秀的程序员,十分优秀!