2009-09-10 44 views
13

Mamy kod, który tworzy dokument RTF z szablonu RTF. Zasadniczo polega na wyszukiwaniu ciągów i zastępowaniu specjalnych znaczników w pliku RTF. Jest to dostępne za pośrednictwem strony internetowej.Jak zmniejszyć rozmiar pliku RTF z osadzonymi obrazami?

Zazwyczaj czas przetwarzania jest bardzo szybki.

Musimy jednak osadzić obraz w szablonie. Umieściliśmy je jako obrazy JPEG za pomocą funkcji "Wstaw/Obraz/Z pliku ..." Worda. Ale okazało się, że wynikowy rozmiar pliku RTF jest bardzo zależny od obrazu.

Na przykład wstawiłem logo JPEG 20k (które jest w zasadzie jednolitym tłem z pewnym tekstem). Plik RTF zwiększył rozmiar z około 390 tys. (Bez obrazu) do 510 tys. (Z obrazem).

Następnie wstawiliśmy plik JPEG zawierający zrzut ekranu, tzn. Obraz zawiera tekst, wiele kolorów itp. JPEG wynosi około 150k. Za pomocą tego obrazu, plik RTF zwiększył rozmiar z 390k do 3.5MB.

Kodowanie używane przez program Word do przechowywania obrazów w formacie RTF nie działa liniowo. Zgaduję, że zależy to od tego, co jest na obrazie JPEG.

Potrzebuję ograniczyć rozmiar szablonów RTF do minimum, aby ograniczyć czas przetwarzania plików do minimum.

  • Czy ktoś ma jakieś pomysły, jak zminimalizować rozmiar plików RTF z osadzonymi obrazami?
  • Czy istnieje sposób kontrolowania kodowania używanego przez program Word? Nigdzie nie widzę żadnych opcji.
  • Czy ktoś wie, jakiego rodzaju kodowania binarnego używa Word/RTF?

Z góry dziękuję.

+2

Nie dlatego, że mam odpowiedź, ale prawie na pewno, ponieważ jest ona osadzana jako nieskompresowana bitmapa, a nie skompresowana reprezentacja, taka jak JPEG. –

Odpowiedz

5

Obraz w pliku RTF zostaje zapisany jako WMF, nieskompresowany. Na macu byłoby to makpict. Najlepszym sposobem, aby zmniejszyć rozmiar pliku, jest połączenie obrazu z dokumentem, zamiast wstawiania kopii do dokumentu. Kompromis polega na tym, że musisz przechowywać pliki razem.

EDYTOWANIECzy kompresja RTF jest opcją? Używając zip/rar, odzyskasz rozmiar pliku, ale najpierw będziesz musiał go zdekompresować. Mają być narzędzia, które wykonają kompresję rtf, ale nigdy ich nie używałem.

+0

Dzięki. Zipping nie pomoże - nadal będę musiał rozpakować, aby przetworzyć plik. To nie rozmiar pamięci masowej to mój problem - czas na przetworzenie RTF. Nie rozumiem linku - prawdopodobnie brakuje mi umiejętności Worda ... czy możliwe jest uzyskanie od Worda hiperłącza do adresu URL i wyświetlenie zawartości tego adresu URL w dokumencie? Mogę łatwo udostępnić moje zdjęcia za pośrednictwem adresu URL. Tak długo, jak obraz pojawia się w dokumencie dla czytelnika, a czytelnik nie musi nic robić, aby uzyskać obraz, wtedy będę szczęśliwy (tj. Nie chcę, aby moi użytkownicy musieli kliknąć łącze) –

+0

Dodanie hiperłącza jest łatwe albo z samego słowa, albo z VBA, ale przykro mi, nie wiem, jak mieć obraz widoczny w dokumencie rtf, ale nie mam w nim kopii WMF.Zrzuty ekranu wydają się być znacznie większe, niż na przykład, jeśli masz inne niż białe tło. Możesz rozważyć edycję swoich zdjęć i zapisanie ich jako plików bmp. Format bmp da ci pojęcie o tym, jak duży będzie Wmf. Ile informacji o kolorach tracisz zapisując jako obraz 16-bitowy? – DaveParillo

+0

Przepraszam - miałem na myśli 16 kolorów. Właśnie zapisałem zrzut mojego monitora - pierwotnie obraz 24-bitowy 3,5M. Zapisany jako 16 kolorów i 641K. Obraz robi pewne obrażenia, ale nadal jest "możliwy do wykonania" – DaveParillo

15

Tutaj jest najlepszym rozwiązaniem

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

Fragment:

Symptomy

Po zapisaniu dokumentu programu Microsoft Word, który zawiera grafikę EMF, PNG, GIF, lub grafikę JPEG w innym formacie pliku (na przykład Word 6.0/95 (.doc) lub Rich Text Format ( .rtf)), rozmiar pliku dokumentu może znacznie wzrosnąć.Na przykład dokument programu Microsoft Word 2000 zawierający grafikę JPEG zapisaną jako dokument Word 2000 może mieć rozmiar pliku wynoszący 45,568 bajtów (44,5 KB). Jednak po zapisaniu tego pliku jako Word 6.0/95 (.doc) lub jako Rich Text Format ( .rtf), rozmiar pliku może wzrosnąć do 1,289,728 bajtów (1,22 MB).

PRZYCZYNA

Ta funkcjonalność jest zgodne z projektem programu Microsoft Word. Jeśli w dokumencie programu Word EMF, grafie PNG, GIF lub JPEG zostaną wstawione do dokumentu Word, , dwie kopie grafiki zostaną zapisane w dokumencie . Grafika jest zapisywana w odpowiednim formacie EMF, PNG, GIF lub JPEG i jest również konwertowana do formatu WMF (Windows Metafile).

