- 浏览: 473588 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
tianya2010ji:
谢了 工作了好多年,今天刚好用到它。
使用SPRING中的线程池ThreadPoolTaskExecutor实现JAVA并发 -
Mr.Bruce:
有用
jquery在加载完iframe的内容后才进行下一步操作 -
lyyltt:
有一个外部引用谷歌api没办法download
好东西 - JS生成多种图形,饼状图,柱状图,折线图,雷达图 -
bluky999:
这里写错了应该。。。--sm-plugins=......,+ ...
tigase自定义插件的开发与配置 -
lyy3323:
spring的 threadpool 没有submit方法呀 ...
使用SPRING中的线程池ThreadPoolTaskExecutor实现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
用户的需求都是这么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>曲线救国的路线,哈哈,先来看看如下代码:
其中sytle的是用一种比较bt的办法影藏了pdf顶部的工具栏(可以用二楼的方法的,这个方法作为备用)。
这样即使用ie菜单栏中的保存功能也只是保存网页布局而不会把pdf保存下来。
另外这样即使本地没装pdf阅读器也不会让你下载该pdf了,而只是在相应位置出现叉叉而已。基本能够满足客户的需求了^_^
<!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里实现如下代码:
以上代码的缺点:
1:加密只能实现打印和修改加密。
2:虽然隐藏了工具栏,但是可以通过快捷键F8来将工具栏显示出来
3:IE菜单栏中自带的保存功能也能将此pdf保存到本地
4:在客户端没有安装pdf阅读器的情况下,浏览器会直接提示用户是否下载,这也是和需求不符的。
结果参照顶楼在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阅读器的情况下,浏览器会直接提示用户是否下载,这也是和需求不符的。
发表评论
-
Ofbiz知识点记载
2013-10-04 21:22 977定义实体Entity的时候查看数据库所支持的数据类型可参 ... -
使用基于JPA注释的实体转换成数据库schema
2013-01-18 10:13 2041第一步:添加hibernate3-maven-plugin到 ... -
java获取中文拼音首字母工具类
2011-08-13 22:11 8547package com.sw.documentary.comm ... -
unicode的html页面编码转换成中文
2011-07-26 10:30 6358代码: private static String con ... -
使用log4j输出日志到rsyslog日志服务器
2010-12-17 15:43 3928好处是可以将不同应用或者同一应用的多个集群服务器的日志发送到同 ... -
java配合eclipse实现远程调试
2010-11-30 09:40 8921,添加监听 在运行程序的地方加上参数 -Xdeb ... -
使用Apache的commons-net包实现FTP操作的类
2010-11-18 14:41 1603import java.io.File; import ... -
一个用于图片处理的工具类
2010-10-29 14:56 1356其中包括图片与字节流的相互转换,获取图片类型,图片大小,图片长 ... -
使用SPRING中的线程池ThreadPoolTaskExecutor实现JAVA并发
2010-09-16 10:24 38780使用SPRING中的线程池ThreadPoolTaskExec ... -
HttpCLient实现对被GZip压缩过的Response进行解压
2010-08-25 13:13 36040发送请求(要求服务端对response进行GZip压缩): ... -
java中hashcode()方法和equals方法【转】
2010-06-26 08:58 836hashcode这个方法是用来鉴定2个对象是否相等的。 那你 ... -
LIST<Object>序列化
2010-03-18 17:26 4204有时候当需要远程传送一个LIST<Object>对 ... -
java穿透内网实现点对点通信的思考
2010-03-18 17:19 59911,客户端A登陆的时候,发送一个UDP数据包给服务器,然后服务 ... -
构建一个易于管理的JPopupMenu
2010-03-18 17:04 9841,构建一个Action public Action bin ... -
一个关于NIO的小程序
2008-08-05 16:31 1340随便看看: import java.io.FileInputS ... -
Java Socket网络编程初级入门
2008-08-04 11:31 267已搬家至www.w2tt.cn -
关于提高自己JAVA水平的十大技术讨论[ZT]
2007-12-24 09:58 1080本文列出了当今计算机 ...
相关推荐
我们可以监听MouseEnter和MouseLeave事件,当鼠标进入窗体时显示工具栏,离开时隐藏工具栏。 以下是一个简单的示例代码,展示如何在窗体的代码-behind文件中实现这一功能: ```csharp public partial class Form1 ...
* 为对话框应用程序添加了菜单栏和工具栏 * 模式对话框与非模式对话框和属性页对话框 * 向导式对话框和为对话框应用程序添加启动界面 * 文件打开对话框和在程序启动时弹出文件打开对话框 * 在文件打开对话框中预览...
Origin的工作环境类似于Office的多文档界面,主要包括菜单栏、工具栏、绘图区、项目管理器和状态栏几个部分。菜单栏位于顶部,可以通过它实现大部分功能;工具栏位于菜单栏下面,最常用的功能都可以通过它来实现;...
- 菜单栏和工具栏:理解各个菜单和工具的功能,如放置元件、编辑文本等。 - 文本格式设计:控制字体、字号、颜色等,使原理图清晰易读。 - 原理图规则设置:定义电气连接规则,确保电路逻辑正确。 4. **原理图...
2. 消除 IE6 自动出现的图像工具栏:设置 GALLERYIMG 属性为 false 或 no,以消除 IE6 自动生成的图像工具栏。 知识点:HTML、IE6 BUG 3. 防止点击空链接时页面往往重置到页首端:使用 "javascript :void(null)" ...
如果以上步骤仍然无法解决问题,可能是因为IE的工具栏或窗口屏蔽设置阻止了Flash内容的显示。在这种情况下,检查并调整相关设置,确保Flash内容被允许在浏览器中显示。 此外,如果Flash内容已经安装但无法播放,...
在某些情况下,可能需要屏蔽掉Cognos界面的菜单和工具栏。 5.3 **IE配置** 需要对Internet Explorer浏览器进行配置以确保兼容性。 #### 第6章 Cognos工程导入导出 6.1 **工程导出** 指导用户如何导出Cognos工程。...
第17章 存储和打印文档 17.1 了解串行化 17.2 串行化文档 17.2.1 文档类定义中的串行化 17.2.2 丈档类实现中的串行化 17.2.3 基于CObject的类的功能 17.2.4 串行化的工作方式 17.2.5 如何实现类的串行化 17.3 应用...
第17章 存储和打印文档 17.1 了解串行化 17.2 串行化文档 17.2.1 文档类定义中的串行化 17.2.2 丈档类实现中的串行化 17.2.3 基于CObject的类的功能 17.2.4 串行化的工作方式 17.2.5 如何实现类的串行化 17.3 应用...
- **概述**:实现同时显示两个状态栏,如主状态栏和扩展状态栏。 - **应用场景**:扩展状态信息展示能力。 **13. 关机对话框的标题字符串初始化后就不能再被改变的问题** - **概述**:解决关机对话框标题不可更改的...
- 菜单是用户界面中用于导航和控制程序的主要工具之一。 20. **option** ('ɒpʃ(ə)n) - n. 任选,选择,可选项 - 选项允许用户根据自己的需求定制程序的行为。 21. **character** ('kærɪktə(r)) - n. 字符...
第17章 存储和打印文档 17.1 了解串行化 17.2 串行化文档 17.2.1 文档类定义中的串行化 17.2.2 丈档类实现中的串行化 17.2.3 基于CObject的类的功能 17.2.4 串行化的工作方式 17.2.5 如何实现类的串行化 17.3 应用...
7. **删除工具栏上的非法按钮** 右键点击工具栏上的非法按钮,选择“删除”即可。 8. **解锁地址栏下拉菜单** 若要解锁地址栏的下拉菜单,修改`HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Toolbar`...
4. 在Word2000中,打开或关闭绘图工具栏可以通过“视图”→“工具栏”→“绘图”来实现。选项A正确。 5. 在Word2000中,选定的文字可以加下划线、加着重号,但不能直接设置为动态效果。选项D正确。 6. 输入公式时...
- 导航至 “用户配置 > 管理模板 > 任务栏和‘开始’菜单”。 - 找到并双击“从‘开始’菜单中删除‘搜索’菜单”选项。 - 在设置中选择“已禁用”,然后点击“确定”。 2. **额外修复措施**: - 注册以下DLL...
第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静态分析概述 Helix QAC是一款由Perforce软件提供的静态代码分析工具,主要用于帮助开发者检测C/C++代码中的潜在缺陷,提高代码质量。通过Helix QAC...
44·屏蔽系统热键和隐藏任务拦 45·动态调整屏幕分辨率 46·获取系统硬件信息 47·编辑注册表信息 48·重启动和关闭计算机 49·获取windows版本号和运行模式 50·枚举可用字体 第六章 51·向导程序 52·系统托盘程序...
操作方法是点击浏览器工具栏上的“历史记录”按钮,然后选择适当的时间段,比如“今天”或“昨天”,就可以按照访问时间顺序查看到该时段内访问过的所有网站列表。这样的功能对于需要追踪和管理个人上网行为的用户来...