2010-09-11 24 views
5

¿Existe una manera simple de escalar el pdf creado por cfdocument o cfpdf a una sola página usando CF8? Mi salida (un calendario) podría extenderse a la página 2 dependiendo de la cantidad de eventos. Prefiero escalar el calendario para ajustarlo en una página. Supongo que puedo crear el pdf con cfdocument. Use cfpdf para verificar los números de página y el bucle mientras totalPages> 1 crea el PDF con una escala menor.Escala PDF a una sola página

código psudo:

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 

Estoy en el camino correcto o me estoy perdiendo algo para hacer esto más fácil? Gracias.

Respuesta

5

Tu teoría me parece bien, debes probarla y descubrirla. Ya que es una respuesta bastante aburrida, también me he convertido su pseudocódigo a código real:

<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> 

Dependiendo de su configuración, también puede ser que desee para abstraer la creación del PDF en una función, de modo que usted don' Tengo que volver a escribir todo el contenido dos veces en la página. O podrías usar un incluir. Diablos, si hay algún tipo de procesamiento complejo para renderizar el HTML para el PDF (que supongo que existe, ya que está haciendo un calendario), entonces quizás quiera preprocesar el contenido y volver a usarlo es así:

<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> 
+0

Gracias Adam. Estaba considerando convertirlo en un cfc y agregarlo a cflib.org. Tal vez alguien más lo encuentre útil también. Me aseguraré de acreditar tus esfuerzos si lo hago. ¡Gracias de nuevo! – Travis

+0

Adam, funciona. lo redujo al 60% y solo tuve que hacer algunos cambios en el código no probado pero preciso. 1. '' dentro de la etiqueta cfdocument. 2. source = "pdfObj" en lugar de source = "# pdfObj #" 3. Necesitaba hacer otro cfdocument fuera del ciclo para enviar el pdf al navegador en lugar de ponerlo en la memoria. Lo haré en UDF y lo compartiré más tarde. Tiempo para el fin de semana – Travis

+1

Travis, actualicé mi segundo ejemplo de código para reflejar los cambios de sus comentarios. Sin embargo, usaría CFContent para entregar el PDF resultante al usuario en lugar de CFDocument. –

Cuestiones relacionadas