UCHWAŁA

Ostrzeżenie Jeśli używasz Edytor rejestru nieprawidłowo, może stać się przyczyną poważnych problemów, które mogą konieczna będzie ponowna instalacja systemu operacyjnego. Firma Microsoft nie może zagwarantować, że można rozwiązać problemy wynikające z nieprawidłowego użycia Edytora rejestru Rejestru. Korzystaj z Edytora rejestru na własne ryzyko.

Aby uniemożliwić zapisywanie Słowo od dwóch kopii grafiki w dokumencie, i aby zmniejszyć rozmiar pliku dokumentu, dodaj ExportPictureWithMetafile wartość = 0 ciąg do Microsoft Windows rejestrze.

+0

Strona połączona dotyczy tego, w jaki sposób program Word zapisuje dwie kopie obrazu (oryginalny plik i nieskompresowaną wersję) i podaje zmianę w rejestrze, która nakazuje mu tylko zapisanie oryginalnego pliku. Interesujące – codeulike

+0

Myślę, że jest to lepsza odpowiedź niż ta oznaczona jako odpowiedź. – bfhd

+0

Nie przypuszczam, że ktoś wie, jak osiągnąć odpowiednik dla WordPada? Próbowałem dodać wartość ciągu 'ExportPictureWithMetafile = 0' do' HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Applets \ Wordpad \ Options', ale nie przyniosło to widocznego efektu. – ulatekh

-1

Tak, usuwając zbędne znaki. Aby to zrobić, musisz wstawić je z powrotem do strumienia. Na przykład, jeśli masz ponad dwadzieścia ff znaków w jednym wierszu, możesz zastąpić f [20] w swoim strumieniu. To jest początek.

-Brak szczęścia.

1

Zrobiliśmy podobny projekt w pracy. Tylko nie używamy tej funkcji "Wstaw/Obraz/Z pliku ...". Nasz szablon ma tag o nazwie [photos], jak przypuszczam, że twój też. Kiedy przetwarzamy dokument, zastępujemy go kodami RTF potrzebnymi do wyświetlania obrazów. Umieszczamy je w tabeli i wyświetlamy dwa obrazy w każdym rzędzie, a także wiersz na górze tytułów.

Możesz umieścić znacznik [zdjęcia] w swoim szablonie. Następnie zamieniasz tag na kody RTF. Możesz znaleźć dobre referencje do tych kodów w Internecie. Na przykład here .

Teraz mój kod wygląda mniej więcej tak:

\ par {\ rtf1 \ ANSI \ deff0 {\ trowd \ cellx8810 {tytuł} \ intbl \ qc \ komórka \ wiersz} { \ trowd \ cellx4405 \ cellx8810 {\ pic \ jpegblip \ picwgoal4000 \ pichgoal3000 \ piccropl-50 \ piccropr-50 piccropt-50 \ piccropb-50 \ heks obraz nie jest tablicą bajtów w szesnastkowym \} \ intbl \ cell {\ pict \ jpegblip \ picwgoal4000 \ pichgoal3000 \ piccropl-50 \ piccropr-50 \ piccropt-50 \ piccropb-50 \ hex Twój inny obraz} \ intbl \ komórka \ wiersz}

jeśli masz swoje zdjęcie do tablicy bajtów, można użyć BitConverter.ToString (array), aby uzyskać kod szesnastkowy. tylko musisz zastąpić kreski "-" przez "";

Nasze pliki zajmą mniej niż 1/10 wolnej przestrzeni "normalnego" pliku RTF. Jeśli otworzymy kod dokumentu za pomocą edytora takiego jak Notepad ++, zobaczymy kody RTF, ale jeśli otworzymy dokument i zapiszemy go jako RTF (zmieniając jego nazwę), przejdzie z 1.5Mb do 50Mb !! Zgaduję, że odpowiedź DaveParillo usprawiedliwia to: Piszę tylko jeden obraz raz.

Mam nadzieję, że to pomaga. Okrzyki kolega

0

Swartbees odpowiedź działało idealnie dla mnie. Najpierw zmniejszyłem jakość obrazu do "0" przy użyciu G.I.M.P. Zapisz jako funkcję jpeg. Po zastosowaniu rozwiązania Microsoft sugerowanego przez Swartbees powyżej ponownie włożyłem obraz do pliku, a wzrost rozmiaru był znikomy z 229 do 279 tysięcy (w przeciwieństwie do 29 000 kB).

Dzięki za sugestie, chłopaki.

1

Początkowo, należy pamiętać, że każdy bajt jest zapisany za pomocą 2 znaków (dwa bajty), oznacza to, że przyrosty przynajmniej jest dwukrotnie rozmiar oryginalnego obrazu.

Inne rzeczy, które trzeba, że ​​Słowo, a Słowo Pad wstawić inny smak (lub format) z tego samego obrazu powiększonej innych dziedzinach (RTF, że może być wyświetlany bez nich).

Oto niektóre skrypty używane do wstawiania obrazów w formacie RTF (https://joseluisbz.wordpress.com/2011/06/22/script-de-clases-rtf-para-jsp-y-php/), a jednym z przykładów zastosowania (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/)

Teraz, być może trzeba będzie zastąpić oryginalny obraz z innego (http://joseluisbz.wordpress.com/2013/07/26/exploring-a-wmf-file-0x000900/).

Powiązane problemy