【问题标题】:In iOS, how can you programmatically fill out a pdf form field?在 iOS 中,如何以编程方式填写 pdf 表单字段?
【发布时间】:2012-01-12 07:00:53
【问题描述】:

我需要获取一个现有的 pdf 文件并以编程方式用文本填写表单字段列表,然后保存 pdf 而不向用户显示它。

例如,如果 pdf 文件包含名为“LastName”和“FirstName”的字段,我想将“FirstName”的值设置为“Louis”,然后保存文件。

我已经搜索了很长时间,甚至找不到任何关于从哪里开始的指导,因为 iOS 文档(以及此处的大多数问题)似乎是针对显示或创建 pdf 内容而不是修改它。

编辑:
我的主要问题是:是否可以打开一个 pdf 流(我知道该怎么做)并将每个现有的 pdf 字典项复制到一个新的 pdf 中?我一直无法找到将字典项写入 pdf 的方法。

【问题讨论】:

  • 你有没有想出办法做到这一点?你介意分享你的想法吗?
  • 不幸的是,我没有。我刚刚将表单字段留空并将字符串直接写入文件......
  • @lnafziger 您能否发布一些有关如何将字符串直接写入文件的代码?我一直在处理这个问题,但是修改表单值会破坏文件中的所有二进制数据。
  • @lnafziger 我假设这是因为当我修改数据时外部参照数据已损坏。 (stackoverflow.com/a/14292892/953105) 你想出解决方案了吗?
  • @paulrehkugler:是的,我放弃了表格,只是在 pdf 中添加了新文本。如果您询问有关如何执行此操作的问题,我很乐意为您添加一些代码。

标签: objective-c ios pdf core-graphics


【解决方案1】:

我怀疑这种功能是否会出现在 iOS 框架中。您可以找到“似乎 [s] 用于显示或创建 pdf 内容而不是修改它”的大多数相关信息的原因是因为绝大多数用例都希望或需要 PDF 功能。

您需要找到一个可以打开 PDF、填写 AcroForm 字段然后印出 PDF 的第三方库。我在 Java 上使用 iText(C# 也有 iTextSharp),但我不知道任何关于 Objective-C 的东西。

找到该库后,您需要将其集成到您的项目中。对于您使用的任何版本的 SDK,毫无疑问,这里有几个相关的问题/答案。

【讨论】:

  • 感谢您的输入,但我不想要第 3 方库。我想使用 iOS 框架函数来编写一个通用的解决方案(我将在完成后与其他人分享)。在阅读了很多 iOS 文档后,我很确定可以做到,但希望更熟悉的人能指出我正确的方向!
  • Shaggy Frog 是对的,CGPDF* API 不支持 PDF 修改,包括填写表单字段。
  • 虽然 CGPDF 不允许直接修改,但最终结果是我正在寻找的。我正在考虑的方法是打开pdf流,复制每个字典项,修改表单字段的内容,然后保存到新的pdf中。不过,我需要帮助的部分是确保我复制整个 pdf,因为我查看的例程允许从 pdf 中提取特定部分,而不是提供对整个文档的访问权限。我想我正在寻找一种方法来打开流并将其一次复制一个元素到一个新文件,最终得到相同的文件。
【解决方案2】:

使用 HTML 页面会更容易做到这一点。如果您希望使用 HTML 页面而不是 .pdf 表单,那么您将采用这种方式:

[field1 setText:@"Field 1 Text"];
[field2 setText:@"Field 2 Text"];

NSString *result;
result = [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"$('#field1').val('%@');", field1.text]];
result = [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"$('#pfield2').val('%@');", field2.text]];
result = [webView stringByEvaluatingJavaScriptFromString:@"$('#submitbutton').click();"];

您需要创建两个 UILabel 或 UITextField,并在您的 .h 文件中将它们命名为“field2”和“field2”。然后,您可以找到需要替换的字段的 ID,例如#field1,然后将它放在我放置“#field1”的位置,然后再次放置在我放置“#field2”的第二个字段中。还需要一个 UIWebView 已经加载了页面。此代码将在 UIWebView 页面加载后使用。也许做以下事情:

-(void)webViewDidFinishLoad:(UIWebView *)webView {

// Insert above code here

}

如果您想对整个表单执行此操作,您可能需要全面了解 Javascript,但这应该可以帮助您入门。

希望对你有所帮助。

【讨论】:

  • 感谢您提供的示例,但这确实需要在 pdf 中!
  • 你不能把html转换成PDF吗?
  • 不幸的是,这是一个现有的、非常复杂的 pdf,它会定期更改,因此我不想在代码中重新创建(和维护)它(既不是作为网页也不是动态创建 pdf) .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 2014-09-18
  • 1970-01-01
  • 2011-12-12
  • 2020-03-15
相关资源
最近更新 更多