`

PDF屏蔽打印,隐藏工具栏和菜单栏

    博客分类:
  • Java
阅读更多
刚研究了一下PDF文件现在把研究成果写在下面。
用户的需求都是这么BT:
1.       用网页打开 PDF文件。
2.       只可以浏览但是不许打印保存。
仔细分析之后发现之前见过这样的PDF档没有工具栏,打印的按钮灰掉。
但是如果用IE打开文件也会在IE的临时文件夹里面找到。只有做到清缓存。
PDF的文件用IE打开的时候自己有工具栏。真是要死了,在网上搜了很久如何屏蔽打印和保存,搜到的都是如何破解。考虑了两个开源保PDFBox和iText。想要用PdfBox实现屏蔽打印但是在官网上面找到的例子都是着重在数据抽取上的,觉得他的实现其实做得不好(可能是对他不够了解)在它身上花了2天时间之后转去考虑iText.
Itext官网上面的实例很全面而且实现起来也很简单。下面是实现代码:
import java.io.FileOutputStream;

import com.lowagie.text.Document;
import com.lowagie.text.Font;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfCopy;
import com.lowagie.text.pdf.PdfEncryptor;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfWriter;


publicclass PdfHandle {
    publicvoid hideBars(String inputFile,String outFile)
    {
       //复制一个PDF
        try {
                // 创建一个reader
                PdfReader reader = new PdfReader(inputFile);
                int n = reader.getNumberOfPages();
                // 得到第一页
                Rectangle psize = reader.getPageSize(1);
                float width = psize.height();
                float height = psize.width();
               
                // step 1: 创建一个document对象
                Document document = new Document(new Rectangle(width, height));
                // step 2: 创建一个write
                PdfCopy writer = new PdfCopy(document, new FileOutputStream(outFile));
                //设置隐藏菜单栏和工具栏
                writer.setViewerPreferences(PdfWriter.HideMenubar | PdfWriter.HideToolbar);
               
                // step 3: 打开 document
                document.open();
                // step 4: 一页一页添加内容
                int i = 0;
                while (i < n) {
                    document.newPage();
                    i++;
                    PdfImportedPage page1 = writer.getImportedPage(reader, i);
                     writer.addPage(page1);
                }
               
                // step 5: 关闭document
               
                document.close();
            }
            catch (Exception de) {
                de.printStackTrace();
            }
    }
    publicvoid notAllowPrint(String inputFile,String outFile)
    {
       try {
           PdfReader reader = new PdfReader(inputFile);
           //设置加密权限
           PdfEncryptor.encrypt(reader,
                  new FileOutputStream(outFile),
                  null,
                  null,
                   PdfWriter.AllowAssembly |PdfWriter.AllowFillIn|PdfWriter.AllowScreenReaders,
                   false);
       }
        catch(Exception e) {
           e.printStackTrace();
       }
    }
    publicstaticvoid main(String args[])
    {
        PdfHandle pp=new PdfHandle();
        pp.hideBars("e:\\3.pdf", "e:\\4.pdf");
        pp.notAllowPrint("e:\\4.pdf", "e:\\5.pdf");
    }
   

}
以上程序测试过没有问题。使用时要加入itext.jar到工程里面。
方法1.去掉工具栏。这个很简单。
方法2.屏蔽打印,这个方法其实屏蔽了很多权限,可以在文档中查到。Encrypt方法的第5个参数是受权参数,如果希望用户有什么权限则在这里面定义。如果第三个第四个参数里面定义了密码则用户打开文档就必须输入密码,如果授权为允许打印有定义了密码则不会达到我们单纯屏蔽打印按钮的目的。
权限由如下几种:
AllowPrinting
AllowModifyContents
AllowCopy
AllowModifyAnnotations
AllowFillIn
AllowScreenReaders
AllowAssembly
AllowDegradedPrinting
有兴趣的话大家可以反复试验一下授权,密码之类的。
最后说一下ie缓存的问题。我搜到了一篇关于用servlet输出PDF文件的实例,可以在sevlet里面设置缓存存在时间。代码太长了我就不贴了贴一下地址大家可以去下载。
中文版:http://www.javaresearch.org/article/17251.htm
英文版:http://www.onjava.com/pub/a/onjava/2003/06/18/dynamic_files.html
自英文版有源码下载



itext官网:http://www.lowagie.com/iText/

转自:http://blog.csdn.net/l0979365428/archive/2007/09/15/1786380.aspx

另外一种iframe的实现方式参考:
http://bbs.blueidea.com/thread-1678056-1-1.html
分享到:
评论
4 楼 stoneo9o3 2009-04-15  
import com.lowagie.text.Document; 我复制这代码后行前有X号,我要怎么处理才能用?
3 楼 stoneo9o3 2009-04-15  
import com.lowagie.text.Document
从哪里来的?你自己写的类吗
2 楼 zhoulei984623 2008-09-04  
最后经过不懈努力,找到了一个用<object></object>曲线救国的路线,哈哈,先来看看如下代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
</head>
<body>
<tr><td>
	<p style="margin-top:-45px;margin-bottom:0px;">
			<object classid="clsid:CA8A9780-280D-11CF-A24D-444553540000" id="Pdf1" width="100%" height="100%">
			  <param name="_Version" value="327680">
			  <param name="_ExtentX" value="2646">
			  <param name="_ExtentY" value="1323">
			  <param name="_StockProps" value="0">
			  <param name="SRC" value="C:\Documents and Settings\zhoulei\桌面\temp.pdf">
			</object>
		</p>
</td></tr>
</body>
</html>


其中sytle的是用一种比较bt的办法影藏了pdf顶部的工具栏(可以用二楼的方法的,这个方法作为备用)。
这样即使用ie菜单栏中的保存功能也只是保存网页布局而不会把pdf保存下来。
另外这样即使本地没装pdf阅读器也不会让你下载该pdf了,而只是在相应位置出现叉叉而已。基本能够满足客户的需求了^_^
1 楼 zhoulei984623 2008-09-04  
需求:和顶楼类似
结果参照顶楼在jsf里实现如下代码:

		//Get response
		FacesContext faces = javax.faces.context.FacesContext.getCurrentInstance();
		HttpServletResponse response = (HttpServletResponse) faces.getExternalContext().getResponse();
		
		//打开源pdf文件
		PdfReader reader = new PdfReader("./HelloWorld.pdf");
		Document document = new Document(reader.getPageSizeWithRotation(1));
		int n = reader.getNumberOfPages();
		
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		//将原pdf文件中的内容放入字节流baos中
		PdfCopy copy = new PdfCopy(document, baos);
		
		//隐藏工具栏并给pdf加密
		copy.setViewerPreferences(PdfWriter.HideMenubar | PdfWriter.HideToolbar);
		copy.setEncryption(false, null, "pdf", PdfWriter.AllowAssembly);
		
		//往pdf中写入内容
		document.open();
		for(int i = 1; i <= n; i++) {
			PdfImportedPage page = copy.getImportedPage(reader, i);
			copy.addPage(page);
		}
		document.close();
		
		//设置响应类型并将pdf流写入响应
		response.setContentType("application/pdf");
		response.setContentLength(baos.size());
		response.setHeader("Expires", "0");
		response.setHeader("Cache-Control",
			"must-revalidate, post-check=0, pre-check=0");
		response.setHeader("Pragma", "public");
		ServletOutputStream out = response.getOutputStream();
		//将字节流baos中的内容写入响应流
		baos.writeTo(out);
		out.flush();

		
		faces.responseComplete();


以上代码的缺点:
1:加密只能实现打印和修改加密。
2:虽然隐藏了工具栏,但是可以通过快捷键F8来将工具栏显示出来
3:IE菜单栏中自带的保存功能也能将此pdf保存到本地
4:在客户端没有安装pdf阅读器的情况下,浏览器会直接提示用户是否下载,这也是和需求不符的。

相关推荐

    c# winform 中的 工具栏自动隐藏

    我们可以监听MouseEnter和MouseLeave事件,当鼠标进入窗体时显示工具栏,离开时隐藏工具栏。 以下是一个简单的示例代码,展示如何在窗体的代码-behind文件中实现这一功能: ```csharp public partial class Form1 ...

    身份证号码校验.pdf

    * 为对话框应用程序添加了菜单栏和工具栏 * 模式对话框与非模式对话框和属性页对话框 * 向导式对话框和为对话框应用程序添加启动界面 * 文件打开对话框和在程序启动时弹出文件打开对话框 * 在文件打开对话框中预览...

    origin使用教程.pdf

    Origin的工作环境类似于Office的多文档界面,主要包括菜单栏、工具栏、绘图区、项目管理器和状态栏几个部分。菜单栏位于顶部,可以通过它实现大部分功能;工具栏位于菜单栏下面,最常用的功能都可以通过它来实现;...

    PCB基本操作方法.pdf

    - 菜单栏和工具栏:理解各个菜单和工具的功能,如放置元件、编辑文本等。 - 文本格式设计:控制字体、字号、颜色等,使原理图清晰易读。 - 原理图规则设置:定义电气连接规则,确保电路逻辑正确。 4. **原理图...

    个人网页设计常用代码集合[收集].pdf

    2. 消除 IE6 自动出现的图像工具栏:设置 GALLERYIMG 属性为 false 或 no,以消除 IE6 自动生成的图像工具栏。 知识点:HTML、IE6 BUG 3. 防止点击空链接时页面往往重置到页首端:使用 "javascript :void(null)" ...

    FLASH播放插件无法安装的解决办法.pdf

    如果以上步骤仍然无法解决问题,可能是因为IE的工具栏或窗口屏蔽设置阻止了Flash内容的显示。在这种情况下,检查并调整相关设置,确保Flash内容被允许在浏览器中显示。 此外,如果Flash内容已经安装但无法播放,...

    Cognos10.1安装部署手册.pdf

    在某些情况下,可能需要屏蔽掉Cognos界面的菜单和工具栏。 5.3 **IE配置** 需要对Internet Explorer浏览器进行配置以确保兼容性。 #### 第6章 Cognos工程导入导出 6.1 **工程导出** 指导用户如何导出Cognos工程。...

    Visual C++ 2005入门经典.part08.rar (整理并添加所有书签)

    第17章 存储和打印文档 17.1 了解串行化 17.2 串行化文档 17.2.1 文档类定义中的串行化 17.2.2 丈档类实现中的串行化 17.2.3 基于CObject的类的功能 17.2.4 串行化的工作方式 17.2.5 如何实现类的串行化 17.3 应用...

    Visual C++ 2005入门经典.part04.rar (整理并添加所有书签)

    第17章 存储和打印文档 17.1 了解串行化 17.2 串行化文档 17.2.1 文档类定义中的串行化 17.2.2 丈档类实现中的串行化 17.2.3 基于CObject的类的功能 17.2.4 串行化的工作方式 17.2.5 如何实现类的串行化 17.3 应用...

    ANDROID 开发文档.pdf

    - **概述**:实现同时显示两个状态栏,如主状态栏和扩展状态栏。 - **应用场景**:扩展状态信息展示能力。 **13. 关机对话框的标题字符串初始化后就不能再被改变的问题** - **概述**:解决关机对话框标题不可更改的...

    程序员英语词汇1700词修改.pdf

    - 菜单是用户界面中用于导航和控制程序的主要工具之一。 20. **option** ('ɒpʃ(ə)n) - n. 任选,选择,可选项 - 选项允许用户根据自己的需求定制程序的行为。 21. **character** ('kærɪktə(r)) - n. 字符...

    Visual C++ 2005入门经典.part07.rar (整理并添加所有书签)

    第17章 存储和打印文档 17.1 了解串行化 17.2 串行化文档 17.2.1 文档类定义中的串行化 17.2.2 丈档类实现中的串行化 17.2.3 基于CObject的类的功能 17.2.4 串行化的工作方式 17.2.5 如何实现类的串行化 17.3 应用...

    IE注册表详解.pdf

    7. **删除工具栏上的非法按钮** 右键点击工具栏上的非法按钮,选择“删除”即可。 8. **解锁地址栏下拉菜单** 若要解锁地址栏的下拉菜单,修改`HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Toolbar`...

    计算机毕业考试试题.pdf

    4. 在Word2000中,打开或关闭绘图工具栏可以通过“视图”→“工具栏”→“绘图”来实现。选项A正确。 5. 在Word2000中,选定的文字可以加下划线、加着重号,但不能直接设置为动态效果。选项D正确。 6. 输入公式时...

    解决电脑搜索不到文件的方法很有效.pdf

    - 导航至 “用户配置 &gt; 管理模板 &gt; 任务栏和‘开始’菜单”。 - 找到并双击“从‘开始’菜单中删除‘搜索’菜单”选项。 - 在设置中选择“已禁用”,然后点击“确定”。 2. **额外修复措施**: - 注册以下DLL...

    Visual C++ 2005入门经典.part05.rar (整理并添加所有书签)

    第17章 存储和打印文档 17.1 了解串行化 17.2 串行化文档 17.2.1 文档类定义中的串行化 17.2.2 丈档类实现中的串行化 17.2.3 基于CObject的类的功能 17.2.4 串行化的工作方式 17.2.5 如何实现类的串行化 17.3 应用...

    Helix QAC_02-静态分析.pdf

    ### Helix QAC_02-静态分析.pdf 知识点详析 #### 一、Helix QAC静态分析概述 Helix QAC是一款由Perforce软件提供的静态代码分析工具,主要用于帮助开发者检测C/C++代码中的潜在缺陷,提高代码质量。通过Helix QAC...

    VC++6.0实效编程百例

    44·屏蔽系统热键和隐藏任务拦 45·动态调整屏幕分辨率 46·获取系统硬件信息 47·编辑注册表信息 48·重启动和关闭计算机 49·获取windows版本号和运行模式 50·枚举可用字体 第六章 51·向导程序 52·系统托盘程序...

    网络类.pdf

    操作方法是点击浏览器工具栏上的“历史记录”按钮,然后选择适当的时间段,比如“今天”或“昨天”,就可以按照访问时间顺序查看到该时段内访问过的所有网站列表。这样的功能对于需要追踪和管理个人上网行为的用户来...

Global site tag (gtag.js) - Google Analytics