2017-05-19 57 views
7

我有一个Web应用程序,目前正在从服务器获取PDF的base64表示。我可以使用Mozilla的pdf.js将其显示在<canvas>上,并通过下拉菜单切换页面。在浏览器中编辑*现有* PDF

根据我所能找到的所有内容以及Can Mozilla's pdf.js modify PDFs?,无法使用pdf.js编辑PDF。

我发现jsPDF,虽然我能够拿帆布和做.toDataURL()与它的每一页,并建立一个新的PDF文档中,但有两个问题:

  1. 的新生成的PDF只是每个页面上的一系列图像,因此原始PDF中的任何文本在完成后都只是一个图像。
  2. 我使用jsPDF生成一个新的PDF,然后将它的base64发送回pdf.js以将其显示在画布上。在这些步骤之间会发生页面图像缩放不正确的情况,因此每次新的PDF更改后每个页面占用大约3/4的画布。我一直无法保持相同的大小/规模。

jsPDF看起来没有加载现有PDF的方式,它只创建新的PDF。 pdfmakePDFKit也看起来像他们只能创建新的PDF文件。


所以我的问题:

有什么事情让两个查看PDF(从BASE64),并进行更改呢? 理想情况下,我会监视画布的变化,然后将该变化绘制到PDF页面上。完成后,将其导出到base64字符串以发送回服务器。

+1

你可以看看[PDFNetJS](https://blog.pdftron.com/2015/11/10/pdfnetjs-html5-pdf-viewer-and-editor/)。 – ConnorsFan

+0

我曾见过那个。这有点矫枉过正。而不是包含一个或两个JS文件,它看起来像需要包含多个资产文件夹,并且很难让这个文件在我的环境中工作(Siebel应用程序)。不过,我正在尝试这一个,直到找到解决方案更好 – neilsimp1

+0

PDFNetJS尝试检索.mem文件,它是一些二进制数据。这不能由我正在使用的应用程序(Siebel)提供,因此它看起来不像是一个选项。 – neilsimp1

回答

7

快速回答 - 不,你很难找到一个跨浏览器的解决方案。您很难找到PDF完美的解决方案。最好考虑让用户编辑HTML并在服务器上生成PDF。

为什么 - PDF格式同时出色和恶魔般。由于它的便携性,它非常出色,但由于其内部结构和存储机制而变得异常恶劣。没有像HTML那样友好的“DOM”。如果我们重新开始开发一种可移植的文档格式,它不会是我们会选择的PDF格式。但是PDF目前有太多的动力被抛弃,期间。

年轻的观众可能会想知道这种狂躁的格式究竟是如何进入市场领先地位以及它来自何处。那么,当PDF的创始人在制定设计时,在XML,JSON,HTML甚至互联网之前,他们并没有在考虑今天的文档共享。他们正在研究更好的方式来编码打印指令 - PostScript打印机驱动程序概念。在打印机消耗它们之前,这些预计不会被编辑,并且它们对于任何其他目的都毫无价值。然后有人注意到你可以将PostScript绘图指令解释为一个屏幕,随后有人发现将它用作可移动的跨设备显示概念的巨大潜力。在这里,我们是。回到问题 - 要以任何有意义的GUI方式编辑PDF,您需要解压缩PDF并将组件(图像,格式化文本,页面)呈现给显示设备。然后让人们搞乱布局;然后重新打包PDF。您必须完全符合PDF标准,否则您可能会发现编辑后的PDF文件的下游使用者崩溃或无法呈现它。您将不得不满足各种Acrobat标准级别,并且编辑软件包(Word,Illustrator,InDesign)供应商将快捷键和膨胀量嵌入PDF文件;图层,缩略图等。

然后,我们来颜色。阅读PDF规范后,您会看到原始PDF生产者可以决定使用的一系列色彩空间选项。你将不得不将这些解释为屏幕上合理的设备颜色和背面等。

然后字体。字体可能是嵌入子集,或者不是。为了保持PDF的逼真度,您需要在PDF中定义的比例尺上将字形实现为绘图表面上的矢量图形。这主要意味着利用某种平台相关类型的库 - 棘手的跨平台。此外,您将需要许可字体的适当使用,这可能是大多数人想用来看起来时髦和专业的字体的昂贵。

鉴于PDF中的分层,缩放和旋转功能,您可能会将HTML画布视为绘图表面。任何知道的人都会告诉你,在画布的世界里,你对于文字处理类型的功能几乎是你自己的。

不是不可能,但很难。

将PDF呈现到显示器的组件主要充当打印驱动程序,严格遵守PDF绘图说明,并且通常会生成栅格或有时会生成SVG图形。这是一条单行道 - 他们阅读和绘制,但对绘制的对象没有“处理”的意义。没有句柄意味着没有操纵,而这些家伙当然不想让你修改和回写。

你会发现许多'保存到PDF'产品。当客户端时,他们将倾向于抓取一组像素并将光栅图形转储到一个文件中,并在其周围贴上最薄的'PDF'定义单板。在那里他们是基于服务器的,那么他们可以非常强大 - 有很多像Aspose和ABCPDF这样的工具可以真正提供一些与服务器端的PDF协作 - 但这不是您在OP中寻找的东西。

总结 - 非常复杂的主题。如果任何事情都有可能出现,它可能会在所涵盖的PDF功能方面存在许多限制,并因此限制可以安全编辑的内容。

如果您正在寻找最终以PDF格式导出的文档的在线编辑,那么前进的方法是保留文档源的html版本并让用户使用TinyMCE,CKEditor等进行编辑,然后使用一个的服务器端工具将保存的源代码HTML并呈现为PDF。像ABCPDF这样的工具可以让你忠实地让你添加图片,页眉和页脚,页码等。

这是一个对你的(假设)需求的实用答案,尽管它在字体方面仍然有一些权衡许可)问题,基于浏览器的编辑器的笨拙,HTML编辑组件制定的HTML的全面怪异等,但它是可行的。

最后的想法 - 重新思考你所需要的范围。如果HTML编辑和在服务器上转换为PDF可用于您,这是一个非常流行的路径,您可以找到免费和商业组件以供客户端和服务器支持。

编辑:如果您需要注释PDF,那么事情会更容易。在服务器上,您需要生成文档页面的图像,将这些图像发送给客户端,将其显示给用户,让用户将其标记出来,将注释的坐标捕获回服务器,然后使用服务器端PDF库将注释呈现到PDF中。它是可以实现的,但需要各种技能来为服务器端PDF进行图像处理和客户端表示和注释捕获。

+0

基本上,用户需要打开先前上传的PDF,突出显示或圈选部分,然后将这些注释保存到PDF上以备份到服务器上。由于应用程序的设置,除了发送和接收文件的base64之外,我还没有办法做任何服务器端的工作。我希望采用PDF并在其上绘制高亮图像。不需要对文档内容进行文本编辑或操作。 – neilsimp1

+0

尽管如此,谢谢你的深入回应。我会看看我们是否无法在这里改变要求。如果我很快就找不到其他答案,我会将您的答案标记为正确。 – neilsimp1

+0

你好!关于如何获得在PDF上绘制的“注释”框的坐标(可能位于单独的重叠画布中),对于如何准确确定绘制框起始处的PDF X,Y坐标,您有任何建议吗? (左上角)以及所述盒子的高度/宽度?我不需要将这些重写到PDF中,只需要能够获取并存储它们即可。提前致谢! :) –