有两种主要方法可以旋转页面内容并使其显示在查看器中,就像旋转发生在可见页面的中间一样:任何一个实际上都是通过将旋转与平移连接在一起而绕其中间旋转,或者一个移动裁剪框使页面区域中心跟随旋转.

实际上围绕中心旋转

为此,我们将两个平移之间的旋转包围起来,第一个将坐标系的原点移动到页面中心,第二个将其再次移回.

PDDocument document = PDDocument.load(resource);

PDPage page = document.getDocumentCatalog().getPages().get(0);

PDPageContentStream cs = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.PREPEND, false, false);

PDRectangle cropBox = page.getCropBox();

float tx = (cropBox.getLowerLeftX() + cropBox.getUpperRightX()) / 2;

float ty = (cropBox.getLowerLeftY() + cropBox.getUpperRightY()) / 2;

cs.transform(Matrix.getTranslateInstance(tx, ty));

cs.transform(Matrix.getRotateInstance(Math.toRadians(45), 0, 0));

cs.transform(Matrix.getTranslateInstance(-tx, -ty));

cs.close();

(RotatePageContent test testRotateCenter)

显然,您可以将矩阵相乘并仅向PDF添加单个转换.

拉动裁剪框

为此,我们计算页面中心的移动并相应地移动框.

PDDocument document = PDDocument.load(resource);

PDPage page = document.getDocumentCatalog().getPages().get(0);

PDPageContentStream cs = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.PREPEND, false, false);

Matrix matrix = Matrix.getRotateInstance(Math.toRadians(45), 0, 0);

cs.transform(matrix);

cs.close();

PDRectangle cropBox = page.getCropBox();

float cx = (cropBox.getLowerLeftX() + cropBox.getUpperRightX()) / 2;

float cy = (cropBox.getLowerLeftY() + cropBox.getUpperRightY()) / 2;

Point2D.Float newC = matrix.transformPoint(cx, cy);

float tx = (float)newC.getX() - cx;

float ty = (float)newC.getY() - cy;

page.setCropBox(new PDRectangle(cropBox.getLowerLeftX() + tx, cropBox.getLowerLeftY() + ty, cropBox.getWidth(), cropBox.getHeight()));

PDRectangle mediaBox = page.getMediaBox();

page.setMediaBox(new PDRectangle(mediaBox.getLowerLeftX() + tx, mediaBox.getLowerLeftY() + ty, mediaBox.getWidth(), mediaBox.getHeight()));

(RotatePageContent测试testRotateMoveBox)

缩小内容以适应旋转后的效果

如果想要缩小旋转的内容以使其完全适合,可以将其作为第一个变体的简单扩展:

PDDocument document = PDDocument.load(resource);

PDPage page = document.getDocumentCatalog().getPages().get(0);

PDPageContentStream cs = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.PREPEND, false, false);

Matrix matrix = Matrix.getRotateInstance(Math.toRadians(45), 0, 0);

PDRectangle cropBox = page.getCropBox();

float tx = (cropBox.getLowerLeftX() + cropBox.getUpperRightX()) / 2;

float ty = (cropBox.getLowerLeftY() + cropBox.getUpperRightY()) / 2;

Rectangle rectangle = cropBox.transform(matrix).getBounds();

float scale = Math.min(cropBox.getWidth() / (float)rectangle.getWidth(), cropBox.getHeight() / (float)rectangle.getHeight());

cs.transform(Matrix.getTranslateInstance(tx, ty));

cs.transform(matrix);

cs.transform(Matrix.getScaleInstance(scale, scale));

cs.transform(Matrix.getTranslateInstance(-tx, -ty));

cs.close();

(RotatePageContent测试testRotateCenterScale)

更改裁剪框以使所有以前的页面区域保持可见

如果想要改变裁剪框以使所有东西都适合而不进行缩放,可以将其作为第二种变体的简单扩展:

PDDocument document = PDDocument.load(resource);

PDPage page = document.getDocumentCatalog().getPages().get(0);

PDPageContentStream cs = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.PREPEND, false, false);

Matrix matrix = Matrix.getRotateInstance(Math.toRadians(45), 0, 0);

cs.transform(matrix);

cs.close();

PDRectangle cropBox = page.getCropBox();

Rectangle rectangle = cropBox.transform(matrix).getBounds();

PDRectangle newBox = new PDRectangle((float)rectangle.getX(), (float)rectangle.getY(), (float)rectangle.getWidth(), (float)rectangle.getHeight());

page.setCropBox(newBox);

page.setMediaBox(newBox);

(RotatePageContent测试testRotateExpandBox)

