2009-09-10 13 views
13

Wir haben einen Code, der ein RTF-Dokument aus einer RTF-Vorlage erzeugt. Es macht im Grunde String-Suche und ersetzt spezielle Tags innerhalb der RTF-Datei. Dies ist über eine Webseite zugänglich.Wie kann man die Größe von RTF mit eingebetteten Bildern reduzieren?

In der Regel ist die Verarbeitungszeit dafür sehr kurz.

Wir müssen jedoch ein Bild in eine Vorlage einbetten. Wir haben diese als JPEG-Bilder mit der Funktion "Einfügen/Bild/Von Datei ..." von Word eingebettet. Aber wir haben festgestellt, dass die resultierende RTF-Datei massiv von dem Bild abhängig ist.

Zum Beispiel habe ich ein 20k JPEG-Logo eingefügt (das ist im Grunde ein solider Hintergrund mit etwas Text). Die RTF-Datei wurde von etwa 390k (ohne Bild) auf 510k (mit Bild) vergrößert.

Dann haben wir ein JPEG eingefügt, das einen Screenshot enthält, d. H. Das Bild enthält Text, mehrere Farben usw. Das JPEG ist ungefähr 150k. Mit diesem Image wurde die RTF-Datei von 390 KB auf 3,5 MB vergrößert.

So funktioniert die Codierung, die Word zum Speichern von Bildern in einem RTF verwendet, nicht linear. Ich schätze, es hängt davon ab, was im JPEG-Bild ist.

Ich muss die Größe der RTF-Vorlagen auf ein Minimum beschränken, um unsere Dateiverarbeitungszeiten auf ein Minimum zu beschränken.

  • Hat jemand irgendwelche Ideen, wie man die Größe der RTF-Dateien mit eingebetteten Bildern minimieren kann?
  • Gibt es eine Möglichkeit, die Codierung zu steuern, die Word verwendet? Ich kann nirgends irgendwelche Optionen sehen.
  • Weiß jemand, welche Art von binärer Codierung Word/RTF verwendet?

Vielen Dank im Voraus.

+2

Nicht, dass ich eine Antwort habe, aber es ist fast sicher, weil es als eine unkomprimierte Bitmap eingebettet wird, anstatt eine komprimierte Darstellung wie JPEG. –

Antwort

5

Ein Bild in einer RTF-Datei wird unkomprimiert als WMF gespeichert. Auf Mac wäre es Macpict. Die beste Möglichkeit, die Dateigröße niedrig zu halten, besteht darin, das Bild mit dem Dokument zu verknüpfen, anstatt eine Kopie in das Dokument einzufügen. Der Nachteil ist, dass Sie die Dateien zusammenhalten müssen.

EDIT Komprimiert die RTF eine Option? Mit zip/rar erhalten Sie Ihre Dateigröße zurück, aber Sie müssen zuerst dekomprimieren. Es soll Tools geben, die rtf komprimieren, aber ich habe sie nie benutzt.

+0

Danke. Zippen würde nicht helfen - ich müsste noch entpacken, um die Datei zu verarbeiten. Es ist nicht die Größe des Dateispeichers, das ist mein Problem - es ist die Zeit, die für die Verarbeitung des RTF benötigt wird. ich nicht über die Verknüpfung verstehen - ich bin wahrscheinlich in Word Fähigkeiten fehlt ... ist es möglich, Word eine URL Hyperlink zu erhalten und den Inhalt dieser URL in dem Dokument angezeigt werden? Ich kann meine Bilder einfach über eine URL zur Verfügung stellen. Solange das Bild in dem Dokument für den Leser erscheint und der Leser muss nicht alles tun, um das Bild zu bekommen, dann würde ich gerne (dh ich will nicht meine Benutzer einen Link zu klicken haben) –

+0

