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

时间:2010-02-18 20:55:18

标签: c# .net asp.net pdf pdf-generation

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

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

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


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

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

这里是一个简单的html和javascript示例,用于创建note的json(使用jQuery。)

    <html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
    <style type="text/css">
        *
        {
            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;
        }
    </style>
</head>
<body>  
    <div>
        <div id="PDF"></div>

        <div id="results">

        </div>
    </div>
</body>
</html>

<script type="text/javascript" src="script/jquery.js"></script>
<script type="text/javascript">
    var points = [];
    $("#PDF").click(function(e) {
        if ($("textarea.comment").length == 0) {
            var that = this;
            var txt = $("<textarea class='comment'></textarea>").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($("<div class='comment'>").html(that2.value.replace(/\r/gi, "<br>")).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 + '" }<br/>');
                }
            });
            $(this).append(txt);
            txt.each(function() { this.focus(); })
        }
    }); 
</script>

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

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

7 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

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

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");

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

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

你会在http://itextsharp.sourceforge.net找到itextsharp,注释示例:页面底部http://itextsharp.sourceforge.net/tutorial/ch03.html

pdfsharp:http://www.pdfsharp.net

答案 5 :(得分:2)

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

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

答案 6 :(得分:0)

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

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

这是一家公司,commercial control注释PDF(和其他格式)。

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

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