当前位置: 首页 > 知识库问答 >
问题:

仅更改生成的PDF(用html创建)中某些页面的页面方向

易雅畅
2023-03-14

我想更改PDF文档中特定几页的页面方向。PDF文档是使用html2pdf在html模板外创建的。它是这样的:如果页面的内容(通常是一个表格)太宽而不能以纵向显示,则以横向显示页面。

按照[如何将页面旋转为横向,页面内容应该为纵向iTextpdf][1]中的提示

[1]:如何将页面旋转成横向,页面内容应该在纵向iTextpdf中我已经创建了我的自定义标签和TagWorker。

public class LandscapeTagWorker extends BodyTagWorker {

public LandscapeTagWorker(IElementNode element, ProcessorContext context) {
    super(element, context);
}

/**
 * @param element
 * @param context
 * @see com.itextpdf.html2pdf.attach.ITagWorker#processEnd(com.itextpdf.html2pdf.html.node.IElementNode, com.itextpdf.html2pdf.attach.ProcessorContext)
 */
@Override
public void processEnd(IElementNode element, ProcessorContext context) {
    super.processEnd(element, context);
    String value = element.getAttribute("value");
     if ( "true".equalsIgnoreCase(value) ) {
        PdfDocument doc = context.getPdfDocument();

        doc.setDefaultPageSize(doc.getDefaultPageSize().rotate());
     }
}

}

问题是:首先,这没有任何作用。即使它会起作用,我也不想改变整个文档的方向,只是改变内容所在页面的方向。

如何从ProcessorContext/PdfDocument中提取当前页面,以及如何仅更改这些页面的页面方向?


共有1个答案

茅涵映
2023-03-14

在下面的回答中,我将展示如何按照您想要的方式处理class属性设置为landscape的表。

首先,让我们为这些表创建自定义的 css 应用程序。其目的是在表标记上设置自定义属性(例如,10001)。然后在布局期间,我们将检查该属性并决定是否更改页面大小。

    class CustomCssApplierFactory extends DefaultCssApplierFactory {
    @Override
    public ICssApplier getCustomCssApplier(IElementNode tag) {
        if ("table".equals(tag.name()) && "landscape".equals(tag.getAttribute(AttributeConstants.CLASS))) {
            return new CustomLandscapeCssApplier();
        }
        return null;
    }
}

class CustomLandscapeCssApplier extends TableTagCssApplier {
    @Override
    public void apply(ProcessorContext context, IStylesContainer stylesContainer, ITagWorker tagWorker) {
        super.apply(context, stylesContainer, tagWorker);
        IPropertyContainer container = tagWorker.getElementResult();
        if (null != container) {
            container.setProperty(10001, true);
        }
    }
}

现在,让我们不要将html转换为pdf文件,而是转换为构成html的IElements列表(您对最后一行特别感兴趣):

    PdfDocument pdfDocument = new PdfDocument(new PdfWriter(pdfDest));
    Document document = new Document(pdfDocument);

    ConverterProperties converterProperties = new ConverterProperties();
    converterProperties.setCssApplierFactory(new CustomCssApplierFactory());
    List<IElement> list = HtmlConverter.convertToElements(new FileInputStream(htmlSource), converterProperties);

现在让我们一个接一个地将这些元素添加到文档中,并检查当前元素(要添加的元素)是否具有Magic 10001属性。如果没有,则只需添加该元素。如果存在,让我们打破页面并在打破时设置下一页的大小:

        for (IElement element : list) {
        if (element instanceof IBlockElement) {
            if (!element.hasProperty(10001)) {
                document.add((IBlockElement) element);
            } else {
                document.add(new AreaBreak(new PageSize(PageSize.A4).rotate()));
                document.add((IBlockElement) element);
                document.getPdfDocument().setDefaultPageSize(PageSize.A4);
            }
        }
    }

正如您在上面的代码段中看到的,我破坏了页面(设置下一页的大小),添加了元素,然后再次设置下一个布局区域的大小,以便包含该元素的布局区域之后的下一页将具有默认的页面大小)。

但也有一些限制:

1) 一般来说,pdf文件不仅仅是页面上呈现的一组元素。在HtmlConverter下。convertToPdf iText还可以处理其他一些功能(轮廓等)。然而,对于您的目的来说,该方法似乎非常有效。

2)如您所见,我没有检查是否有一些表不是body标记的直接子表。实际上,为了在一般情况下正确执行,您需要修改循环:检查所有元素的子元素(可能使用` AbstractElement#getChildren())并在其中放置一些AreaBreaks。但那感觉是另一个问题。

 类似资料:
  • 我有一个从LibreOffice Writer导出的PDF文件。这里有一个例子。一些页面具有纵向,其他页面具有横向。我正在使用Linux,当我在evice或Foxit Reader中查看文件时,它会正确显示,即所有文本行都是水平的。它也可以在我的打印机上用A4纸正确打印:横向页面逆时针旋转90度,使文本行垂直。 问题是:文档将在另一台设备(出版商中)上打印,我被告知所有页面都必须具有纵向方向。我不

  • 对于演示节目,我被要求提供一个powerpoint文件。然而,我更喜欢LaTeX和Beamer来创建我的幻灯片。所以我有了创建一个自动脚本的想法,从我的PDF文件中提取图像并创建一个PPT文件。 我是Automator新手,但通过谷歌搜索,我很容易就找到了: 询问查找器项目。 将 PDF 页面呈现为图像。( 分辨率 : 300) 创建PPT图片幻灯片 不幸的是,有一个问题 :图片不能完全填满幻灯片

  • 我知道如何生成单个超文本标记语言页面。我想知道如何从多个超文本标记语言页面生成的pdf生成单个pdf页面。 例如,有和另一个文件我可以生成单独的pdf文件和分别来自html。我可以将它们写入文件系统,然后像iTextConcatenate示例中那样连接它们。 我只是想知道我是否可以在不将它们写入文件系统的情况下动态地组合此操作。我无法识别丢失的链接

  • 我想做的是保护一些敏感表单免受但不是所有页面中的攻击。 要保护从如果我设置它在config.php它适用于所有的页面.有没有办法做到这一点只有一些页面通过设置在控制器?

  • 本文向大家介绍在ASP中不用模板生成HTML静态页直接生成.html页面,包括了在ASP中不用模板生成HTML静态页直接生成.html页面的使用技巧和注意事项,需要的朋友参考一下 我们一般生成HTML静态页时,常常会事先做好一个模板,然后生成时调用模板文件。那么有没有办法不用模板,如一个正常的htmer.asp页面,直接生成为htmer.html页面呢?当然是可以的,而且非常简单,今天就教大家在A

  • 如果我试图做标题,我不会到达有页计数器。 如果我按照上面的代码做,我不会影响样式。