itextsharp压模与智能复制,在没有工具栏或导航栏的浏览器中显示pdf

时间:2014-11-06 23:32:36

标签: pdf iframe itextsharp

我的应用程序从我们的数据库中获取pdf字节,并使用itextsharp库将pdf发送到iframe。当pdf显示在iframe中时,工具栏和导航窗格会显示,但我们想隐藏这些内容。当我通过使用#toolbar = 0& navpanes = 0输入pdf的url来加载pdf文档时,我会看到我正在寻找的结果。

应用程序逻辑正在使用PdfStamper向pdf添加一些按钮和其他数据。当我将pdf写入Response.Outputstream时,pdf会显示添加的按钮,除了我无法摆脱工具栏和navpanes之外,一切都很好。我已经尝试将“toolbar = 0& navpanes = 0”添加到响应标头中的url,但无济于事。

我写了一个测试应用程序,显示使用PdfSmartCopy而不是压模工作完美 - pdf显示在浏览器中,默认隐藏工具栏和navpane。

问题是我仍然需要通过压模向pdf添加一些按钮。我写了一个测试应用程序,通过压模添加按钮,然后智能副本从压模抓取每个页面并将所有这些写入Response.Output。 pdf在浏览器中显示没有工具栏或navpanes,但按钮不存在。

以下是使用压模和智能副本的代码 - 非常感谢您的帮助:

private void SendStamperToCopy()
{
    try
    {
        String filePath = @"C:\debug\PerfIndicWithDefaults.pdf";
        byte[] pdfBytes = ReadFile(filePath);

        Document document = new Document();
        PdfSmartCopy copy = new PdfSmartCopy(document, Response.OutputStream);
        document.Open();

        MemoryStream memStream = new MemoryStream();
        PdfReader reader = new PdfReader(pdfBytes);
        PdfStamper pdfStamper = new PdfStamper(reader, memStream);


        // add a button with the stamper
        iTextSharp.text.Rectangle rectCancel = new iTextSharp.text.Rectangle(50, 50, 20, 20);
        PushbuttonField btnCancel = new PushbuttonField(pdfStamper.Writer, rectCancel, "Cancel");
        btnCancel.Text = "Cancel";

        iTextSharp.text.pdf.PdfAnnotation fieldCancel = btnCancel.Field;
        pdfStamper.AddAnnotation(fieldCancel, 1);

        int numOfPgs = reader.NumberOfPages;
        for (int n = 1; n <= numOfPgs; n++)
        {
            copy.AddPage(pdfStamper.GetImportedPage(reader, n));
        }


        String headerStr = "inline; filename=PerfIndicWithDefaults.pdf";
        Response.AppendHeader("content-disposition", headerStr);
        Response.ContentType = "application/pdf";

        Response.OutputStream.Flush();
        document.Close();
        Response.OutputStream.Close();
    }
    catch (Exception ex)
    {
        Console.Write(ex);
        Response.OutputStream.Flush();
        Response.OutputStream.Close();
    }
}

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您希望使用PdfStamper添加按钮,并且您想要更改查看器首选项。这可以这样做:

PdfReader reader = new PdfReader(source);
System.IO.MemoryStream m = new System.IO.MemoryStream();
PdfStamper stamper = new PdfStamper(reader, m);     
PdfStamper.ViewerPreferences = PdfWriter.HideToolbar | PdfWriter.PageModeUseNone;   
stamper.Close(); 
reader.Close();

HideToolbar会隐藏工具栏,而PageModeUseNone则表示您不显示任何面板(例如书签面板等)。

目前尚不清楚为什么在此上下文中需要PdfSmartCopy。也许我错过了什么。另外:您的代码中存在一些奇怪的错误:您从未关闭stamper实例,但是您将页面从stamper导入copy实例。我从来没有见过任何人尝试过。当我写iText时,这肯定不是我想到的。你的代码对我来说很混乱。