Jak przekonwertować dokument Word na pdf?

10

Pomóżcie ludziom, moje zadanie mówi, że musi być w formacie .pdf, ale zrobiłem to w programie Word. Naprawdę utknąłem.

Jak pobrać dokument tekstowy w formacie .docx i utworzyć plik .pdf zawierający cały tekst? Punkty bonusowe, jeśli zawiera również wszystkie obrazy i dowolne formatowanie, ale tekst jest absolutnym minimum. Przykładowy plik, którego będę używać, będzie tym , chociaż twoje rozwiązanie powinno być ogólne.

Nie chcę, aby przechodził przez niepotrzebne etapy przetwarzania - po prostu kodowanie, a następnie dekodowanie dokumentu w base64 lub cokolwiek innego, co nie jest zgodne z duchem pytania, chociaż twórcze użycie cowsaybędzie wyjątkiem. Obowiązują standardowe zasady trollowania kodu - rozwiązanie powinno być technicznie poprawne, wszystkie kroki powinny być technicznie konieczne, wynik powinien być technicznie bezużyteczny. Powinien to być raczej program w stylu „Rube Goldberg”, niż konkurs zaciemniania i tępoty.

Większość głosów pozytywnych na odpowiedzi inne niż moje do 14/1 wygrywa.

Uwaga: jest to pytanie . Proszę nie brać poważnie pytania i / lub odpowiedzi. Więcej informacji tutaj .

ymbirtt
źródło
2
To zadanie jest skomplikowane, ale jestem pewien, że jedynym właściwym podejściem byłoby użycie modułu obsługi podglądu w aplikacji WPF, zrobienie zrzutu ekranu, zapisanie mapy bitowej jako GIF, a następnie wydrukowanie jej jako PDF
Mathias R , Jessen
Trollowanie kodów jest w trakcie usuwania, zgodnie z oficjalnym stanowiskiem. Ten post ma sporą liczbę głosów na pytanie i odpowiedzi, i chociaż otrzymał ponad 50% głosów „usuń” w ankiecie , jest jednym z lepiej określonych postów [trollowanie kodu]. Dlatego zamykam to dla znaczenia historycznego.
Klamka

Odpowiedzi:

24

Ok, jest to trochę trudne, ale nie jest tak złe, ponieważ pdf używa tego samego modelu graficznego co PostScript, co oznacza, że ​​kiedy masz już PostScript, konwersja go do formatu PDF jest dość trywialna, a PostScript jest sposobem na napędzanie drukarek, wystarczy wydrukować dostać PostScript.

Teraz możesz napisać program do konwersji Postscript na pdf, ale nie musimy mieć ghostscript, który został napisany dla Uniksa i działa dobrze na Linuksie (bez większych różnic w tym projekcie). Niestety słowo działa tylko w systemie Windows, więc potrzebujesz dwóch komputerów, a aby przekonać system Windows, że komputer z systemem Linux jest drukarką, potrzebujesz kabla szeregowego i zerowego modemu. Jeśli twój komputer nie ma portów szeregowych konwertery USB na RS232 działają dobrze (zalecam te z chipsetem fttdi). Teraz podłącz dwa komputery kablem szeregowym i modemem zerowym i sprawdź, czy możesz się komunikować (upewnij się, że parametry są zgodne).

Ok, skoro już rozmawiasz, nadszedł czas, aby przekonać okno systemu Windows, że Linux jest drukarką: po prostu zainstaluj sterownik drukarki dla applewriter II i powiedz, że jest podłączony do portu szeregowego. Teraz, kiedy drukujesz, wysyłasz PostScript do pola linux. następnym krokiem jest zapisanie go jako plik.

Teraz przejdź do swojego Linux-a i użyj tego prostego polecenia:

dd -if=/dev/ttyS0 -of=- -bs=1 | ps2pdf - - | sed -e '' >tmpfile && mv tmpfile file.pdf

i tak proste, jak skończone.


Można to faktycznie uruchomić (jeśli wyślesz sygnał do dd, gdy skończysz), ale istnieją łatwiejsze sposoby, takie jak drukowanie do pliku i uruchamianie gostscript na twoim Windows Window, i chociaż fttdi robi dobrej jakości usb do konwerterów szeregowych, jest to królewski ból w instalacji sterowników.

Hildred
źródło
2
Chociaż testowanie tego jest poza moim zasięgiem, trochę czytania w tle sugeruje, że jest to zarówno poprawne, jak i okropne. Dobra robota!
ymbirtt
6
Myślałem o dołączeniu instrukcji tworzenia modemu zerowego, tak więc potrzebna była lutownica.
hildred
13

Obecnie wiele drukarek to kombinacja drukarki / skanera z automatycznymi podajnikami dokumentów. To będzie proste.

  1. Wydrukuj dokument.
  2. Zeskanuj wydruk.
