如何在浏览器中编辑pdf并将其保存到服务器

以下是要求,用户需要能够在浏览器中查看上传的PDF。 他们需要能够向PDF添加注释并将更新的PDF保存到服务器,而无需将其保存到计算机并在浏览器外部打开。

关于如何实现这一点的任何想法都受到欢迎。

顺便说一句,我正在使用asp.net网站(在C#中)。


我无法控制pdf的外观。 它是客户端上传的,然后其他用户需要在pdf上查看和注释。

我想的解决方案是将PDF渲染为jpeg并使用javascript绘制笔记应该去的位置的坐标。

这里是创建note的json的html和javascript的一个快速示例(使用jQuery。)

    * { margin:0; padding:0; } #PDF { position:absolute; top:0; bottom:0; width:600px; height:800px; background:url(assets/images/gray.png) repeat; float:left; } #results { float:right; } .comment { position:absolute; border:none; background-color:Transparent; height:300px; width:100px; overflow:auto; float:left; top:0; right:0; font-family: Arial; font-size:12px; } div.comment { padding-top:-20px; } .comment a.button { display:block; padding-top:-20px; }    
var points = []; $("#PDF").click(function(e) { if ($("textarea.comment").length == 0) { var that = this; var txt = $("").css({ top: e.pageY, left: e.pageX }).blur(function() { $(this).remove(); }).keypress(function(e2) { if (e2.keyCode == 13 && !e.shiftKey) { var that2 = this; $("#PDF").append($("
").html(that2.value.replace(/\r/gi, "
")).css({ top: e.pageY, left: e.pageX })); $(this).remove(); points.push({ "x": e.pageX, "y": e.pageY, "text": that2.value }) $("#results").append('{ "x": ' + e.pageX + ', "y": ' + e.pageY + ', "text": "' + that2.value + '" }
'); } }); $(this).append(txt); txt.each(function() { this.focus(); }) } });

所以现在我需要弄清楚如何:

  1. 将pdf渲染为jpeg。
  2. 重新创建PDF,将注释放在顶部。

您可以使用GhostScript将PDF呈现为JPEG。
命令行示例:

 gswin32c.exe -dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -r300 -sOutputFile=output.jpg input.pdf 

您需要通过命令行版本(如上所述)调用GhostScript或使用包装器。 谷歌搜索发现了这篇博文:

  • Ghostscript的简单C#包装器

要创建新PDF,您有两个主要选择:

  • 修改JPEG并将JPEG转换为PDF(您可以使用GhsotScript进行转换)
  • 使用PDF库导入原始PDF并在其上添加数据

对于PDF库,请参阅此SO问题:

  • 使用C#构建PDF文件

我的公司Atalasoft提供的组件可让您查看文档图像,包括PDF并对其进行注释,并将注释保存回PDF。 在我们的产品套件中,您需要dotImage文档成像和PDF Reader附加组件。 您将通过我们的AJAX Web控件使用dotAnnotate。 这是我们在线演示的链接 – 显示的文档是TIFF,但您也可以使用PDF。

我认为你不能让用户在他们的浏览器中加载pdf,编辑它,然后将它保存到服务器而不将它们保存到他们的机器上,然后将其上传到服务器。

你可以做的是设置一个带有数据库后端的webform,它可以代表pdf,当他们编辑它时,你可以使用itextsharp重新生成PDF并从数据库加载信息,这样当用户返回编辑PDF时你就可以了可以用已经存在的forms预填充表格。

itextsharp非常易于使用,这是一个例子:

 string sourceFile = "path/to/pdfTemplate.pdf"; PdfReader reader = new PdfReader(sourceFile); PdfStamper stamper = new PdfStamper(reader, new FileStream("path/to/store/pdf/filename.pdf", FileMode.Create)); AcroFields fields = stamper.AcroFields; //now assign fields in the form to values from your form fields.SetField("input1", input1.Text); fields.SetField("input2", input2.Text); //close the pdf after filling out fields stamper.SetFullCompression(); stamper.FormFlattening = true; stamper.Close(); 

然后,如果你想显示实际的PDF,你很容易

 Response.Redirect("path/to/store/pdf/filename.pdf"); 

我们在Spring / Java平台上使用lowagie执行此操作。

向用户显示预先生成的销售纳税申报表,并可在几个字段中添加某些手动调整。 然后,我们根据手动输入重新计算总计字段,并将整个内容保存回我们的数据库。

您可以使用PDFSharp或itextsharp来创建注释。 没有尝试过PDFSharp注释,但iTextSharp确实有效。 您必须在服务器端处理编辑。 可能会将文件复制到临时文件夹进行编辑并将其保存回来。

您可以在http://itextsharp.sourceforge.net找到itextsharp,注释示例:底部位于页面http://itextsharp.sourceforge.net/tutorial/ch03.html

pdfsharp: http ://www.pdfsharp.net

如果你能买第三方库,我会推荐TxTextControl。 http://www.textcontrol.com/en_US/

使用此控件,您可以编写一个编辑器,使您可以将pdf用作模板,并允许用户进行更改并保存。 全部浏览器中,无需在计算机上手动选择临时文件。 Acessing非常类似于使用普通TextBox的TextProperty。

您没有指定您拥有的技术限制。 如果您可以考虑使用Silverlight解决方案,并且您拥有支持Silverlight的客户端计算机,则可以轻松执行此操作。

看看Microsoft Sketchflow的工作原理,它允许用户在Web浏览器中注释文档,并将注释持久保存回服务器。

这是一家具有商业控制的公司,用于注释PDF(和其他格式)。

Microsoft在他们的Sketchflow播放器中执行此操作。 这是一个video 。 当然,你不会使用sketchflow,而是使用类似的东西来满足你的需求。

作为一个额外的好处,Silverlight 4支持剪贴板以及拖放,以便最终用户可以将某些内容粘贴到PDF immage上,并将任何文件拖到它上面,然后您就可以上传到服务器了。