2009-09-10 479 views
13

Tenemos un código que produce un documento RTF a partir de una plantilla RTF. Básicamente está haciendo búsqueda de cadenas y reemplaza etiquetas especiales dentro del archivo RTF. Esto es accesible a través de una página web.Cómo reducir el tamaño de RTF con imágenes incrustadas?

Normalmente, el tiempo de procesamiento para esto es realmente rápido.

Sin embargo, tenemos que insertar una imagen dentro de una plantilla. Hemos estado incorporando estos como imágenes JPEG utilizando la funcionalidad "Insertar/Imagen/Desde archivo ..." de Word. Pero descubrimos que el tamaño del archivo RTF resultante depende enormemente de la imagen.

Por ejemplo, he insertado un logotipo JPEG de 20k (que es básicamente un fondo sólido con algo de texto). El archivo RTF aumentó en tamaño desde aproximadamente 390 k (sin la imagen) a 510 k (con la imagen).

Luego insertamos un JPEG que contiene una captura de pantalla, es decir, la imagen contiene texto, varios colores, etc. El JPEG es de alrededor de 150k. Usando esta imagen, el archivo RTF aumentó en tamaño de 390k a 3.5MB.

Por lo tanto, la codificación que usa Word para almacenar imágenes en un RTF no funciona linealmente. Supongo que depende de lo que está en la imagen JPEG.

Necesito mantener el tamaño de las plantillas RTF al mínimo para tratar de mantener los tiempos de procesamiento de archivos al mínimo.

  • ¿Alguien tiene alguna idea sobre cómo minimizar el tamaño de los archivos RTF con imágenes incrustadas?
  • ¿Hay alguna forma de controlar la codificación que Word usa? No puedo ver ninguna opción en ningún lado.
  • ¿Alguien sabe qué tipo de codificación binaria utiliza Word/RTF?

Gracias de antemano.

+2

No es que tenga una respuesta, pero es casi seguro porque se está incrustado como un mapa de bits sin comprimir, en lugar de una representación comprimida como JPEG. –

Respuesta

5

Una imagen en un archivo RTF se almacena como un WMF, sin comprimir. En mac, sería macpict. Su mejor opción para mantener el tamaño del archivo bajo es vincular la imagen al documento en lugar de insertar una copia en el documento. La desventaja es que tienes que mantener los archivos juntos.

EDITAR está comprimiendo al RTF es una opción? Usando zip/rar, recuperará el tamaño de su archivo, pero tendrá que descomprimir, primero obviamente. Se supone que hay herramientas que harán compresión rtf, pero nunca las he usado.

+0

Gracias. Zipping no ayudaría, aún necesitaría descomprimir para procesar el archivo. El problema no es el tamaño de almacenamiento del archivo; es el tiempo que lleva procesar el RTF. No entiendo acerca de la vinculación: probablemente carezco de habilidades de Word ... ¿es posible hacer que Word haga un hipervínculo a una URL y mostrar el contenido de esa URL en el documento? Puedo hacer que mis imágenes estén disponibles fácilmente a través de una URL. Mientras la imagen aparezca en el documento para el lector y el lector no tenga que hacer nada para obtener la imagen, me alegraré (es decir, no quiero que mis usuarios tengan que hacer clic en un enlace) –

+0

Agregar un hipervínculo es fácil desde la propia palabra o VBA, pero lo siento, no sé cómo hacer que la imagen sea visible dentro del documento rtf, pero no tenga una copia del WMF dentro.Las capturas de pantalla tienden a ser mucho más grandes de lo que deberían ser si tiene fondos que no sean blancos, por ejemplo. Puede considerar editar sus imágenes y guardarlas como bmp. El formato bmp le dará una idea de cuán grande será el wmf. ¿Cuánta información de color pierde guardando como una imagen de 16 bits? – DaveParillo

+0

lo siento, me refiero a la imagen de 16 colores. Acabo de guardar un volcado de mi monitor, originalmente una imagen de 24 bits de 3.5M. Guardado como 16color y es 641K. La imagen tiene algún daño, pero sigue siendo 'útil'. – DaveParillo

15

Aquí es la mejor solución

http://support.microsoft.com/kb/224663

Extracto:

Síntomas

Al guardar un documento de Microsoft Word que contiene una FEM, PNG, GIF, o JPEG como un formato de archivo diferente (por ejemplo, Word 6.0/95 (.doc) o formato de texto enriquecido ( .rtf)), el tamaño del archivo del documento puede aumentar drásticamente.

Por ejemplo, un documento de Microsoft Word 2000 que contiene un archivo JPEG gráfico que se guarda como un documento de Word 2000 puede tener un tamaño de 45.568 bytes (44.5KB). Sin embargo, cuando guarda este archivo como Word 6.0/95 (.doc) o como formato de texto enriquecido ( .rtf), el tamaño del archivo puede crecer a 1,289,728 bytes (1.22MB).

Causa

