从salesforce自动生成多个PDF。避免使用getContent()

时间:2012-12-18 09:20:47

标签: web-services salesforce apex-code visualforce salesforce-service-cloud

我需要自动生成多个PDF文件,并将其作为附件保存在其对应的对象记录中。我试图解决 本主题将批处理文件和呈现的visualForce页面用作“PDF”,但Salesforce在此限制,不允许在批次类中使用getContent()方法。

在互联网上搜索我找到了这个可能的解决方案:

Why are HTML emails being sent by a APEX Schedulable class being delivered with blank bodies?

它建议:

  1. 创建一个实现Schedulable接口的类。
  2. 进行execute()方法调用和@future方法。
  3. 创建一个@future方法,该方法在发送电子邮件的类中调用启用Web服务的方法。
  4. 我发现的问题是当我尝试在Salesforce(http://help.salesforce.com/help/doc/en/remoteaccess_oauth_web_server_flow.htm)内部的Web服务(REST)中进行身份验证时

    在第一步中,我正在发出请求,并通过回调URL获取代码,但是不可能知道如何从Salesforce读取此参数。在答案中,我没有一个名为'getParameter()'的方法,而且正文是空的。

    举个例子:

    请求https://login.salesforce.com/services/oauth2/authorize?response_type=code&client_id= 3MVG9lKcPoNINVBIPJjdw1J9LLM82HnFVVX19KY1uA5mu0QqEWhqKpoW3svG3XHrXDiCQjK1mdgAvhCscA 9GE&安培; REDIRECT_URI = HTTPS%3A%2F%2Fwww.mysite.com%2Fcode_callback.jsp&安培;状态= mystate

    回复https://www.mysite.com/code_callback.jsp?code=aPrxsmIEeqM9&state=mystate

    以任何方式连接我的Web服务,在Salesforce内部进行调用以实现此解决方案?

    如果从外部应用程序拨打电话,但在salesforce ???

    内会更容易

    你能提出任何可能的解决办法吗?

2 个答案:

答案 0 :(得分:1)

(旧问题的死灵;))

这个怎么样:

  1. 直接来自您的上下文或来自Schedulable类......
  2. 最多拨打@future 10次
  3. 每个@future最多可以发送10个标注,使用它们以renderAs="pdf"轻松访问您的VF页面,并将内容保存为附件?
  4. 如果100个附件不够 - 使用菊花链接批量播放。我相信自夏季或冬季以来,批量中的'finish()方法可用于在下一批中触发Database.execute();)
  5. 至于如何获得对PDF的REST访问 - 您可以使用我的问题https://salesforce.stackexchange.com/questions/4692/screen-scrape-salesforce-with-rest-get-call-from-apex或者我的最终解决方案来保存报告:https://salesforce.stackexchange.com/questions/4303/scheduled-reports-as-attachment(您只需要我想象的身份验证部分+当然是远程站点设置中的工作条目。)

    这是假设sid cookie在VF页面上的效果与在标准页面上的效果一样好...祝你好运?

答案 1 :(得分:0)

自 Winter '16 版本以来,可以从 Batch Apex 调用 PageReference.getContent。

根据您需要生成的大小和数量,将 PDF 附件生成分布在多个批处理执行上下文中 - getContent 是一个 HTTP 请求,servlet 可能需要很长时间才能响应。

https://releasenotes.docs.salesforce.com/en-us/winter16/release-notes/rn_apex_pagereference_getcontent.htm#rn_apex_pagereference_getcontent

<块引用>

您现在可以从异步 Apex 中调用 PageReference 类的 getContent() 和 getContentAsPdf() 方法,例如 Batch Apex、Schedulable 和 Queueable 类以及 @future 方法。这使您可以设计更加灵活和可扩展的服务,例如,将 Visualforce 页面呈现为 PDF 文件。

出于限制和限制的目的,对 getContent()(和 getContentAsPdf(),其行为相同)的调用被视为标注。行为和限制因调用它的 PageReference 而异,并且在某些情况下是放宽的。存在三种不同的可能性。

显式引用 Visualforce 页面的 PageReference 实例 例如,Page.existingPageName。 对 getContent() 的调用不受最大并发调出限制或每个事务的最大调出总数限制。

此外,只有引用 Visualforce 页面的 PageReference 实例才能从计划的 Apex(即实现 Schedulable 接口的 Apex 类)调用 getContent()。

引用 Salesforce URL 的 PageReference 实例:

例如,PageReference('/' + recordId)。 对 Salesforce URL 的 getContent() 调用不受最大并发调出限制,但受每个事务的最大调出总数限制。

引用外部 URL 的 PageReference 实例:

例如,PageReference('https://www.google.com/')。 对外部 URL 的 getContent() 调用受最大并发调用限制和每个事务调用的最大总调用限制。

即使没有根据标注限制跟踪对 getContent() 和 getContentAsPdf() 的调用,它们仍然受制于通常的 Apex 限制,例如 CPU 时间等。这些限制在原始交易中的所有标注中累积.

最后,我们放宽了在执行 DML 操作(不包括创建保存点)后调用 getContent() 和 getContentAsPdf() 的限制。如果对 getContent() 和 getContentAsPdf() 的调用是内部调用,则现在允许它们。 DML 操作后的外部调用仍然被阻塞,并且你仍然无法从 getContent() 调用本身进行调用,即在页面渲染期间。