我需要自动生成多个PDF文件,并将其作为附件保存在其对应的对象记录中。我试图解决 本主题将批处理文件和呈现的visualForce页面用作“PDF”,但Salesforce在此限制,不允许在批次类中使用getContent()方法。
在互联网上搜索我找到了这个可能的解决方案:
Why are HTML emails being sent by a APEX Schedulable class being delivered with blank bodies?
它建议:
我发现的问题是当我尝试在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 ???
内会更容易你能提出任何可能的解决办法吗?
答案 0 :(得分:1)
(旧问题的死灵;))
这个怎么样:
renderAs="pdf"
轻松访问您的VF页面,并将内容保存为附件?finish()
方法可用于在下一批中触发Database.execute();)至于如何获得对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 可能需要很长时间才能响应。
<块引用>您现在可以从异步 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()。
例如,PageReference('/' + recordId)
。
对 Salesforce URL 的 getContent() 调用不受最大并发调出限制,但受每个事务的最大调出总数限制。
例如,PageReference('https://www.google.com/')
。
对外部 URL 的 getContent() 调用受最大并发调用限制和每个事务调用的最大总调用限制。
即使没有根据标注限制跟踪对 getContent() 和 getContentAsPdf() 的调用,它们仍然受制于通常的 Apex 限制,例如 CPU 时间等。这些限制在原始交易中的所有标注中累积.
最后,我们放宽了在执行 DML 操作(不包括创建保存点)后调用 getContent() 和 getContentAsPdf() 的限制。如果对 getContent() 和 getContentAsPdf() 的调用是内部调用,则现在允许它们。 DML 操作后的外部调用仍然被阻塞,并且你仍然无法从 getContent() 调用本身进行调用,即在页面渲染期间。