Esta funcionalidad es por diseño en Microsoft Word. Si se inserta un EMF, un PNG, un GIF o un gráfico JPEG en un documento de Word, cuando se guarda el documento, se guardan dos copias del gráfico en el documento . Los gráficos se guardan en los formatos aplicables EMF, PNG, GIF o JPEG y también se convierten al formato WMF (Metarchivo de Windows).

RESOLUCIÓN

Advertencia si utiliza Editor del Registro incorrectamente, puede provocar problemas graves que pueden requerir que volver a instalar el sistema operativo. Microsoft no puede garantizar que puede resolver problemas que resultan de utilizar incorrectamente el Editor del editor. Use el Editor del Registro bajo su responsabilidad.

Para evitar que Word guarde dos copias de la gráfica en el documento, y para reducir el tamaño de archivo del documento, agregue el valor = 0 cadena ExportPictureWithMetafile en el registro de Microsoft Windows .

+0

La página vinculada trata sobre cómo Word guarda dos copias de la imagen (archivo original y versión no comprimida) y proporciona un cambio de registro que le indica que solo guarde el archivo original. Interesante – codeulike

+0

Creo que esta es una respuesta mejor que la marcada como respuesta. – bfhd

+0

Supongo que nadie sabe cómo lograr el equivalente de WordPad. Traté de agregar el valor de cadena 'ExportPictureWithMetafile = 0' a' HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Applets \ Wordpad \ Options' pero no tuvo efecto aparente. – ulatekh

-1

Sí, eliminando los caracteres redundantes. Y para hacer esto debes insertarlos nuevamente en tu corriente. Por ejemplo, si tiene más de veinte caracteres f en una línea, puede reemplazarlos con f [20] en la secuencia. Es un comienzo.

-Mejor suerte.

1

Hemos hecho un proyecto similar en el trabajo. Solo que no estamos usando esa funcionalidad "Insertar/Imagen/Desde archivo ...". Nuestra plantilla tiene una etiqueta llamada [fotos], ya que presumo que la suya también. Cuando procesamos el documento, reemplazamos la etiqueta con los códigos RTF necesarios para mostrar las imágenes. Los estamos poniendo dentro de una tabla y estamos mostrando dos imágenes en cada fila, más una fila en la parte superior para el título.

Por lo tanto, puede colocar una etiqueta [fotos] en su plantilla. Luego reemplaza la etiqueta con los Códigos RTF. Puede encontrar algunas buenas referencias a estos códigos en la web. Por ej. here .

Ahora, mi código es como la siguiente:

\ par {\ rtf1 \ ansi \ deff0 {\ trowd \ cellx8810 {título} \ intbl \ QC \ células \ fila} { \ trowd \ cellx4405 \ cellx8810 {\ PICT \ jpegblip \ picwgoal4000 \ pichgoal3000 \ piccropl-50 \ piccropr-50 \ piccropt-50 \ piccropb-50 \ hexagonal Su imagen como una matriz de bytes en hexadecimal} \ intbl \ cell {\ pict \ jpegblip \ picwgoal4000 \ pichgoal3000 \ piccropl-50 \ piccropr-50 \ piccropt-50 \ piccropb-50 \ hex Su otra imagen} \ intbl \ células \ fila}

si recibe su imagen en una matriz de bytes, es posible utilizar BitConverter.ToString (matriz) para obtener su código hexadecimal. solo tendrá que reemplazar los guiones "-" por "";

Nuestros archivos ocuparán menos de 1/10 del espacio de un RTF "normal". Si abrimos el código del documento con un editor como Notepad ++, podemos ver los códigos RTF, pero si abrimos el documento y lo guardamos como RTF (cambiando su nombre), ¡irá de 1.5Mb a 50Mb! Supongo que la respuesta de DaveParillo lo justifica: solo escribo cada imagen una vez.

Espero que ayude. Cheers compañero

0

La respuesta Swartbees funcionó perfectamente para mí. Primero reduje la calidad de la imagen a "0" usando G.I.M.P. Guardar como funcionalidad jpeg. Después de seguir la solución de Microsoft sugerida por Swartbees arriba, reinserté la imagen en el archivo y el aumento de tamaño fue insignificante de 229 k a 279 k (en comparación con 29000 kb).

Gracias por sus sugerencias chicos.

1

Inicialmente, tenga en cuenta que cada byte se almacena utilizando 2 caracteres (dos bytes), esto significa que los incrementos al menos es el doble de la imagen original.

Otras cosas que necesita es que Word y Word Pad inserten diferentes (sabor o formato) de la misma imagen más otros campos (que RTF puede mostrarse sin ellos).

Éstos son algunos scripts utilizados para insertar imágenes en formato RTF (https://joseluisbz.wordpress.com/2011/06/22/script-de-clases-rtf-para-jsp-y-php/), y un ejemplo de su uso (https://joseluisbz.wordpress.com/2011/07/16/subiendo-imagenes-png-y-jpg-y-archivos-a-mysql-con-php-y-jsp-y-mostrarlos-en-rtf-usando-clases/)

Ahora, tal vez usted necesitará reemplazar la imagen original con otra (http://joseluisbz.wordpress.com/2013/07/26/exploring-a-wmf-file-0x000900/).

Cuestiones relacionadas