【问题标题】:scale PDF to single page将 PDF 缩放为单页
【发布时间】:2010-09-11 00:23:47
【问题描述】:

有没有一种简单的方法可以使用 CF8 将 cfdocument 或 cfpdf 创建的 pdf 缩放到单个页面?根据事件的数量,我的输出(日历)可能会扩展到第 2 页。我宁愿缩放日历以适应一页。我假设我可以使用 cfdocument 创建 pdf。使用 cfpdf 检查页码并循环,而 totalPages > 1 创建比例较小的 PDF。

伪代码:

pdfScale = 100
cfdocument scale = "#pdfScale#"
cfpdf action = "getinfo" name = "mypdf" 
cfloop while mypdf.totalPages > 1
pdfScale = pdfScale -5
cfdocument scale = "#pdfScale#"
cfpdf action = "getinfo" name = "mypdf"
/cfloop

我是在正确的轨道上还是我错过了一些让这更容易的东西?谢谢。

【问题讨论】:

    标签: coldfusion


    【解决方案1】:

    你的理论对我来说似乎是正确的 - 你应该尝试一下并找出答案。由于这是一个相当无聊的答案,我还将您的伪代码转换为真实代码:

    <cfset pdfScale = 100 />
    <cfset pdfObj = "" />
    <cfdocument format="pdf" name="pdfObj" scale="#pdfScale#">document contents</cfdocument>
    <cfpdf action="getInfo" source="#pdfObj#" name="pdfInfo" />
    <cfloop condition = "pdfInfo.TotalPages gt 1">
        <cfset pdfScale -= 5 />
        <cfdocument format="pdf" name="pdfObj" scale="#pdfScale#">document contents</cfdocument>
        <cfpdf action="getInfo" source="#pdfObj#" name="pdfInfo" />
    </cfloop>
    

    根据您的设置,您可能还希望将 PDF 的创建抽象为一个函数,这样您就不必在页面上重新编写所有内容两次。或者您可以使用包含。哎呀,如果正在进行任何复杂的处理来呈现 PDF 的 HTML(我假设有,因为你正在制作日历),那么你甚至可能想要预呈现内容并重用它,像这样:

    <cfsavecontent variable="docContents">document contents go here</cfsavecontent>
    <cfset pdfScale = 100 />
    <cfset pdfObj = "" />
    <cfdocument format="pdf" name="pdfObj" scale="#pdfScale#"><cfoutput>#docContents#</cfoutput></cfdocument>
    <cfpdf action="getInfo" source="#pdfObj#" name="pdfInfo" />
    <cfloop condition = "pdfInfo.TotalPages gt 1">
        <cfset pdfScale -= 5 />
        <cfdocument format="pdf" name="pdfObj" scale="#pdfScale#"><cfoutput>#docContents#</cfoutput></cfdocument>
        <cfpdf action="getInfo" source="pdfObj" name="pdfInfo" />
    </cfloop>
    

    【讨论】:

    • 谢谢亚当。我正在考虑将其设为 cfc 并将其添加到 cflib.org。也许其他人也会发现它有帮助。如果我这样做,我一定会相信你的努力。再次感谢!
    • 亚当,它有效。把它降低到 60%,我只需要对你未经测试但准确的代码进行一些更改。 1. cfdocument 标签内的&lt;cfoutput&gt;。 2. source = "pdfObj" 而不是 source = "#pdfObj#" 3. 我需要在循环之外执行另一个 cfdocument 以将 pdf 提供给浏览器,而不是将其放入内存中。我将UDF它并稍后分享。周末时间到了。
    • Travis,我更新了我的第二个代码示例以反映您的 cmets 的更改。不过,我会使用 CFContent 而不是 CFDocument 将生成的 PDF 提供给用户。
    • 从 ColdFusion 版本 8.0.1 开始,您现在将 PDF 变量传递给不带“#”符号的 cfpdf。所以它会是,,或者你得到一个“ByteArray 对象不能被转换为字符串”。错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多