Das Hinzufügen eines Hyperlinks ist entweder innerhalb des Worts selbst oder VBA einfach, aber leider weiß ich nicht, wie das Bild im RTF-Dokument sichtbar sein soll, aber keine Kopie der WMF enthält.Bildschirmaufnahmen sind in der Regel viel größer als sie sein müssen, wenn Sie beispielsweise nicht weiße Hintergründe haben. Sie könnten Ihre Bilder bearbeiten und als BMP speichern. Das BMP-Format gibt dir eine Vorstellung davon, wie groß das WMF sein wird. Wie viel Farbinformation verlieren Sie als 16-Bit-Bild? – DaveParillo

+0

Entschuldigung - ich meinte 16 Farbbild. Habe gerade einen Speicherauszug meines Monitors gespeichert - ursprünglich ein 24bit 3,5M Bild. Gespeichert als 16color & es ist 641K. Das Bild nimmt zwar etwas Schaden, ist aber immer noch "einsatzbereit". – DaveParillo

15

Hier ist die beste Lösung

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

Auszug:

SYMPTOME

Wenn Sie ein Microsoft Word-Dokument speichern, die eine EMF enthält, PNG, GIF, oder JPEG-Grafik als ein anderes Dateiformat (z. B. Word 6.0/95 (.doc) oder Rich-Text-Format ( .rtf)), die Dateigröße des Dokuments kann dramatisch zunehmen.Ein Microsoft Word 2000-Dokument, das eine JPEG Grafik enthält, die als ein Word 2000-Dokument gespeichert wird, kann eine Dateigröße von 45,568 Byte (44,5 KB) haben. Zum Anfang Lösung Wenn Sie diese Datei jedoch als Word 6.0/95 (.doc) oder als Rich Text Format ( .rtf) speichern, kann die Dateigröße auf 1,289,728 Bytes (1,22 MB) wachsen.

Ursache

Diese Funktionalität ist von Entwurf in Microsoft Word. Wenn beim Speichern des Dokuments eine EMF-, PNG-, GIF- oder JPEG-Grafik in ein Word-Dokument eingefügt wird, werden zwei Kopien der Grafik im Dokument gespeichert. Grafiken werden im Format EMF, PNG, GIF oder JPEG gespeichert und auch in das WMF-Format (Windows Metafile) konvertiert.

RESOLUTION

Warnung Fehlerhafte Verwendung des Registrierungseditors kann schwerwiegende Probleme verursachen, die Sie können verlangen, das Betriebssystem neu zu installieren. Microsoft kann nicht garantieren, dass Sie Probleme lösen können, die sich aus der Verwendung von Registry Editor falsch ergeben. Benutzen Sie den Registrierungseditor auf eigene Verantwortung.

Wort zu verhindern, Speicher zwei Kopien der Grafik im Dokument, und die Dateigröße des Dokuments zu reduzieren, fügen Sie den ExportPictureWithMetafile = 0 String-Wert auf das Microsoft Windows Registrierung.

+0

Auf der verlinkten Seite wird erläutert, wie Word zwei Kopien des Bildes speichert (Originaldatei und unkomprimierte Version) und eine Registrierungsänderung vornimmt, die nur die ursprüngliche Datei speichert. Interessant – codeulike

+0

Ich denke, das ist eine bessere Antwort als die als Antwort markiert. – bfhd

+0

Ich weiß nicht, jemand weiß, wie das Äquivalent für WordPad zu erreichen? Ich habe versucht, den 'ExportPictureWithMetafile = 0' String Wert zu' HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Applets \ Wordpad \ Optionen' hinzuzufügen, aber es hatte keine offensichtlichen Auswirkungen. – ulatekh

-1

Ja, durch Entfernen der redundanten Zeichen. Um dies zu tun, müssen Sie sie wieder in Ihren Stream einfügen. Zum Beispiel, wenn Sie mehr als zwanzig f Zeichen in einer Zeile haben, dann können Sie in Ihrem Stream mit f [20] ersetzen. Es ist ein Anfang.

