java pdfbox_使用java中的PDFBox在其中心周围旋转PDF
有两种主要方法可以旋转页面内容并使其显示在查看器中,就像旋转发生在可见页面的中间一样:任何一个实际上都是通过将旋转与平移连接在一起而绕其中间旋转,或者一个移动裁剪框使页面区域中心跟随旋转.
实际上围绕中心旋转
为此,我们将两个平移之间的旋转包围起来,第一个将坐标系的原点移动到页面中心,第二个将其再次移回.
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相关推荐
- JAVA文件搜索过程中如何得到各种文件内容(office文件,PDF,邮件,mht,思维导图等)
现在流行的搜索引擎 Lucene, Elasticsearch处理文件搜索时一般使用 tika,使用tika 处理文件正文搜索还好,但搜索结果显示正文等操作不是很方便,并且tika提取正文的速度比较慢 ...
- java实现电子发票中的发票税号等信息识别的几种可用方案
先说一下背景: 今天领导突然说需要做一个电子发票中发票税号的识别,于是乎就开始去调研看有哪些方案,最先想到的就是OCR文字识别,自己去画框训练模型去识别税号等相关信息 话不多说开整思路: 思路一:百度 ...
- java string 占位符_驳《阿里「Java开发手册」中的1个bug》?
前两天写了一篇关于<阿里Java开发手册中的 1 个bug>的文章,评论区有点炸锅了,基本分为两派,支持老王的和质疑老王的. 首先来说,无论是那一方,我都真诚的感谢你们.特别是「二师兄」, ...
- SearchHit转成java对象_Java开发中最常犯的10个错误,你中招了吗?
http://www.programcreek.com/2014/05/top-10-mistakes-java-developers-make/ 阅读目录 Array转ArrayList 判断一个数 ...
- java mod %区别_Java中 % 与Math.floorMod() 区别详解
%为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...
- android java style_Android 在Java代码中设置style属性--使用代码创建ProgressBar对象
强烈推荐: 在andriod开发中,很大一部分都要与资源打交道,比如说:图片,布局文件,字符串,样式等等.这给我们想要开发一些公共的组件带来很大的困难,因为公共的组件可能更愿意以jar包的形式出现.但 ...
- java string与integer_Java中Integer和String浅谈
http://qxzxcjq-126-com.iteye.com/blog/883283 Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float ...
- maven只打包java目录_ssm项目中maven对resources目录打包的路径_默认路径,自定义路径...
博客引用处(以下内容在原有博客基础上进行补充或更改,谢谢这些大牛的博客指导): ssm项目打包后mybatis的mapper.xml文件没有放进去 问题出现的原因: ssm项目打包后mybatis的m ...
- JAVA坏境变量中的JAVA_HOME path classpath 的设置与作用。
JAVA坏境变量中的JAVA_HOME path classpath 的设置与作用. 今天再次设置java的环境变量,突然发现每次设置都只是按照步骤一步步将其设置完,并不了解为啥要设置,于是上网找了找 ...
最新文章
- [Quick-x]制作新手引导高亮区域方法之二:裁剪模式
- Socket 基础解析使用ServerSocket建立聊天服务器
- Jar/War/Ear等包的作用与区别详解
- 20211020 段院士全驱系统
- 基于php构建APi流程,php – 如何构建一个RESTful API?
- 好轮子收藏:一个支持几乎所有流行格式的图像加载库stb_image.h
- shell 如何避免误删目录
- 批量转换epub书籍为mobi电子书
- HTML5-Drog和Drag
- 实验室信息管理系统(LIMS)软件大盘点
- js 对象和回调函数
- Eclipse中无法输入中文
- flex 随机数产生方法
- CODE RO RW ZI
- 为何 987654321/123456789 的值是 8.0000000729
- LaTeX--5--一个文档的基本结构/导言区/标题_作者_日期
- 如何将ios键盘返回由英文设置成中文
- 舰c2018换html5,[ 转] HTML/HTML5 download属性及其兼容性的探讨
- python运维自动化老男孩_老男孩第十四期 python 自动化运维第二周
- 每天一个npm包 之 qs