![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
|
Automatizar el uso de Bullzip PDF Printer
Tengo instalado este programa para cuando necesito imprimir en formato PDF y me gustaría que en un programa que estoy desarrollando si selecciono como destino esta impresora se automatizara el proceso sin necesidad de mostrar cuadros de diálogo y demás. Lo malo es que el único código aparentemente completo que he encontrado está en VBA y no tengo ni idea de como funciona. ¿Alguno puede ayudarme con la traducción?
Cita:
Código:
#include <windows.h>
#include <iostream>
#include <comdef.h>
// Reemplaza esta ruta por la localización real de tu archivo de configuración de Bullzip si fuese necesario.
// Sin embargo, instanciarlo por su ProgID ("Bullzip.PDFPrinterSettings") suele ser suficiente.
int main() {
// 1. Inicializar el entorno COM de Windows
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr)) {
std::cerr << "Error al inicializar COM." << std::endl;
return 1;
}
try {
// 2. Obtener el CLSID a partir del ProgID de Bullzip
CLSID clsid;
hr = CLSIDFromProgID(L"Bullzip.PDFPrinterSettings", &clsid);
if (FAILED(hr)) {
throw std::runtime_error("No se encontró el componente COM de Bullzip. ¿Está instalado?");
}
// 3. Crear la instancia del objeto de configuración
IDispatch* pBullzipSettings = nullptr;
hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, (void**)&pBullzipSettings);
if (FAILED(hr)) {
throw std::runtime_error("No se pudo crear la instancia de Bullzip Settings.");
}
// Helper Lambda para invocar métodos (SetValue, WriteSettings) mediante IDispatch
auto invokeMethod = [](IDispatch* obj, OLECHAR* name, VARIANT* args, int argCount) -> _variant_t {
DISPID dispid;
HRESULT hr = obj->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) return _variant_t();
DISPPARAMS params = { args, NULL, (UINT)argCount, 0 };
_variant_t result;
hr = obj->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, &result, NULL, NULL);
return result;
};
// 4. Configurar los parámetros de impresión automática
// Nota: Los argumentos en Invoke se pasan en orden inverso (derecha a izquierda)
// Parámetro: Output -> Ruta donde se guardará el PDF
VARIANT argsOutput[2];
argsOutput[1].vt = VT_BSTR; argsOutput[1].bstrVal = SysAllocString(L"Output");
argsOutput[0].vt = VT_BSTR; argsOutput[0].bstrVal = SysAllocString(L"C:\\destino\\mi_documento.pdf");
invokeMethod(pBullzipSettings, L"SetValue", argsOutput, 2);
SysFreeString(argsOutput[1].bstrVal); SysFreeString(argsOutput[0].bstrVal);
// Parámetro: ShowPDF -> "no" (Evita que se abra el lector de PDF tras crear el archivo)
VARIANT argsShow[2];
argsShow[1].vt = VT_BSTR; argsShow[1].bstrVal = SysAllocString(L"ShowPDF");
argsShow[0].vt = VT_BSTR; argsShow[0].bstrVal = SysAllocString(L"no");
invokeMethod(pBullzipSettings, L"SetValue", argsShow, 2);
SysFreeString(argsShow[1].bstrVal); SysFreeString(argsShow[0].bstrVal);
// Parámetro: ShowSettings -> "never" (Oculta por completo la interfaz gráfica de Bullzip)
VARIANT argsShowSettings[2];
argsShowSettings[1].vt = VT_BSTR; argsShowSettings[1].bstrVal = SysAllocString(L"ShowSettings");
argsShowSettings[0].vt = VT_BSTR; argsShowSettings[0].bstrVal = SysAllocString(L"never");
invokeMethod(pBullzipSettings, L"SetValue", argsShowSettings, 2);
SysFreeString(argsShowSettings[1].bstrVal); SysFreeString(argsShowSettings[0].bstrVal);
// Parámetro: ConfirmOverwrite -> "no" (Sobrescribe de forma automática si el archivo ya existe)
VARIANT argsOverwrite[2];
argsOverwrite[1].vt = VT_BSTR; argsOverwrite[1].bstrVal = SysAllocString(L"ConfirmOverwrite");
argsOverwrite[0].vt = VT_BSTR; argsOverwrite[0].bstrVal = SysAllocString(L"no");
invokeMethod(pBullzipSettings, L"SetValue", argsOverwrite, 2);
SysFreeString(argsOverwrite[1].bstrVal); SysFreeString(argsOverwrite[0].bstrVal);
// 5. Confirmar y escribir la configuración en el archivo temporal 'runonce.ini'
// El método WriteSettings acepta un booleano (true para escribir la configuración de inmediato)
VARIANT argsWrite[1];
argsWrite[0].vt = VT_BOOL; argsWrite[0].boolVal = VARIANT_TRUE;
invokeMethod(pBullzipSettings, L"WriteSettings", argsWrite, 1);
// 6. Liberar el objeto COM de configuración
pBullzipSettings->Release();
// 7. Lanzar la impresión real del documento usando la API de Windows
// Esto envía el archivo a la cola de Bullzip, la cual procesará el runonce.ini que acabamos de crear.
std::cout << "Configuración inyectada. Enviando archivo a 'Bullzip PDF Printer'..." << std::endl;
// Ejemplo para mandar a imprimir un archivo de texto existente silenciosamente:
ShellExecute(NULL, L"printto", L"C:\\origen\\documento.txt", L"\"Bullzip PDF Printer\"", NULL, SW_HIDE);
} catch (const std::exception& e) {
std::cerr << "Excepción: " << e.what() << std::endl;
}
// Cerrar el entorno COM
CoUninitialize();
return 0;
}
|
|
#2
|
||||
|
||||
|
Pregunto, ¿tiene que ser ese programa?
Hay otros que puedes usar y funcionan perfectamente. E incluso creo recordar que el propio windows ya permite instalar una impresora pdf directamente.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#3
|
|||
|
|||
|
Try this: (CONSOLE for tests... )
Última edición por emailx45 fecha: Hace 13 Horas a las 22:57:44. |
|
#4
|
||||
|
||||
|
Cita:
Muchas gracias por el esfuerzo, pero no era trasladarlo a Delphi. Eso se me olvidó ponerlo: era para C++. |
|
#5
|
||||
|
||||
|
Prueba el pdfcreator, está en nuestro ftp:
https://terawiki.clubdelphi.com/Delp...PdfCreator.zip Eso crea una impresora virtual a donde puedes enviar todo lo que quieras imprimir a formato pdf. La versión última de ese componente me temo que lo ha comprado una empresa y ahora e de pago, pero esa versión que está en nuestro ftp es la anterior que era gratis. Y funciona perfectamente.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#6
|
||||
|
||||
|
Y si necesitas código C++ para lo que te ha pasado en Delphi emailx45, pásaselo a cualquier IA y le indicas que te lo convierta al lenguaje que quieras.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
![]() |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Automatizar web login | amadis | Internet | 2 | 13-08-2010 15:15:42 |
| automatizar instalación de mysql | Aprendiendo | MySQL | 3 | 10-02-2010 17:19:58 |
| Automatizar OpenOffice. | Critter | Servers | 2 | 31-07-2007 20:41:24 |
| Automatizar BACKUPS y RESTORES | AMINOA2R | Firebird e Interbase | 12 | 20-10-2005 17:11:16 |
| Automatizar Login | JoseQ | Internet | 0 | 30-03-2005 13:35:50 |
|