【问题标题】:Bookmarks with xhtmlrenderer (iText)带有 xhtmlrenderer (iText) 的书签
【发布时间】:2011-03-17 01:33:59
【问题描述】:

我正在使用 xhtmlrenderer(也称为 Flying Saucer)和 iText 将 HTML 转换为 PDF。我将如何用这个创建书签?有人有一个小例子吗?

提前致谢。

【问题讨论】:

    标签: java html pdf flying-saucer xhtmlrenderer


    【解决方案1】:

    似乎在 R6 中添加了书签,但用户指南只给了它们一个传递参考。附上 TODO 给作者稍后添加示例。

    搜索论坛,找到this example

    <html> 
    <head>  
    <bookmarks>  
      <bookmark name="A bookmark" href="#bm" />  
      <bookmark name="A bookmark 2" href="#bm2" />  
      <bookmark name="A bookmark 3" href="#bm3" />    
      <bookmark name="A bookmark 4" href="#bm4" />  
      <bookmark name="A bookmark invalid" href="#bm99" />  
    </bookmarks> 
    </head> 
    <body>  
       <div style="line-height: 100%; font-size: 12pt; page-break-before: always;">  
          <a name="bm">some text</a>  
       </div>  
       <div style="line-height: 100%; font-size: 12pt; page-break-before: always;">  
          <a name="bm2">some text</a>  
       </div>  
       <div style="line-height: 100%; font-size: 12pt; page-break-before: always;">  
         <a name="bm3">some text</a>  
       </div>  
       <div style="line-height: 100%; font-size: 12pt; page-break-before: always;">  
          <p>some text</p>  <p>some text</p>  <p>some text</p>  <p>some text</p>  <p>some text</p>  <p>some text</p>  
          <p><a name="bm4">and some more text</a></p>  
       </div> 
    </body> 
    </html>` 
    

    因此,添加书签似乎只不过是在&lt;head&gt; 中声明书签并将它们作为&lt;body&gt; 中的锚点引用。

    这应该适用于您现有的 XHTML->PDF 转换,无需任何代码更改。

    【讨论】:

    • 谢谢,但我不想在第一页出现页眉或页脚,我希望它从第二页开始计数。我将如何改变你的例子来做到这一点?谢谢。
    • 对不起,我不明白。你能告诉我页眉/页脚是如何与书签连接的吗?
    • 是否可以在本地pdf文档中创建指向特定页面的超链接
    【解决方案2】:

    上面的方法是正确的。

    为书签演示修改的 flysaucer-R8-src 示例

    public class PDFRenderToMultiplePages {
        public static void main(String[] args) throws Exception {
            OutputStream os = null;
            try {
                final String[] inputs = new String[] { newPageHtml(1, "red"),
                        newPageHtml(2, "blue"), newPageHtml(3, "green") };
                final File outputFile = File.createTempFile("FlyingSacuer", ".pdf");
                os = new FileOutputStream(outputFile);
                ITextRenderer renderer = new ITextRenderer();
                renderer.setDocumentFromString(inputs[0]);
                renderer.layout();
                renderer.createPDF(os, false);
                BlockBox rootBox = renderer.getRootBox();
                for (int i = 1; i < inputs.length; i++) {
                    renderer.setDocumentFromString(inputs[i]);
                    renderer.layout();
                    renderer.writeNextDocument();
                }
                renderer.finishPDF();
                System.out.println("Sample file with " + inputs.length
                        + " documents rendered as PDF to " + outputFile);
            } finally {
                if (os != null) {
                    try {
                        os.close();
                    } catch (IOException e) { /* ignore */
                    }
                }
            }
        }
    
        private static String newPageHtml(int pageNo, String color) {
            return "<html><head><bookmarks>"
                    + "<bookmark name=\"bookmark"
                    + pageNo
                    + "\" href=\"#bookMark\"/></bookmarks></head>"
                    + "<body><div style=\"color:"
                    + color
                    + ""
                    + ";\"><a name=\"bookMark\">Book Mark Example</a></div></body></html>";
        }
    }
    

    【讨论】:

    • 您好,书签有问题,上面的例子产生了书签1、书签1、书签2、书签1、书签2、书签3,而不仅仅是三个书签。它与for循环有关吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-08-20
    • 2012-01-05
    • 2021-05-21
    • 1970-01-01
    • 2023-04-03
    • 2014-12-03
    • 2013-03-23
    • 2018-06-27
    相关资源
    最近更新 更多