- Viel Glück.

1

Wir haben ein ähnliches Projekt bei der Arbeit gemacht. Nur verwenden wir nicht die Funktion "Einfügen/Bild/Von Datei ...". Unsere Vorlage hat ein Tag mit dem Namen [Fotos], da ich davon ausgehe. Wenn wir das Dokument bearbeiten, ersetzen wir das Tag durch die RTF-Codes, die zur Anzeige der Bilder benötigt werden. Wir legen sie in eine Tabelle und wir zeigen zwei Bilder in jeder Reihe plus eine Zeile oben für den Titel.

Sie könnten also ein Tag [Fotos] in Ihrer Vorlage platzieren. Dann ersetzen Sie das Tag mit den RTF-Codes. Sie können einige gute Referenzen zu diesen Codes im Internet finden. Für z. here .

Nun sieht mein Code so etwas wie dieses:

\ par {\ rtf1 \ ansi \ deff0 {\ trowd \ cellx8810 {Titel} \ intbl \ qc \ Zelle \ Reihe} { \ trowd \ cellx4405 \ cellx8810 {\ pict \ jpegblip \ picwgoal4000 \ pichgoal3000 \ piccropl-50 \ piccropr-50 \ piccropt-50 \ piccropb-50 \ hex Ihr Bild als ein Array von Bytes, die in hexadezimal} \ intbl \ zelle {\ pict \ jpegblip \ picwgoal4000 \ pichgoal3000 \ piccropl-50 \ piccropr-50 \ piccropt-50 \ piccropb-50 \ hex Ihre andere Bild} \ intbl \ Zelle \ Reihe}

, wenn Sie Ihr Bild in eine Byte-Array erhalten, können Sie BitConverter.ToString (Array) verwenden, um Ihren Hex-Code zu erhalten. nur Sie müssen Bindestriche ersetzen "-" durch "";

Unsere Dateien benötigen weniger als 1/10 des Speicherplatzes eines "normalen" RTF. Wenn wir die doc-Code mit einem Editor wie Notepad ++ öffnen, können wir den RTF-Codes sehen, aber wenn wir das Dokument öffnen und als RTF (ändert seinen Namen) speichern, wird es von 1,5 MB auf 50 MB gehen !! Ich vermute, dass DaveParillos Antwort es rechtfertigt: Ich schreibe nur jedes Bild einmal.

Ich hoffe, es hilft. Prost Mate

0

Die Swartbees Antwort funktionierte perfekt für mich. Zuerst reduzierte ich die Bildqualität auf "0" unter Verwendung von G.I.M.P. Speichern Sie als JPEG-Funktionalität. Nachdem ich der von Swartbees vorgeschlagenen Microsoft-Lösung gefolgt war, habe ich das Bild wieder in die Datei eingefügt und die Größenzunahme war vernachlässigbar von 229k auf 279k (im Gegensatz zu 29000kb).

Vielen Dank für Ihre Anregungen Jungs.

1

Bedenken Sie zunächst, dass jedes Byte mit 2 Zeichen (zwei Bytes) gespeichert wird. Dies bedeutet, dass die Inkremente mindestens die doppelte Größe des Originalbildes haben.

Andere Dinge, die Sie brauchen, ist, dass Word und Word Pad verschiedene (Geschmack oder Format) des gleichen Bildes sowie andere Felder einfügen (die RTF kann ohne sie angezeigt werden).

Hier sind einige Skripte verwendet, um Bilder in RTF (https://joseluisbz.wordpress.com/2011/06/22/script-de-clases-rtf-para-jsp-y-php/) einzufügen, und ein Beispiel für den Einsatz (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/)

Nun, vielleicht müssen Sie das Originalbild mit einer anderen (http://joseluisbz.wordpress.com/2013/07/26/exploring-a-wmf-file-0x000900/) ersetzen.

Verwandte Themen