2009-12-30 40 views
5

En referencia a un post anterior (PDF Report generation)convertir HTML a PDF

he decidido utilizar una solución similar a http://www.alistapart.com/articles/boom

Para aquellos de ustedes que no quieren leer, ya sea de referencia - I estoy creando un informe y lo necesito como un PDF. Decidí ir a la ruta HTML -> PDF usando .NET.

Digamos que obtengo el archivo HTML exactamente como lo quiero. ¿Cuál es la mejor manera de convertir dicha página a PDF? En esencia, me gustaría que el usuario vea una "vista previa" en HTML y luego pueda convertir dicha página a PDF. La biblioteca con la que estoy experimentando actualmente es ABCPdf.

Mi primer pensamiento fue guardar la página en el sistema de archivos y hacer referencia a su URL en la rutina de conversión durante un manejador de eventos en la página misma. Esto tiene sus problemas porque tendría que guardar la página cada vez que se procesara para prepararla. En realidad, parece ir hacia atrás.

Mi siguiente pensamiento fue utilizar el método de renderizado de la página para capturar la página como un bytest y usar esto (ya que ABCPdf admite convertir un flujo de HTML.) Si esta es mi respuesta, estoy perdido en cómo tirar apagado. ¿Tiene un botón "Imprimir" que es manejador hace un Me.Render() para bytestream y lo envía a la rutina de conversión? ¿Es eso posible?

Conclusión: una vez que una página se muestra en buen HTML, ¿cómo inicializa una conversión a PDF de esa página? Soluciones temporales y otras soluciones son bienvenidas.

estoy esperando que me falta algo obvio ya que esto tiene que ser "la parte fácil"

+1

Además, estoy jugando con la idea de guardar la plantilla HTML de la página en el DB y completar los datos de forma programática. De esta forma, tengo el HTML que puedo hacer con lo que quiero (renderizar a pantalla o convertir) – IniTech

Respuesta

3

Ok, funcionó, y fue bastante simple. Simplemente pasando esto al siguiente tipo que pueda necesitar la respuesta. Acabo de utilizar la propiedad URL de la página y la envié al método ABCPdf addImageUrl(). También tuve que usar el encadenamiento ya que era más de una página. Gracias por toda la ayuda.

Dim oPdfDoc As New Doc() 
Dim iPageID As Int32 
Dim MyUrl = Request.Url 

iPageID = oPdfDoc.AddImageUrl(MyUrl.AbsoluteUri) 

While True 
    oPdfDoc.FrameRect() 
    If Not oPdfDoc.Chainable(iPageID) Then 
     Exit While 
    End If 
    oPdfDoc.Page = oPdfDoc.AddPage() 
    iPageID = oPdfDoc.AddImageToChain(iPageID) 
End While 

For i as Int32 = 1 To oPdfDoc.PageCount 
    oPdfDoc.PageNumber = i 
    oPdfDoc.Flatten() 
Next 

oPdfDoc.Save(Server.MapPath("test.pdf")) 
oPdfDoc.Clear() 
-2

¿Cómo lo haces desde C#? Usted no (directamente).

Engendrando un trabajador El proceso de PRINCE.EXE puede ser su única opción.

PRINCE.EXE leerá/escribirá datos de HTML "entrada estándar" y enviará PDF a "salida estándar". Use la línea de comando "% dir% \ PRINCE -" sin nombre de archivo de salida.

Puede encontrar que necesita un componente COM separado para generar PRINCE, ya que la clase System.Management podría no funcionar para usted. Use Visual Basic o C++ para crear su componente COM.

Poner HTML en la base de datos es una mala idea en general, pero puede estar bien en su caso, ya que parece que es esencialmente estático.

EDITAR

cambiado "niño Prince.exe" a "proceso Prince.exe trabajador". Tengo la extraña sensación de que PRINCE.EXE no debe ser un proceso secundario.