Konwertowanie plików .docx na zwykły tekst i zachowanie podziałów linii w celu zachowania odniesień numerów linii do dokumentu źródłowego: instrukcje i implikacje?


9

Eksportuję zawartość MS Word do zwykłego tekstu do użytku z narzędziami tekstowymi i do plików. Mam ograniczenie, w którym funkcja numeracji linii została włączona w oprogramowaniu MS, a wszelkie odniesienia do numerów linii na końcowym wyjściu muszą pasować do tej numeracji. Więc wpisz „linie numeracyjne”:

wprowadź opis zdjęcia tutaj ( Poe, EA )

Oczywiście w przypadku programu Word tego rodzaju numeracja nie przerywa linii na nowej linii , ale przerywa „linie” po odpowiednim marginesie (lub czymś innym). docx2txtWygląda na to, że skrypt domyślnie nie bierze tego pod uwagę i przerywa wiersze na nowej linii. Więc jeśli używam grep -nz numeracją, linie nie będą pasować do funkcji numerów linii źródłowych, jak pokazano powyżej. Z dokumentacji nie wynika jasno, jak musiałbym edytować skrypt Perla, aby przekonwertować pliki tak, jak muszę w tym przypadku:

our $config_newLine = "\n"; # Alternative is "\r\n".
our $config_lineWidth = 80; # Line width, used for short line justification.

Próbowałem zastępując \nna \r\nale to nie wydają się działać dla mnie. Dlatego postanowiłem wyeksportować dokumenty bezpośrednio z Worda z następującymi ustawieniami (zapisz jako zwykły tekst , w wersji 203,33pc):

  • Unicode (UTF-8)
  • Wstawianie podziałów linii + linii końcowych za pomocą (CR / LF)
  • Zezwalaj na zastępowanie postaci

A teraz, kiedy rzeczywiście korzystać z .txtplików nie jest idealne dopasowanie pomiędzy numerami linii w funkcji numerowania źródło i grep -nwyjście.


  • Czy jest jakaś konkretna konfiguracja / proces, o którym powinienem wiedzieć, docx2txtlub podobne narzędzie wiersza poleceń, które pozwoliłoby mi przekonwertować pliki .docx na zwykły tekst, zachowując podziały wierszy, bez uciekania się do programu Word tak jak ja?
  • Jakie są najlepsze praktyki , jeśli takie istnieją, do eksportowania dokumentów MS Word (które mogą zawierać znaki akcentowane) do zwykłego tekstu do użytku z narzędziami do plików / tekstu, w odniesieniu do podziałów linii i formatowania; i czy są jakieś negatywne konsekwencje dla ustawień, które wybrałem do eksportu, tj. wstawienia CR / LF?

Próba

Zgodnie z sugestią podam próbkę. W tym rar archiwum , ja dołączone do .docx plik z prostych punktach, a jej eksportowane .txt plik za pomocą programu Word z wymienionych powyżej opcji. Ten ostatni można porównać z domyślnym uruchomieniem docx2txtpliku źródłowego.


Czy możesz podać przykładowy plik?
cuonglm,

Czy nie możesz zapisać go jako pliku TXT z programu Word? Jeśli daje to złe formatowanie, sugeruję użycie vima lub emacsa do rozwiązania problemu (bo jestem pewien, że jest wzorzysty).
Steven Walton,

1
@Steven Walton Dziękuję, tak, działa, gdy eksportuję do txt z Worda. Ale nie chcę używać Worda, o to mi chodzi. Chciałbym móc polegać tylko na skrypcie, aby to zrobić. Chcę proces partii.

@Gnouc Próbka została dostarczona. Dziękuję Ci!

Odpowiedzi:


8

docx2txtdziała na informacje w docxpliku, który jest skompresowanym zestawem plików XML.

Jeśli chodzi o zawijanie wierszy, .docxdane XML zawierają tylko informacje o akapitach i przerwach, a nie o przerwach. Łagodne przerwy są wynikiem renderowania tekstu w określonej czcionce, rozmiarze czcionki i szerokości strony. docx2txtzwykle próbuje dopasować tekst do 80 kolumn (80 kolumn można konfigurować), bez względu na czcionkę i rozmiar czcionki. Jeśli .docxzawierasz informacje o czcionce z systemu Windows, który nie jest dostępny w systemach Unix / Linux, wykonanie eksportu do .txtOpen / LibreOffice również nie zapewniłoby tego samego układu, chociaż próbuje zrobić dobrą robotę¹.

