Estamos utilizando la nueva API de impresión de Java que usa PrinterJob.printDialog(attributes)
para mostrar el diálogo al usuario.¿Existe alguna manera de mantener la configuración de la impresora en una aplicación Swing?
querer salvar la configuración del usuario para la próxima vez, lo que quería hacer esto:
PrintRequestAttributeSet attributes = loadAttributesFromPreferences();
if (printJob.printDialog(attributes)) {
// print, and then...
saveAttributesToPreferences(attributes);
}
Sin embargo, lo que encontré al hacer esto es que a veces (no he encontrado la forma, sin embargo) los atributos obtienen algunos datos incorrectos en el interior, y luego cuando imprime, obtiene una página blanca de nada. Luego, el código guarda las configuraciones envenenadas en las preferencias, y todas las ejecuciones de impresión subsiguientes también se envenenan. Además, todo el objetivo del ejercicio, que hace que la configuración de la nueva ejecución sea la misma que la elegida por el usuario para la ejecución anterior, se ve frustrada porque no parece que el nuevo cuadro de diálogo use la configuración anterior.
Así que me gustaría saber si existe una forma adecuada de hacerlo. Seguramente Sun no tenía la intención de que los usuarios tengan que seleccionar la impresora, el tamaño de página, la orientación y los ajustes de margen cada vez que se inicia la aplicación.
Editar para mostrar la aplicación de los métodos de almacenamiento:
private PrintRequestAttributeSet loadAttributesFromPreferences()
{
PrintRequestAttributeSet attributes = null;
byte[] marshaledAttributes = preferences.getByteArray(PRINT_REQUEST_ATTRIBUTES_KEY, null);
if (marshaledAttributes != null)
{
try
{
@SuppressWarnings({"IOResourceOpenedButNotSafelyClosed"})
ObjectInput objectInput = new ObjectInputStream(new ByteArrayInputStream(marshaledAttributes));
attributes = (PrintRequestAttributeSet) objectInput.readObject();
}
catch (IOException e)
{
// Can occur due to invalid object data e.g. InvalidClassException, StreamCorruptedException
Logger.getLogger(getClass()).warn("Error trying to read print attributes from preferences", e);
}
catch (ClassNotFoundException e)
{
Logger.getLogger(getClass()).warn("Class not found trying to read print attributes from preferences", e);
}
}
if (attributes == null)
{
attributes = new HashPrintRequestAttributeSet();
}
return attributes;
}
private void saveAttributesToPreferences(PrintRequestAttributeSet attributes)
{
ByteArrayOutputStream storage = new ByteArrayOutputStream();
try
{
ObjectOutput objectOutput = new ObjectOutputStream(storage);
try
{
objectOutput.writeObject(attributes);
}
finally
{
objectOutput.close(); // side-effect of flushing the underlying stream
}
}
catch (IOException e)
{
throw new IllegalStateException("I/O error writing to a stream going to a byte array", e);
}
preferences.putByteArray(PRINT_REQUEST_ATTRIBUTES_KEY, storage.toByteArray());
}
Editar: bien, parece que la razón no es recordar la impresora es que no está en el PrintRequestAttributeSet en absoluto. De hecho, los márgenes y los tamaños de página se recuerdan, al menos hasta que la configuración se envenene al azar. Pero la impresora elegida por el usuario no se encuentra aquí:
[0] = {[email protected]} class javax.print.attribute.standard.Media -> na-letter
[1] = {[email protected]} class javax.print.attribute.standard.Copies -> 1
[2] = {[email protected]} class javax.print.attribute.standard.MediaPrintableArea -> (10.0,10.0)->(195.9,259.4)mm
[3] = {[email protected]} class javax.print.attribute.standard.OrientationRequested -> portrait
¿Ha verificado el funcionamiento correcto de 'saveAttributesToPreferences()'? – trashgod
Defina 'correcto'. Lo serializa en una matriz de bytes y lo almacena en preferencias, pero si eso es correcto o no depende de la respuesta a esta pregunta. – Trejkaz