En este momento tengo una buena aplicación R Shiny que puede crear un pdf a partir de partes de él usando una pieza de javascript. Sin embargo, en este momento solo se descarga automáticamente.
js <- " $(document).on('shiny:sessioninitialized', function(event) { $('#printPdf_CA').click(function () { domtoimage.toPng(document.getElementById('mainOrder_CA')) .then(function (blob) { var pdf = new jsPDF('l', 'pt', [$('#mainOrder_CA').width(), $('#mainOrder_CA').height()]); pdf.addImage(blob, 'PNG', 0, 0, $('#mainOrder_CA').width(), $('#mainOrder_CA').height()); pdf.save($('#name').val() + '.pdf'); }); }); }); "Quiero poder almacenarlo localmente (ya sea como un archivo en un directorio relativo O como una variable en la aplicación Shiny) y luego darle al usuario la opción de imprimirlo en pdf (como arriba) O enviarlo por correo electrónico a una dirección elegida (usando el paquete emayili de R). Ya probé Shiny.setInputValue(), pero eso no funcionó en absoluto (incluso el envío de un número desde JavaScript no pareció funcionar, pero tal vez estoy haciendo algo mal aquí.
¡Realmente agradecería su ayuda!
EDITAR Hice que Shiny.setinputValue() funcionara, pero no sé cómo escribirlo en un archivo .pdf temporal desde el campo. También me pregunto si esto todavía se reconoce oficialmente como un pdf o si hubo alguna pérdida de información cuando se movió a R
EDIT 2: Básicamente me las arreglo para enviar el PDF a R como una entrada brillante con el siguiente código ajustado:
$(document).on('shiny:sessioninitialized', function(event) { var pdf $('#storePDF').click(function () { domtoimage.toPng(document.getElementById('Capture')) .then(function (blob) { pdf = new jsPDF('l', 'pt', [$('#Capture').width(), $('#Capture').height()]); pdf.addImage(blob, 'PNG', 0, 0, $('#Capture').width(), $('#Capture').height()); Shiny.setInputValue('pdf', pdf) }); }); });Ahora solo necesitaría poder crear un PDF en R a partir de esto. Sin embargo, en R, el archivo resultante es solo una lista de listas y varios componentes (una estructura grande que probablemente describa el PDF de alguna manera).
Imprimir esto en la consola da el siguiente resultado:
$internal $internal$collections $internal$collections$addImage_images $internal$collections$addImage_images$`0` $internal$collections$addImage_images$`0`$alias [1] 1916164677 $internal$collections$addImage_images$`0`$w [1] 1905 $internal$collections$addImage_images$`0`$h [1] 880 $internal$collections$addImage_images$`0`$cs [1] "DeviceRGB" $internal$collections$addImage_images$`0`$bpc [1] 8 ..... And much more......¿Hay alguna manera de convertir este tipo de cosas en un pdf?
Editar 3:
Mi solución medio decente para cualquier persona interesada fue simplemente mover la "mancha" a Shiny (Shiny.setInputValue)
que usar el decodificador base64
lea la imagen usando magick::image_read y escriba en el archivo temporal pdf usando magick::image_write
La próxima vez que copie de una de mis publicaciones, proporcione el enlace, esto habría sido más fácil.
Puede proceder de la siguiente manera, utilizando la codificación/descodificación base64:
library(shiny) library(base64enc) js <- " $(document).ready(function(){ $('#printPdf').click(function () { domtoimage.toPng(document.getElementById('frame_print')) .then(function (blob) { var pdf = new jsPDF('l', 'pt', [$('#frame_print').width(), $('#frame_print').height()]); pdf.addImage(blob, 'PNG', 0, 0, $('#frame_print').width(), $('#frame_print').height()); pdf.save('test.pdf'); }); }); $('#getPdf').click(function () { domtoimage.toPng(document.getElementById('frame_get')) .then(function (blob) { var pdf = new jsPDF('l', 'pt', [$('#frame_get').width(), $('#frame_get').height()]); pdf.addImage(blob, 'PNG', 0, 0, $('#frame_get').width(), $('#frame_get').height()); var b64 = pdf.output('datauristring'); Shiny.setInputValue('b64pdf', b64); }); }); }); " ui <- fluidPage( tags$head( tags$script(src = "https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.min.js"), tags$script(src = "https://cdnjs.cloudflare.com/ajax/libs/dom-to-image/2.6.0/dom-to-image.min.js"), tags$script(js) ), br(), actionButton("printPdf", "PRINT", class = "btn-primary"), div( id = "frame_print", style = "border: 2px solid black;", h3("Click on the button to print me as PDF") ), br(), actionButton("getPdf", "GET", class = "btn-info"), div( id = "frame_get", style = "border: 2px solid red;", h3("Click on the button to get me as PDF") ), br(), conditionalPanel( "input.b64pdf !== undefined", downloadButton("dwnld") ) ) server <- function(input, output, session){ observeEvent(input[["getPdf"]], { showNotification( "PDF base64 string stored in `input$b64pdf`.", type = "message" ) }) output[["dwnld"]] <- downloadHandler( filename = "Test.pdf", content = function(file){ mybase64 <- input[["b64pdf"]] conn <- file(file, open = "wb") base64decode(substr(mybase64, 51L, nchar(mybase64)), output = conn) close(conn) } ) } shinyApp(ui, server)