Tak więc docx2txtani żadne inne narzędzie wiersza poleceń, w tym oparte na wierszu poleceń przetwarzanie Open / LibreOffice, nie gwarantuje konwersji tekstu do tego samego układu, co eksportowanie z programu Word².

Jeśli chcesz (lub wymuszają to wymagania klienta), aby renderować dokładnie tak, jak robi to Word, z mojego doświadczenia wynika, że ​​jest tylko jeden sposób: pozwól Wordowi wykonać renderowanie. Kiedy napotkałem podobny problem jak twój3 i miałem niezgodne wyniki przy użyciu innych narzędzi, w tym OpenOffice, wróciłem do instalowania maszyny wirtualnej z systemem Windows na serwerze Linux-a. Na klienckiej maszynie wirtualnej program obserwuje przychodzące pliki do przekonwertowania na hoście, które uruchamiają program Word i wykonują konwersję, a następnie kopiują wynik back.

Decyzje dotyczące używania tylko CR / LF lub LF, UTF-8 lub innego kodowania w .txtdużej mierze zależą od sposobu wykorzystania plików wynikowych. Jeśli pliki wynikowe są używane w systemie Windows, zdecydowanie wybrałbym CR / LF, UTF-8 i BOM UTF-8 . Współczesne programy w systemie Linux są w stanie wywnioskować, że plik ma format UTF-8, ale nie blokują specyfikacji materiałowej i / lub wykorzystują te informacje. Powinieneś przetestować wszystkie aplikacje docelowe pod kątem zgodności, jeśli są one znane z góry.

¹ Ten rodzaj niezgodności jest głównym powodem, dla którego niektórzy moi znajomi nie mogą przejść na system Linux z systemu Windows, chociaż chcieliby. Muszą używać MicroSoft Word, ponieważ Open / LibreOffice co jakiś czas zmienia teksty wymieniane z klientami.
² Możesz zainstalować wszystkie czcionki używane w plikach Word i czasami mieć szczęście do niektórych tekstów.
³ Renderowanie plików PDF z.doc/.docx
Program korzysta z automatyzacji GUI - tak jakby ktoś klikał jego menu - i nie próbuje prowadzić programu Word za pomocą interfejsu API. Jestem całkiem pewien, że to drugie da się zrobić i miałbym tę zaletę, że nie zepsuje rzeczy, jeśli Word zostanie zaktualizowany


Dziękuję, to jest naprawdę wnikliwe! Nie byłem zaznajomiony z tym formatem, ale wywołałem skrypt z vimi mogłem zobaczyć, że naprawdę chodzi o xml - powinienem przyjrzeć się temu. Nie myślałem o czcionkach, a może nawet dzieleniu wyrazów. Również podczas niektórych operacji otrzymałem wiadomość od edytora tekstu narzekań na BOM, więc przeczytam link (ponieważ nie miałem pojęcia, co to było). Zaskoczyło mnie twoje rozwiązanie VM! Jestem nieco zaznajomiony z automatyzacją GUI - widziałem, że była używana do budowy stacji roboczej po replikacji obrazu podstawowego; nie myślałem o tym ...

W końcu to znaczy, że ktoś dzieje Soho z takich zadań może być konieczne do internalizacji kosztów kilku licencji. Może któregoś dnia zrobią warstwę z interfejsem API dla poszczególnych użytkowników. Łamanie linii podczas miękkich przerw całkowicie zmienia dynamikę korzystania z narzędzia takiego jak grep; jeśli linie są długie, zmniejsza to „precyzję” na wyjściu. Sądzę, że ograniczenia różnią się w zależności od charakteru treści i sposobu jej wykorzystania. Z drugiej strony takie pytania nie byłyby, gdyby dokumenty nie opierały się tutaj na funkcji numeracji słów. Tworzenie frameworku dokumentów w celu objęcia starszych materiałów to poważna sprawa. Twoje zdrowie!
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.