Como faço para converter um documento do Word em PDF?


10

Ajude os caras que minha tarefa diz que precisa estar no formato .pdf, mas eu fiz no Word. Eu estou realmente preso.

Como pego um documento do Word no formato .docx e faço um .pdf que contém todo o texto dele? Pontos de bônus se ele também contiver todas as imagens e qualquer formatação, mas o texto é mínimo. O arquivo de exemplo que utilizarei será este , embora sua solução deva ser genérica.

Eu não quero que ele passe por etapas desnecessárias de processamento - simplesmente codificando e decodificando o documento em base64 ou o que não estiver no espírito da pergunta, embora o uso criativo de cowsayseja uma exceção a isso. Aplicam-se regras padrão de rastreamento de código - a solução deve ser tecnicamente correta, todas as etapas devem ser tecnicamente necessárias, o resultado deve ser tecnicamente inútil. Isso deve ser mais um programa de estilo "Rube Goldberg" do que uma competição de ofuscação e obtusão.

A maioria dos votos positivos em respostas diferentes das minhas em 1/5/14 vence.

Nota: Esta é uma pergunta de . Por favor, não leve a sério a pergunta e / ou respostas. Mais informações aqui .


2
Essa atribuição é complexa, mas tenho certeza de que a única abordagem adequada seria usar um manipulador de visualização em um aplicativo WPF, tirar uma captura de tela disso, salvar o bitmap como um GIF e imprimi-lo como um PDF
Mathias R Jessen

A trollagem de código está sendo removida, conforme a posição oficial. Esta postagem possui uma quantidade razoável de votos na pergunta e nas respostas, e mesmo tendo recebido mais de 50% de votos "excluídos" na enquete , é uma das postagens mais bem especificadas [de controle de código]. Portanto, estou bloqueando-o por significado histórico.
Maçaneta

Respostas:


24

Ok, isso é um pouco complicado, mas não é tão ruim, porque o pdf usa o mesmo modelo gráfico do postscript, o que significa que, depois de ter o postscript, é bastante trivial convertê-lo para pdf e o postscript é uma maneira de impulsionar as impressoras. Tudo o que você precisa fazer é imprimir em obter postscript.

Agora você pode escrever um programa para converter postscript em pdf, mas não precisamos do ghostscript, que foi escrito para unix e funciona muito bem no linux (sem grandes diferenças para este projeto). Infelizmente, o word é executado apenas no Windows, então você precisa de dois computadores e, para convencer o Windows de que o computador Linux é uma impressora, é necessário um cabo serial e um modem nulo. Se o (s) seu (s) computador (es) não possuem portas seriais, os conversores usb para rs232 funcionam muito bem (eu recomendo aqueles com um chipset fttdi). Agora conecte os dois computadores com o cabo serial e o modem nulo e verifique se você pode se comunicar (verifique se seus parâmetros correspondem).

Ok, agora que você os fala, é hora de convencer a sua caixa do Windows de que a caixa Linux é uma impressora: basta instalar o driver da impressora para a máquina de escrever II e dizer que está conectado à porta serial. Agora, quando você imprime, envia o postscript para a caixa do linux. o próximo passo é salvá-lo como um arquivo.

Agora vá direto para a sua caixa Linux e use este comando simples:

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

e tão simples quanto isso.


Na verdade, isso pode funcionar (se você enviar um sinal para dd quando terminar), mas existem maneiras mais fáceis, como imprimir em um arquivo e executar gostscript na caixa do Windows, e embora o fttdi produza conversores USB para serial de boa qualidade, é uma dor real para instalar os drivers.


2
Embora testar isso esteja além do meu alcance, um pouco de leitura em segundo plano sugere que isso é válido e horrível. Bom trabalho!
ymbirtt

6
Pensei em incluir instruções para fazer um modem nulo, para que fosse necessário um ferro de soldar.
Hildred

13

Atualmente, muitas impressoras combinam impressora / scanner com alimentadores automáticos de documentos. Vai ser simples.

  1. Imprima o documento.
  2. Digitalize a impressão.

3
É assim que as pessoas realmente fazem isso ... eu queria estar brincando. E isso é trolling de código , onde está o seu código?
derobert

9

PHP

Esse código produz arquivos PDF que devem ser impressos perfeitamente em sua máquina de fita . Se você deseja visualizar os arquivos PDF no seu monitor, pode ser necessário aumentar um pouco o zoom.

Exemplo de documento de origem documento do Word

Saída em PDF (visualizada no navegador) vista parcial do documento PDF

Código fonte

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

?>

Nota: A txt2pdf()função é baseada em um arquivo PDF mínimo criado por Brendan Zagaeski.


Cadê o troll?
Nacib Neme

5

Nos sistemas UNIX:

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

No Windows:

ren document.docx document.pdf

3
Nota: não vai funcionar, é claro ... Apenas achei engraçado
s3lph

4

Acredito que esse script de shell seja um método simples e intuitivo de resolver o problema. Existe uma maneira melhor?

( 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

11
"por que isso
muda


0

Lote do Windows

A maneira mais fácil de converter um arquivo: altere a extensão!

:: convert.cmd

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

Spoiler / troll: (passe o mouse abaixo para ver)

Opa ... esqueci que você pode converter até um arquivo com uma .exeextensão? Tanta coisa para isso ...;) Além disso, estou com preguiça de codificar os guardas.
E pensei em adicionar um troll extra nisso: ele nem toca nos dados internos ... (não o analisa para torná-lo um PDF válido)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.