2

I need to generate automatically multiple PDF files and save them as attachments in its correspondent objects records. I have tried to resolve this topic making use of a batch file and a rendered visualForce page as 'PDF' but Salesforce have here a limit not allowing to use a getContent() method in a batch class.

Searching in the internet I have found this possible solution:

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

It propose to:

  1. Create a class which implements the Schedulable interface.
  2. Have an execute() method call and a @future method.
  3. Create a @future method that call a web service enabled method in the class that sends the email.

The problem I found is when I try to authenticate in my Web Services (REST) inside Salesforce (http://help.salesforce.com/help/doc/en/remoteaccess_oauth_web_server_flow.htm)

In the first step I am making a request and I get a code through the callback URL, but It is impossible to know how to read this parameter from Salesforce. In the answer I don't have a method called 'getParameter()' and the body is empty.

As an example:

Request: 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&state=mystate

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

It exists any way to connect with my Webservices making the call inside Salesforce in order to implement this solution??

It would be easier if a make a call from an external application but inside salesforce???

Can you suggest any possible solution???

4

2 回答 2

1

(旧问题的死灵术;))

这个怎么样:

  1. 直接来自您的上下文或来自可调度的类...
  2. 最多调用@future 10 次
  3. 每个@future 最多可以发送 10 个标注,使用它们以 RESTful 方式访问您的 VF 页面renderAs="pdf"并将内容保存为附件?
  4. 如果 100 个附件还不够 - 玩菊花链批次。我相信由于 Summer 或 Winter '13finish()批次中的方法可用于在下一批中触发 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 页面上的工作与在标准页面上一样好......祝你好运吗?

于 2013-01-17T19:17:23.957 回答
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(例如 Batch Apex、Schedulable 和 Queueable 类以及 @future 方法)中调用 PageReference 类的 getContent() 和 getContentAsPdf() 方法。这使您可以设计更加灵活和可扩展的服务,例如,将 Visualforce 页面呈现为 PDF 文件。

出于限制和约束的目的,对 getContent()(和行为相同的 getContentAsPdf())的调用被视为标注。行为和限制取决于调用它的 PageReference,在某些情况下会放宽。有三种不同的可能性。

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

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

引用 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() 调用本身进行标注,即在页面呈现期间。

于 2021-01-15T11:22:06.090 回答