如何将Word文档转换为pdf?


10

帮我完成任务的人说它必须是.pdf格式,但我是用Word做到的。我真的被卡住了。

如何获取.docx格式的Word文档,并制作包含其中所有文本的.pdf?如果它还包含所有图像和任何格式,则奖励点,但是文本是最低要求。我将使用的示例文件将是这一个,虽然你的解决方案应该是通用的。

我不希望它经过任何不必要的处理步骤-只是在base64中编码然后解码文档,或者不考虑这个问题的实质,尽管创造性的使用cowsay将是一个例外。代码拖曳的标准规则适用-解决方案在技术上应该正确,所有步骤在技术上都必须,结果在技术上应该是无用的。这应该更多是“ Rube Goldberg”风格的程序,而不是混淆和沉闷的竞争。

除我自己的答案外,大多数人以5/1/14胜率赞成。

注意:这是一个询问问题。请不要认真对待问题和/或答案。更多信息在这里


2
这种分配非常复杂,但是我确信唯一正确的方法是在WPF应用程序中使用预览处理程序,对其进行截图,将位图另存为GIF,然后将其打印为PDF
Mathias R Jessen 2013年

根据官方立场,代码拖曳正在被删除该帖子对问题和答案的投票率很高,即使它在民意测验中获得“删除”投票的比例超过50%,它还是指定次数最多 [code-trolling]帖子之一。因此,我将其锁定为具有历史意义。
门把手

Answers:


24

好的,这有点棘手,但还不算太糟糕,因为pdf使用与Postscript相同的图形模型,这意味着一旦您拥有Postscript,将其转换为pdf就变得很简单了,而Postscript是驱动打印机的方法,您要做的就是打印到得到后记。

现在您可以编写一个程序以将Postscript转换为pdf,但是我们不必存在ghostscript,该脚本是为unix编写的,并且在linux上也可以正常工作(该项目没有重大差异)。不幸的是,word只在Windows上运行,因此您需要两台计算机,并且要使Windows确信linux计算机是打印机,您需要串行电缆和空调制解调器。如果您的计算机没有串行端口,则usb到rs232转换器可以正常工作(我建议使用带有fttdi芯片组的转换器)。现在,使用串行电缆和零调制解调器连接两台计算机,并确认您可以进行通讯(确保参数匹配)。

好的,现在您可以与他们交谈,现在是时候让您的Windows框说服linux框是打印机了:只需为applewriter II安装打印机驱动程序,并说它已连接到串行端口。现在,当您打印时,将后记发送到linux框。下一步是将其另存为文件。

现在,将鼠标移到您的Linux机器上,并使用以下简单命令:

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

和完成一样简单。


实际上,这可以使您工作(如果您在完成后向dd发送信号),但是有更简单的方法,例如打印到文件并在Windows框上运行gostscript,尽管fttdi为串行转换器提供了高质量的USB,安装驱动程序非常痛苦。


2
尽管测试这超出了我的能力,但一些背景知识表明这既有效又可怕。干得好!
ymbirtt 2013年

6
我考虑过包括制造空调制解调器的说明,只是需要烙铁。
hildred

13

如今,许多打印机都是带有自动文档进纸器的组合打印机/扫描仪。这很简单。

  1. 打印文档。
  2. 扫描打印输出。

3
人们实际上就是这样做的。我希望我在开玩笑。而且,这是代码拖曳,您的代码在哪里?
derobert 2014年

9

的PHP

这段代码生成的PDF文件应该可以在自动收录机上完美打印。如果要在监视器上查看PDF文件,则可能需要放大一点。

原始文件范例 Word文件

PDF输出(在浏览器中查看) PDF文件的局部视图

源代码

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

?>

注意:该txt2pdf()功能基于Brendan Zagaeski制作的最小PDF文件。


巨魔在哪里?
Nacib Neme 2014年

5

在UNIX系统上:

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

在Windows上:

ren document.docx document.pdf

3
注意:当然不会起作用...只是觉得很有趣
s3lph 2013年

4

我相信此shell脚本是解决问题的一种简单直观的方法。有没有更好的办法?

( 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

1
“为什么要换成软盘?”;)
希尔德


0

Windows批处理

转换文件的最简单方法:更改扩展名!

:: convert.cmd

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

剧透/巨魔:(悬停在下方以查看)

糟糕...我忘了您甚至可以转换带有.exe扩展名的文件吗?这么多...;)此外,我也懒得编写警卫码。
我以为我会在其中添加一些额外的巨魔:它甚至不会触及内部的数据...(不会解析它以使其成为有效的PDF)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.