样本结果

下图显示了上述每种方法的输出:

>实际上围绕中心旋转

>在旋转后缩小内容以适应

>拉动裁剪框

>更改裁剪框以使所有以前的页面区域保持可见

图像4与其他图像的尺寸不同,它应该显示更大.

java pdfbox_使用java中的PDFBox在其中心周围旋转PDF相关推荐

  1. JAVA文件搜索过程中如何得到各种文件内容(office文件,PDF,邮件,mht,思维导图等)

    现在流行的搜索引擎 Lucene, Elasticsearch处理文件搜索时一般使用 tika,使用tika 处理文件正文搜索还好,但搜索结果显示正文等操作不是很方便,并且tika提取正文的速度比较慢 ...

  2. java实现电子发票中的发票税号等信息识别的几种可用方案

    先说一下背景: 今天领导突然说需要做一个电子发票中发票税号的识别,于是乎就开始去调研看有哪些方案,最先想到的就是OCR文字识别,自己去画框训练模型去识别税号等相关信息 话不多说开整思路: 思路一:百度 ...

  3. java string 占位符_驳《阿里「Java开发手册」中的1个bug》?

    前两天写了一篇关于<阿里Java开发手册中的 1 个bug>的文章,评论区有点炸锅了,基本分为两派,支持老王的和质疑老王的. 首先来说,无论是那一方,我都真诚的感谢你们.特别是「二师兄」, ...

  4. SearchHit转成java对象_Java开发中最常犯的10个错误,你中招了吗?

    http://www.programcreek.com/2014/05/top-10-mistakes-java-developers-make/ 阅读目录 Array转ArrayList 判断一个数 ...

  5. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  6. android java style_Android 在Java代码中设置style属性--使用代码创建ProgressBar对象

    强烈推荐: 在andriod开发中,很大一部分都要与资源打交道,比如说:图片,布局文件,字符串,样式等等.这给我们想要开发一些公共的组件带来很大的困难,因为公共的组件可能更愿意以jar包的形式出现.但 ...

  7. java string与integer_Java中Integer和String浅谈

    http://qxzxcjq-126-com.iteye.com/blog/883283 Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float ...

  8. maven只打包java目录_ssm项目中maven对resources目录打包的路径_默认路径,自定义路径...

    博客引用处(以下内容在原有博客基础上进行补充或更改,谢谢这些大牛的博客指导): ssm项目打包后mybatis的mapper.xml文件没有放进去 问题出现的原因: ssm项目打包后mybatis的m ...

  9. JAVA坏境变量中的JAVA_HOME path classpath 的设置与作用。

    JAVA坏境变量中的JAVA_HOME path classpath 的设置与作用. 今天再次设置java的环境变量,突然发现每次设置都只是按照步骤一步步将其设置完,并不了解为啥要设置,于是上网找了找 ...

最新文章

  1. [Quick-x]制作新手引导高亮区域方法之二:裁剪模式
  2. Socket 基础解析使用ServerSocket建立聊天服务器
  3. Jar/War/Ear等包的作用与区别详解
  4. 20211020 段院士全驱系统
  5. 基于php构建APi流程,php – 如何构建一个RESTful API?
  6. 好轮子收藏:一个支持几乎所有流行格式的图像加载库stb_image.h
  7. shell 如何避免误删目录
  8. 批量转换epub书籍为mobi电子书
  9. HTML5-Drog和Drag
  10. 实验室信息管理系统(LIMS)软件大盘点
  11. js 对象和回调函数
  12. Eclipse中无法输入中文
  13. flex 随机数产生方法
  14. CODE RO RW ZI
  15. 为何 987654321/123456789 的值是 8.0000000729
  16. LaTeX--5--一个文档的基本结构/导言区/标题_作者_日期
  17. 如何将ios键盘返回由英文设置成中文
  18. 舰c2018换html5,[ 转] HTML/HTML5 download属性及其兼容性的探讨
  19. python运维自动化老男孩_老男孩第十四期 python 自动化运维第二周
  20. 每天一个npm包 之 qs

热门文章

  1. oracle 11g下载和安装教程
  2. 网络空间安全——Wargame靶场(Natas)
  3. 【最小生成树】小天狼星的访问
  4. ClickHouse之ReplicatedMergeTree引擎介绍
  5. 二年级上生活语文7.儿子女儿
  6. base64加密算法详解,以及使用时可能出现的问题
  7. Openshift介绍及常用命令
  8. 力扣(LeetCode)427. 建立四叉树(2023.03.01)
  9. 5、使用XQuery
  10. java版小易准备去魔法王国采购魔法神器