`
kaka2008
  • 浏览: 93560 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

flying saucer 使用中的一些问题 (java导出pdf)

    博客分类:
  • java
阅读更多
flying saucer(源代码托管在github https://github.com/flyingsaucerproject/flyingsaucer)是java导出pdf的一种解决方案,最早是从downpour老大的文章里看到它: http://www.iteye.com/topic/509417 ,感觉比之前的iText好用许多,它可以解析css,即我将页面先设置好,然后传递给它,它既可以给我生成一个pdf出来,跟页面一样,当时感觉很酷,于是就研究了一下,现在项目中也用到了,效果还不错。
  
     优点很明显,之前也提到了,可以解析css,这样很方便,大大的减少了工作量。pdf加水印也变得很简单——只需为body设置一个background-image即可。
     说说使用中需要注意的一些问题吧:
[list=1]
  • 中文换行问题

  •    老外做的东西,没有考虑到中文问题。默认提供的包里,中文不会换行,有人修改了源代码,解决了这个问题,重新编译好的包在附件里,可以下载。需要注意的是,在官网提供的jar包里,有两个包,一个是core-renderer.jar,另一个是core-renderer-minimal.jar。引用时,只需引用前者就行。有人曾经说用这个重新编译后的包替换了原来的包之后,不起作用,原因就在此。
     
       另外,想要中文换行,如果是table,那么table 的style必须加上这句话
       
    style="table-layout:fixed; word-break:break-strict;"

  • css路径问题

  •    在一个java project里,使用相对css路径是可以的,效果也都不错。但在java web project里,使用css相对路径是不可以的(最起码这里困扰了我很久,差点就放弃flying saucer了)。例如,我有一个模板叫addOne.jsp,里面引用到了某个css,就应该这样写(windows)

     
    <link href="file:///D|/project/WebContent/commons/css/module-pdf.css" rel="stylesheet" type="text/css" />


       只有这样写了之后,它才能找到这个css,很诡异。每次换了机器之后都要改路径,很麻烦。
  • 中文字体问题

  •    downpour老大在它那篇文章里提到了怎样处理中文字体的,他可能高估了许多人的水平。其实说起来,很简单,就两点:一是在java代码里引用字体,二是在页面上引用字体。
      引用字体:


    // 解决中文支持问题  
            ITextFontResolver fontResolver = renderer.getFontResolver();  
           fontResolver.addFont(&quot;C:/Windows/Fonts/arialuni.ttf&quot;, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);  


        这里引用了arialuni.ttf字体,它位于C盘windows/fonts文件夹下,将它引用后,还需要在页面上使用这个字体  

       <body style="font-family:'Arial Unicode MS'">
    


      这里的Arial Unicode MS 即刚才 的arialuni.ttf字体的名字,换了其它字体后要注意修改这里的名称。这样才可以在pdf中显示中文。
      许多人有这样一个问题——按照以上两个步骤做了之后,页面中还是没有中文,这时,请检查你引用的css文件,其中一定设置了其它字体,只需将它去掉即可
    [/list]
         缺点:
        我在使用中发现,flying saucer不支持富文本,如果用到了KindEditor此类富文本编辑器,
    还要将其中的内容转化成pdf,那对flying saucer来说就是个灾难。会报一堆错误,目前我还没有找到解决方案。还好这次项目中不是必须使用富文本编辑器,对于有此类需求的同学来说,请慎重选择flying saucer。另外,flying saucer严格遵守html规则,一个小小的错误,都会导致它报错。诸如

    <td colspan="2""2">

    此类的html代码在jsp中是不会有问题的,可是flying saucer却会报错,曾经这个问题导致我花了一小时时间来寻找问题所在。不过很难说这到底是缺点还是优点

        最后贴一个较完整的例子:
        我使用spring mvc,在controller里

      
           
            @RequestMapping("/pdf/{projectId}")
    	public ModelAndView generatePdf(HttpServletRequest request,
    			HttpServletResponse response, @PathVariable
    			String projectId) {
    		Project project = this.projectService.getProjectById(projectId);
    		ModelAndView mav = new ModelAndView();
    		if (project == null) {
    			mav.setViewName("forward:/error/page-not-found");
    			return mav;
    		}
                    //中文需转义
    		String pdfName = "pdfName";
    		
    			response.setHeader("Content-disposition", "attachment;filename="+pdfName;
    			response.setContentType("application/pdf");
    			OutputStream os = response.getOutputStream();
    			ITextRenderer renderer = new ITextRenderer();
    //指定模板地址			
    renderer.setDocument("http://localhost/project/preview/"+projectId);
    			
    			ITextFontResolver fontResolver = renderer.getFontResolver();
    			if (StringUtils.isOSWindow())
    				fontResolver.addFont("C:/Windows/Fonts/ARIALUNI.TTF",
    						BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
    			else
    				fontResolver.addFont("/usr/share/fonts/TTF/ARIALUNI.TTF",
    						BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
    			renderer.layout();
    			renderer.createPDF(os);
    			os.close();
    		
    		return null;
    	}
    
            @RequestMapping("/preview/{projectId}")
    		public ModelAndView pdf(@PathVariable
    		String projectId) {
    			Project project = this.projectService.getProjectById(projectId);
    			ModelAndView mav = new ModelAndView();
    			if (project == null) {
    				mav.setViewName("forward:/error/page-not-found");
    				return mav;
    			}
    			mav.setViewName("pdf");
    			mav.addObject("project",project);
    			return mav;
    		}
        

        jsp页面如下:
       
     <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>title</title>
    <link href="file:///D|/project/WebContent/commons/css/print-pdf.css" rel="stylesheet" type="text/css"  />
    
    </head>
    <body style="font-family:'Arial Unicode MS'">
       <table border="1" cellspacing="0" cellpadding="0" class="table" style="table-layout:fixed; word-break:break-strict;">
        <tr>
          <td rowspan="9" width="4%" class="tc">项目单位基本信息</td>
          <td colspan="2" style="width:160px">(1)项目单位名称 </td>
          <td colspan="2"><%=StringUtils.getValueString(user.getDeptName()) %></td>
        </tr>
        </table>
    </body>
        

    分享到:
    评论
    4 楼 tanjianna 2013-01-07  
    在linux 怎么办?求大神!
    3 楼 yanbin0830 2012-10-16  
    中文问题,如果系统装在D盘呢? 如果lunux 没有这个字体呢? 外部引用字体对于抽象非常的麻烦。 有没有其他好的方法解决?
    2 楼 a418040445 2011-11-22  
    是啊,我也碰到了。
    1 楼 yindashan 2011-09-23  
    图片不能完全显示被遮盖一部分,怎么解决?

    相关推荐

      flying-saucer生成pdf

      要在SpringBoot项目中使用flying-saucer,首先需要添加对应的依赖。在pom.xml文件中,引入flying-saucer和相关的转换库,如itext。然后,创建一个服务类,使用Java ITextRenderer进行转换操作,接收HTML字符串或...

      flyingsaucer转html为PDF(中文可用)

      通过以上步骤,你可以使用`Flyingsaucer`库在Java项目中处理中文HTML,并将其转换为高质量的PDF文档。这个过程不仅适用于纯文本,还支持图片、表格和其他HTML元素,从而提供了一种灵活的方式来将网页内容导出为适合...

      用flying saucer将html生成pdf的例子

      在与flying saucer结合使用时,iText通常用来完成最后的PDF生成步骤,将flying saucer处理后的页面流转换为完整的PDF文档。 【freemarker】是一个模板引擎,常用于生成HTML、XML或其他文本格式的文档。开发者可以...

      flyingSaucer.jar

      2. **Web应用导出功能**:许多Web应用提供将用户界面内容导出为PDF的功能,`flyingSaucer` 可以帮助快速实现这一功能。 3. **数据可视化**:将数据库查询结果或者数据分析结果以美观的PDF形式呈现。 总的来说,`...

      flying-saucer jar包下载

      "Flying-Saucer"是一个开源Java库,主要用于将HTML内容转换为PDF格式,方便进行电子文档的生成和分发。这个库包含了多个组件,每个组件都有特定的功能,以协同完成HTML到PDF的转换过程。在提供的信息中,我们提到了...

      java jsp 生成 pdf flyingsaucer

      Java JSP 生成 PDF 使用的是一个名为 Flying Saucer 的库,它是一个开源项目,专门用于将 HTML 内容转换为高质量的 PDF 文件。这个过程在 IT 行业中非常重要,因为许多应用程序需要将动态生成的网页内容导出为可打印...

      使用 itext、flying-saucer 实现html转PDF

      ITextRenderer renderer = new ITextRenderer(); ITextFontResolver fontResolver = renderer.getFontResolver(); fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_...

      java将页面导出PDF.zip

      在这个案例中,"将页面导出PDF.zip"文件可能包含了使用其中一个库的示例代码,特别是Flying Saucer,因为它擅长将HTML内容转换为PDF。 Flying Saucer是一个强大的Java库,它能够解析HTML并将其渲染为PDF、XPS或其他...

      JAVA导出PDF文件所需相关配置文件

      总结来说,Java导出PDF文件需要理解PDF生成库的使用,包括但不限于字体配置、模板应用、图片插入等。同时,选择合适的库和优化方法对于提高代码效率和生成高质量PDF至关重要。通过学习和实践这些知识点,你可以更...

      java导出pdf文件

      在Java编程环境中,导出PDF(Portable ...总之,Java导出PDF文件涉及到选择合适的库、理解PDF文档结构、以及使用提供的API来构造和填充PDF内容。通过不断实践和学习,你可以创建出功能丰富、符合需求的PDF文档。

      java导出pdf、加表格、加水印

      在Java开发中,导出PDF、添加表格以及加水印是常见的需求,这些...以上就是关于"java导出pdf、加表格、加水印"的详细内容,希望对你在实际开发中有所帮助。通过掌握这些技术,你可以创建出专业且富有表现力的PDF文档。

      java导出pdf.zip

      Java导出PDF是一种常见的技术需求,特别是在开发报告生成、数据可视化或者文档呈现的场景中。在Java中,我们可以使用各种库来实现将数据导出为PDF格式的功能。本篇文章将详细探讨这一主题。 首先,我们需要了解PDF...

      java 实现PDF导出功能需要的中文支持文件

      在Java中,我们可以使用各种库来生成PDF,如iText、Apache PDFBox、 Flying Saucer等。这些库提供了API,让我们能够构建和操作PDF文档。 以iText为例,这是一个流行的Java库,专门用于生成和处理PDF。要支持中文,...

      java导出pdf文件jar包

      Java导出PDF文件是开发过程中常见的一项任务,特别是在需要生成报告、报表或用户手册时。在Java中,我们可以使用各种库来实现这个功能,而jar包则是这些库的可执行形式。下面我们将深入探讨如何使用Java导出PDF文件...

      java实现将html转pdf,并在指定位置添加印章

      在这个例子中,我们首先使用Flying Saucer将HTML转换为PDF,然后通过iText在PDF的指定位置(50, 750)添加印章图片。请注意,实际的坐标值应根据印章的实际大小和PDF页面布局进行调整。 为了确保印章的清晰度和适应...

      flying-saucer-pdf-9.1.3,转pdf需要的jar包

      要使用"Flying Saucer PDF 9.1.3",首先你需要将提供的`flying-saucer-pdf-9.1.3.jar`文件添加到你的项目类路径中。这个JAR文件包含了所有必要的类和资源,使得你可以调用Flying Saucer的API来执行转换操作。 以下...

      java+pdf生成.zip

      在Java环境中,有多个库可以帮助开发者生成PDF文件,例如iText、Apache PDFBox、 Flying Saucer等。 iText是一个流行的Java库,它提供了丰富的API来创建、修改和处理PDF文档。使用iText,你可以创建从简单的文本...

      itext2.0.8+core-renderer-1.0.0+flying-saucer-pdf-9.1.3+xmlworker-5.4.3

      为了在项目中使用这些库,需要将jar包添加到类路径中,然后通过Java代码调用相应的API来完成HTML到PDF的转换工作。 总的来说,这个压缩包提供了一整套强大的工具,帮助Java开发者轻松地将HTML内容转换为专业的PDF...

      java实现pdf的导出

      在Java编程环境中,导出PDF(Portable Document Format)文件是一项常见的任务,特别是在生成报告、文档或发票等场景中。PDF格式因其跨平台性和良好的显示一致性而受到广泛应用。本篇文章将详细探讨如何使用Java来...

    Global site tag (gtag.js) - Google Analytics