【问题标题】:Both landscape and portrait for pdf with Flying Saucer/iText带有飞碟/iText 的 pdf 横向和纵​​向
【发布时间】:2010-10-11 11:14:20
【问题描述】:

有没有办法使用 Flying Saucer/iText 设置不同的页面样式?我需要将前几页设为横向,然后在某个页面切换为纵向并退出。

有什么想法吗?

【问题讨论】:

    标签: pdf itext


    【解决方案1】:

    您可以在运行时动态处理页面大小。请按照以下步骤操作

    1. 为页面类型添加额外参数,例如 pageType 参数中的横向或纵向
    2. 在服务器端生成 html 时,在样式标签中添加以下代码,例如
    FileOutputStream fos = new FileOutputStream(file);
    ITextRenderer renderer = new ITextRenderer();
    StringBuilder htmls = new StringBuilder();
    htmls.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
    htmls.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">");
    htmls.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
    htmls.append("<head><style type=\"text/css\">");
    htmls.append("@page{ size: "+request.getParameter("pageType")}");
    htmls.append("</style></head>");
    htmls.append("<body><div>dynamic pdf data</div></body></html>");
    renderer.getFontResolver().addFont("C:\\Windows\\Fonts\\Calibri.ttf","UTF-8",BaseFont.NOT_EMBEDDED);
    renderer.setDocumentFromString(htmls.toString());
    renderer.layout();
    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + ".pdf\"");
    renderer.createPDF(outputStream);
    renderer.createPDF(fos);
    

    【讨论】:

      【解决方案2】:

      对于仍然遇到 Derek 提到的问题的任何人,我发现我需要在切换其布局的元素上显式设置宽度。所以以 div 为例

      <div class="portraitPage">
          <p>Some page content in portrait</p>
      </div>
      <div class="landscapePage">
          <p>Some page content in landscape</p>
      </div>
      

      它会正确格式化纵向页面后跟横向页面,但横向页面中的内容将仅与纵向页面一样宽,即使 @page land 声明包含宽度。我需要的是直接在应用了相关类的 div 上设置宽度,所以声明更像

      .landscapePage { page:land; width: 29.7cm; }
      

      请注意,宽度应考虑通过@page 声明块应用的任何边距或填充。

      【讨论】:

        【解决方案3】:

        没关系,找到答案了。对于任何感兴趣的人,这就是您的做法:

        @page land { size:landscape; }
        @page port { size:portrait; }
        .landscapePage { page:land; }
        .portraitPage { page:port; }
        

        瞧!

        【讨论】:

          猜你喜欢
          • 2019-08-11
          • 2019-01-07
          • 1970-01-01
          • 2021-03-25
          • 2013-07-30
          • 2019-12-02
          • 2012-01-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多