我们正在尝试为销售人员制作一个集成应用程序。流程是:
我的 Apex 代码(相关位)
public class POCApexClass {
public Blob pdfContent{get;set;}
public Blob pdfContent2{get;set;}
public string pdfContentBase64{get;set;}
public void CommunicationRequestDemoPDF(){
OutputDocument doc = GetDoc();
pdfContentBase64 = doc.outputBase64;
pdfContent = EncodingUtil.base64Decode(pdfContentBase64);
pdfContent2 = Blob.toPDF(pdfContentBase64);
}
}
如果有顶点代码,只需在浏览器或其他应用程序或其他应用程序中打开文件,那就完美了。看来我可能需要使用 VisualForce 代码来实现这一点?我在那里尝试了几种方法。
<apex:page controller="POCApexClass" action="{!CommunicationRequestDemoPDF}">
<apex:form >
Sample PDF
</apex:form>
<apex:outputPanel >
<object data="data:application/pdf;base64,{!pdfContentBase64}"></object>
<!--
<iframe src="/apex/RenderPDFPage?base64String={!pdfContentBase64}" width="100%" height="300px" frameborder="0"></iframe>
<apex:outputText value="{!pdfContent2}" escape="false"/>
<script>
window.location.href = "data:application/pdf;base64,{!pdfContentBase64}";
</script>
-->
</apex:outputPanel>
</apex:page>
他们都吐出了错误:超出了最大视图状态大小限制(170KB)。 该页面的实际视图状态大小为 192.954KB
有什么办法可以增加帧大小吗?或者让它在新窗口中显示的方法?或者像普通 PDF 一样下载并打开?
我到处碰壁,谢谢你的帮助。
如果答案是除了小 PDF 之外您无法打开任何内容,那也没关系。
将类变量标记为“瞬态”,因此“公共瞬态 Blob...”,这应该会导致它们不计入视图状态。
您将遇到的下一个限制是 6MB 堆大小(某种 RAM 使用情况),因此您可以通过删除未使用的变量来削减一些限制。超越这一点会有点棘手,所以如果它的发送器为 base64,你会损失一些编码开销,你的实际最大有用文件大小将是 4.27MB。除此之外,您需要尝试异步 apex,如延续、多部分文件...或者反转流程,让外部系统将文件推送到 SF,使用标准 API 保存它们(最多 2 GB 限制),然后您只需渲染链接到文件+定期清除旧文件?
视觉力有效,但它是在 iframe 中渲染的,然后您在自己的代码中还有另一个 iframe。有点嗯。你的目标是什么?显示文件预览/迷你窗口?触发浏览器的文件下载提示(然后浏览器/用户首选项决定是新选项卡、新窗口还是真正保存到磁盘)?