emory
źródło
3
Tak ludzie to robią ... Chciałbym żartować. A to jest trolling kodu , gdzie jest twój kod?
derobert
9

PHP

Ten kod tworzy pliki PDF, które powinny być idealnie wydrukowane na maszynie taśmowej . Jeśli chcesz wyświetlić pliki PDF na monitorze, być może trzeba trochę powiększyć.

Przykładowy dokument źródłowy dokument słowny

Wyjście PDF (przeglądane w przeglądarce) częściowy widok dokumentu PDF

Kod źródłowy

<?php

header("Content-Type: application/pdf");

$s = docx2txt("word-file.docx"); // <-- Insert filename here!
echo txt2pdf($s);


function docx2txt($filename) {
  if (!($z=zip_open($filename))) return false; // Can't open file
  while ($r=zip_read($z)) {
    if (zip_entry_name($r)!="word/document.xml") continue;
    if (!zip_entry_open($z,$r)) return false; // Can't open XML data
    for ($s="";;) {
      $c=zip_entry_read($r);
      if ($c===false || $c=="") break;
      $s.=$c;
    }
    return trim(preg_replace('/\s+/',' ',preg_replace('/<[^>]*>/','',$s)));
  }
  return false; // Can't find XML data
}


function txt2pdf($text) {
  $width="".ceil(strlen($text)*7.2);
  $text=str_replace('(','\050',str_replace(')','\051',$text));
  $length=strlen($text);
  $wlen=strlen($width);
  $len4="".(44+$length);
  $xr3=sprintf("%010d",174+$wlen);
  $xr4=sprintf("%010d",449+$wlen);
  $xrstart=544+$wlen+strlen($len4)+$length;
  return "%PDF-1.1\n%¥±ë\n\n1 0 obj\n  << /Type /Catalog\n     /Pages 2 0 R\n" .
         "  >>\nendobj\n\n2 0 obj\n  << /Type /Pages\n     /Kids [3 0 R]\n   " .
         "  /Count 1\n     /MediaBox [0 0 $width 14]\n  >>\nendobj\n\n3 0 obj" .
         "\n  <<  /Type /Page\n      /Parent 2 0 R\n      /Resources\n       " .
         "<< /Font\n           << /F1\n               << /Type /Font\n       " .
         "           /Subtype /Type1\n                  /BaseFont /Courier\n " .
         "              >>\n           >>\n       >>\n      /Contents 4 0 R\n" .
         "  >>\nendobj\n\n4 0 obj\n  << /Length $len4 >>\nstream\n  BT\n    /" .
         "F1 12 Tf\n    0 3 Td\n    ($text) Tj\n  ET\nendstream\nendobj\n\nxr" .
         "ef\n0 5\n0000000000 65535 f \n0000000018 00000 n \n0000000077 00000" .
         " n \n$xr3 00000 n \n$xr4 00000 n \ntrailer\n  <<  /Root 1 0 R\n    " .
         "  /Size 5\n  >>\nstartxref\n$xrstart\n%%EOF";
}

?>

Uwaga: txt2pdf()funkcja oparta jest na minimalnym pliku PDF stworzonym przez Brendana Zagaeskiego.

r3mainer
źródło
Gdzie jest troll?
Nacib Neme
5

W systemach UNIX:

mv document.docx document.pdf && cowsay "code-trolling is cool"

W systemie Windows:

ren document.docx document.pdf
s3lph
źródło
3
uwaga: oczywiście nie zadziała ... Po prostu
uznałem
4

Uważam, że ten skrypt powłoki jest prostą i intuicyjną metodą rozwiązania problemu. Czy jest lepszy sposób?

( echo $'<svg>\n<text y="10">';
  unzip -p ./YOUR_FILENAME_HERE.docx word/document.xml |
  sed -e 's/<[^>]\{1,\}>//g; s/[^[:print:]]\{1,\}//g';
  echo $'\n</text>\n</svg>' ) |
inkscape -f /dev/fd/0 -D -A ./OUTPUT_FILENAME_HERE.pdf
ymbirtt
źródło
1
„dlaczego to zamienia się na dyskietkę?”;)
hildred
0

Pakiet Windows

Najprostszym sposobem konwersji pliku: zmień rozszerzenie!

:: convert.cmd

xcopy "%~dpnx0" "%~dpn0.pdf"

Spoiler / troll: (najedź poniżej, aby zobaczyć)

Ups ... zapomniałem, że możesz przekonwertować nawet plik z .exerozszerzeniem? Tyle za to ...;) Poza tym jestem zbyt leniwy, by kodować strażników.
Pomyślałem, że dodam do tego trochę dodatkowego trolla: nawet nie dotyka danych w środku ... (nie analizuje go, aby był prawidłowym plikiem PDF)

Isiah Meadows
źródło