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

如何将PDF页面的内容旋转到任意角度?

訾朗
2023-03-14

我需要将PDF页面的内容旋转任意角度,然后旋转PDF页面。setRotation(int)命令限制为90度的倍数。页面的内容是矢量和文本,我需要能够在以后放大内容,这意味着我无法将页面转换为图像,因为分辨率降低。

共有2个答案

金承嗣
2023-03-14

请阅读ISO-32000-1(这是PDF的ISO标准),更具体地说是表30(“页面对象中的条目”)。它像这样定义了Rotate条目(文字复制/粘贴):

显示或打印页面时顺时针旋转的度数。该值应为90的倍数。默认值:0。

每当ISO标准使用“应”一词时,您都会遇到一条规范性规则(与标准使用“应”一词时相反,在这种情况下,您会遇到一条建议)。

简言之:您提出的问题是PDF规范明确禁止的。满足您的要求在PDF中是不可能的。页面的方向可以是0、90、180或270度。您必须旋转页面上的内容,而不是旋转页面。

薛阳荣
2023-03-14

评论中已经指出,要以任意角度在新的常规纵向或横向页面上绘制一些内容,例如现有的常规纵向或横向页面,可以使用此答案中提供的机制。

正如此处所示的代码

  1. 需要PDFBox development 2.0.0-SNAPSHOT版本和

不过,这里有一个快速

这种方法

void transformPage(PDDocument document, PDPage page, AffineTransform at) throws IOException, COSVisitorException
{
    PDRectangle cropBox = page.findCropBox();
    float xOffset = (cropBox.getUpperRightX() + cropBox.getLowerLeftX()) / 2f;
    float yOffset = (cropBox.getUpperRightY() + cropBox.getLowerLeftY()) / 2f;
    AffineTransform transform = AffineTransform.getTranslateInstance(xOffset, yOffset);
    transform.concatenate(at);
    transform.concatenate(AffineTransform.getTranslateInstance(-xOffset, -yOffset));

    PDPageContentStream stream = new PDPageContentStream(document, page, true, false);
    stream.concatenate2CTM(transform);
    stream.close();

    COSBase contents = page.getCOSDictionary().getDictionaryObject(COSName.CONTENTS);
    if (contents instanceof COSStreamArray)
    {
        COSStreamArray contentsArray = (COSStreamArray) contents;
        COSArray newArray = new COSArray();
        newArray.add(contentsArray.get(contentsArray.getStreamCount() - 1));

        for (int i = 0; i < contentsArray.getStreamCount() - 1; i++)
        {
            newArray.add(contentsArray.get(i));
        }

        COSStreamArray newStreamArray = new COSStreamArray(newArray);
        page.getCOSDictionary().setItem(COSName.CONTENTS, newStreamArray);
    }
}

将给定转换应用于给定页面。为了使手头的用例(旋转PDF页面的内容)更容易,转换包含在翻译中,将坐标系的原点移动到转换页面的中心。

方法可以这样使用

try ( InputStream sourceStream = getClass().getResourceAsStream("13.pdf") )
{
    final PDDocument document = PDDocument.load(sourceStream);
    final AffineTransform transform = AffineTransform.getRotateInstance(Math.PI / 4);

    List<PDPage> pages = document.getDocumentCatalog().getAllPages();

    for (PDPage page: pages)
    {
        transformPage(document, page, transform);
    }

    document.save("13-transformedPages.pdf");
}

将文档的页面逆时针旋转45°(PI/4,数学上为正旋转方向)。

 类似资料:
  • 我想生产一个PDF的网页在景观。虽然可以使用以下方法将页面大小设置为横向: 这并没有达到我想要的,因为我添加的任何内容仍然是面向左->右的,而我希望它是底部->顶部的。 即。这就是我得到的: 我已经能够实现所需的输出打开PDF后,它已经创建并使用iText旋转它,但我想要一个解决方案,让我旋转后立即与iText添加内容。

  • 我有一个22*17的PDF文件,我需要它来适应11*8.5的页面内容。 基本上减小了现有的页面大小。我正在使用断章。 我该怎么做?

  • 本文向大家介绍Unity实现绕任意轴任意角度旋转向量,包括了Unity实现绕任意轴任意角度旋转向量的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Unity实现绕任意轴任意角度旋转向量的具体代码,供大家参考,具体内容如下 游戏中有一需求,就是一个矩形或者Cube绕着某一点旋转任意角度,现在给出下面算法。 测试用例 效果图   以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大

  • 我尝试使用iTextSharp创建一个多页pdf文档。我有一个包含自身方向(横向或纵向)的对象。当第一个对象包含需要横向模式的信息时,我用< code > Document doc = new Document(PageSize。A4.Rotate(),10f,10f,10f,0f)。这工作得很好,直到下一个元素是肖像模式!如果一个元素处于纵向模式,我再次设置页面大小:< code>doc。Set

  • 我从供应商那里收到单页pdf文件的邮资标签。这些标签可以贴在A5纸上,但它们在A4纸上是纵向的,也是纵向的。我希望能够在A4纸上打印两个这样的标签,以减少浪费。 这可以通过旋转页面内容而不旋转页面本身来实现。或者通过交换内容的高度和宽度来调整页面的大小。我知道这两种情况都会导致内容丢失,但这对于我的用例来说不是问题。理想情况下,我希望命令行应用程序既可以在Linux机器上运行,也可以在Window

  • 本文向大家介绍java实现图片无损任意角度旋转,包括了java实现图片无损任意角度旋转的使用技巧和注意事项,需要的朋友参考一下 前言 在做项目的时候遇到一个业务需要对图片进行旋转,于是找到一个工具类,亲测有效;在此与大家共享,需要用时可以直接用哈! 实战 一、旋转工具类代码: 二、调用工具类的代码: 三、效果 1、被旋转的图片: 2、顺时针旋转90度图片: 3、顺时针旋转180度图片: 4、顺时针