Comment convertir un document Word en PDF?

10

Aidez les gars ma mission dit qu'elle doit être au format .pdf mais je l'ai fait dans Word. Je suis vraiment coincé.

Comment prendre un document Word au format .docx et créer un .pdf qui contient tout le texte? Points bonus s'il contient également toutes les images et toute mise en forme, mais le texte est un strict minimum. L'exemple de fichier que j'utiliserai sera celui-ci , bien que votre solution doive être générique.

Je ne veux pas qu'il passe par des étapes de traitement inutiles - simplement encoder puis décoder le document en base64 ou tout ce qui n'est pas dans l'esprit de la question, bien que l'utilisation créative de cowsaysoit une exception à cela. Les règles standard de la pêche au code s'appliquent - la solution doit être techniquement correcte, toutes les étapes doivent être techniquement nécessaires, le résultat doit être techniquement inutile. Cela devrait être plus un programme de style "Rube Goldberg", qu'un concours d'obscurcissement et d'obus.

La plupart des votes positifs sur les réponses autres que les miennes par 5/1/14 victoires.

Remarque: Il s'agit d'une question de . Veuillez ne pas prendre la question et / ou les réponses au sérieux. Plus d'informations ici .

ymbirtt
la source
2
Cette affectation est très complexe, mais je suis certain que la seule approche appropriée serait d'utiliser un gestionnaire d'aperçu dans une application WPF, de prendre une capture d'écran de cela, d'enregistrer le bitmap en tant que GIF, puis de l'imprimer en PDF
Mathias R Jessen
Le code-trolling est en cours de suppression, conformément à la position officielle. Ce message a une bonne quantité de votes sur la question et les réponses, et même s'il a reçu plus de 50% de votes "supprimer" sur le sondage , il est l'un des messages les plus bien spécifiés. Par conséquent, je le verrouille pour une signification historique.
Poignée de porte

Réponses:

24

Ok c'est un peu délicat mais pas trop mal parce que pdf utilise le même modèle graphique que postscript ce qui signifie qu'une fois que vous avez postscript il est assez trivial de le convertir en pdf et postscript est un moyen de piloter des imprimantes tout ce que vous avez à faire est d'imprimer sur obtenir le post-scriptum.

Maintenant, vous pouvez écrire un programme pour convertir le postscript en pdf, mais nous n'y sommes pas obligés, il y a ghostscript, qui a été écrit pour unix et fonctionne très bien sous linux (pas de différences majeures pour ce projet). Malheureusement, Word ne fonctionne que sur Windows, vous avez donc besoin de deux ordinateurs et pour convaincre Windows que l'ordinateur Linux est une imprimante, vous avez besoin d'un câble série et d'un modem nul. Si vos ordinateurs n'ont pas de ports série, les convertisseurs usb en rs232 fonctionnent très bien (je recommande ceux avec un chipset fttdi). Connectez maintenant les deux ordinateurs avec le câble série et le modem nul et vérifiez que vous pouvez communiquer (assurez-vous que vos paramètres correspondent).

Ok maintenant que vous les faites parler, il est temps de convaincre votre boîte Windows que la boîte Linux est une imprimante: installez simplement le pilote d'imprimante pour l'Applewriter II et dites qu'il est connecté au port série. Maintenant, lorsque vous imprimez, vous envoyez un post-scriptum à la boîte Linux. l'étape suivante consiste à l'enregistrer sous forme de fichier.

Passez maintenant à votre boîte Linux et utilisez cette commande simple:

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

et aussi simple que vous avez terminé.


Cela peut en fait fonctionner (si vous envoyez un signal à dd lorsque vous avez terminé), mais il existe des moyens plus simples comme l'impression dans un fichier et l'exécution de gostscript sur votre boîte Windows, et bien que fttdi fasse des convertisseurs USB vers série de bonne qualité, c'est une douleur royale pour installer les pilotes.

hildred
la source
2
Bien que tester cela soit au-delà de mes moyens, un peu de lecture de fond suggère que c'est à la fois valide et horrible. Bon travail!
ymbirtt
6
J'ai pensé à inclure des instructions pour fabriquer un modem nul, juste pour un fer à souder était nécessaire.
hildred
13

De nos jours, de nombreuses imprimantes sont une combinaison imprimante / scanner avec des chargeurs de documents automatiques. Ce sera simple.

  1. Imprimez le document.
  2. Numérisez l'impression.
Emory
la source
3
C'est comme ça que les gens le font ... J'aimerais bien plaisanter. Et, c'est du code-trolling , où est votre code?
derobert
9

PHP

Ce code produit des fichiers PDF qui devraient s'imprimer parfaitement sur votre magnétophone . Si vous souhaitez afficher les fichiers PDF sur votre moniteur, vous devrez peut-être zoomer un peu.

Exemple de document source document Word

Sortie PDF (affichée dans le navigateur) vue partielle du document PDF

Code source

<?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";
}

?>

Remarque: La txt2pdf()fonction est basée sur un fichier PDF minimal créé par Brendan Zagaeski.

r3mainer
la source
Où est le troll?
Nacib Neme
5

Sur les systèmes UNIX:

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

Sous Windows:

ren document.docx document.pdf
s3lph
la source
3
note: ne fonctionnera pas bien sûr ... Je l'
ai
4

Je pense que ce script shell est une méthode simple et intuitive pour résoudre le problème. Y a-t-il une meilleure façon?

( 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
la source
1
"pourquoi cela change-t-il en disquette?";)
hildred
0

Lot Windows

La façon la plus simple de convertir un fichier: changez l'extension!

:: convert.cmd

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

Spoiler / troll: (survolez ci-dessous pour voir)

Oups ... ai-je oublié que vous pouviez même convertir un fichier avec une .exeextension? Voilà pour ça ...;) Aussi, je suis trop paresseux pour coder les gardes.
Et je pensais ajouter un petit troll supplémentaire à cela: il ne touche même pas les données à l'intérieur ... (ne les analyse pas pour en faire un PDF valide)

Isiah Meadows
la source