java修改pdf内容流_java – 在PDFBox中,如何更改PDRectangle对象的原点(0,0)?

你可以稍微改变坐标系,但最有可能的事情不会变得更加优雅.

首先……

首先让我们澄清一些误解:

你假设

In PDFBox, PDRectangle objects’ default origin (0,0) seems to be the lower-left corner of a page.

对于所有情况都不是这样,仅仅是经常.

包含显示的页面区域(在纸上或屏幕上)的区域通常由相关页面的CropBox条目定义:

CropBox rectangle (Optional; inheritable) A rectangle, expressed in default user space units, that shall define the visible region of default user space.

When the page is displayed or printed, its contents shall be clipped (cropped) to this rectangle and then shall be imposed on the output medium in some implementation-defined manner.

… The positive x axis extends horizontally to the right and the positive y axis vertically upward, as in standard mathematical practice (subject to alteration by the Rotate entry in the page dictionary).

… In PostScript, the origin of default user space always corresponds to the lower-left corner of the output medium. While this convention is common in PDF documents as well, it is not required; the page dictionary’s CropBox entry can specify any rectangle of default user space to be made visible on the medium.

因此,原点(0,0)可以在任何地方,它可以在页面的左下角,左上角,中间或甚至远离显示的页面区域.

通过旋转入口,该区域甚至可以旋转(旋转90°,180°或270°).

将原点(如您所观察到的)放在左下方仅按惯例完成.

此外,您似乎认为坐标系是不变的.实际情况并非如此,您可以通过这些操作大幅度转换用户空间坐标系,您可以平移,旋转,镜像,倾斜和/或缩放它!

因此,即使在开始时坐标系是通常的坐标系,原点在左下方,x轴向右,y轴向上,也可以在某种程度上改变为页面内容描述中的奇怪的东西.绘制矩形新的PDRectangle(0,0,100,100)可能会在页面中心右侧产生一些菱形形式.

你可以做什么…

如您所见,PDF用户空间中的坐标是一个非常动态的问题.你可以做些什么来驯服情况,取决于你使用矩形的上下文.

不幸的是,你在描述你所做的事情时非常模糊.因此,这也有些模糊.

协调页面内容

如果要在现有页面上绘制一些矩形,首先需要一个页面内容流来写入,即PDPageContentStream实例,并且应该以保证原始用户空间坐标系没有受到干扰的方式准备它. .通过使用带有三个布尔参数的构造函数将所有它们设​​置为true来获得这样的实例:

PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true, true);

然后,您可以将变换应用于坐标系.您希望左上角是原点,x值向下增加.如果页面的裁剪框告诉您左上角有坐标(xtl,ytl),则应用

contentStream.concatenate2CTM(new AffineTransform(1, 0, 0, -1, xtl, ytl));

从这里你有一个你想要的坐标系,原点左上角和y坐标镜像.

但要注意一件事:如果你要绘制文本,不仅文本插入点y坐标是镜像的,而且文本本身除非你通过添加一个镜像文本矩阵来抵消它!因此,如果您想添加更多文本,这可能不如您想要的那么优雅.

协调注释

如果您不想在内容流中使用矩形,而是添加注释,则不受上述转换的影响,但您也无法使用它.

因此,在此上下文中,您必须按原样拍摄裁剪框并相应地变换矩形.

为什么PDFBox文本提取坐标是这样的

基本上用于以正确的顺序将文本行放在一起并正确排序行,您不需要这样一个奇怪的情况,而是一个简单的稳定坐标系.一些PDFBox开发人员为此选择了左上角,y增加向下的变体,因此TextPosition坐标已经标准化为该方案.

在我看来,更好的选择是使用默认的用户空间坐标,以便更容易地重复使用坐标.因此,您可能希望尝试使用textPosition.getTextMatrix().getTranslateX(),textPosition.getTextMatrix().getTranslateY()以获取TextPosition textPosition

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于visual Studio2013解决面试题之0902内存拷贝

题目解决代码及点评/*用 C 语言实现函数 void * memmove(void *dest,const void *src,size_t n)memmove 函数的功能是拷贝 src 所指的内存内容前 n 个字节到 dest 所指的地址上。 简单循环拷贝即可,但是这道题,要深…

冠榕智能灯光控制协议分析(controller init)

上面几篇已经详细介绍了z-wave协议的分析方法,这一章,我们分析z-wave pc controller初始化时的通信信息。我们只将关键信息列出,然后直接将分析出来的串口数据列出。 1. 得到z-wave版本 01 03 00 15 E9 06 01 10 01 15 5A 2D 57 61 76 65…

jmeter找不到java_Windows下Jmeter安装出现Not able to find Java executable or version问题解决方案...

最近在做一个开放接口平台性能测试 , 指标是最少达到1000/s的并发 , 接口鉴权 百万级的表 在1s内完成..在众多压测工具中 ,,选择了Apache的jmeter ,于官网下载了最新版本http://jmeter.apache.org/download_jmeter.cgi (jmeter下载地址)由于jmeter运行是基于java的,所以需要…

java 第三方库

总结一下常用的java第三方库,方便查询和使用,欢迎补充。 1、核心库 Apache Commons Lang:来自Apache的核心库,为java.lang API补充了许多常用的工具类,如字符串操作、对象的创建等。 Google Guava:来自谷歌…

ZDB5304烧写方法

1. 跳线和5304的位置如下图 2. 打开z-wave programmer软件,设置如下图,注意烧写接口为uart,烧写的时候会提示的。选yes是uart,选no是spi。 烧写过程中会提示按下reset或释放reset按键。照做即可。 烧完后&#xff0c…

Java多进程测试用例_Pytest xdist/Pytest并行多进程执行测试用例,pytestxdistpytestparallel...

如果想分布式执行用例,用例设计必须遵循以下原则:1.用例之间都是独立的,2.用例a不要去依赖用例b3.用例执行没先后顺序,4.随机都能执行每个用例都能独立运行成功每个用例都能重复运行,不影响其它用例这跟就我们平常多个…

【转】宇宙的基本法则

开宗明义,“复制因子→复制→成长→自然选择”法则是支配宇宙的基本法则,为了方便,我称其为“B法则” 。所谓复制,就是在一 定条件下一个复制因子一旦形成,就会一直不停地复制自身,不断成长,比…

java jni librtmp_librtmp 编译集成

RTMPDumpRTMPDump 是一个用来处理RTMP流媒体的开源工具包。它能够单独使用进行RTMP的通信,也可以集成到FFmpeg中通过FFmpeg接口来使用RTMPDump。在Android中可以直接借助NDK在JNI层调用RTMPDump来完成RTMP通信。在根目录下提供了一个Makefile与一些.c源文件。这里的…

基于Z-Wave无线技术的指纹锁系统设计

http://www.chinaaet.com/article/218940 摘 要: 结合新兴的低功耗的Z-Wave短距无线通信技术,设计一种应用于酒店的智能指纹锁无线管理与控制系统。该系统的门锁硬件电路包括主控制器S3C2440、指纹采集模块、电机驱动模块及ZM3102无线模块,…

Hibernate一对一关联------主键关联(亲测成功)

1、创建两个实体(Company.java和Login.java)代码如下: 1 package wck.stu.vo.onetoonein;2 3 public class Company {4 private String id "";5 6 private String companyName "";7 8 private Str…

angularjs mysql_AngularJS SQL

AngularJS SQL在前面章节中的代码也可以用于读取数据库中的数据。使用 PHP 从 MySQL 中获取数据AngularJS 实例{{ x.Name }}{{ x.Country }}function customersController($scope,$http) {var site "http://www.w3cschool.cn";var page "/statics/demosource/…

INTEL和AMD两大巨头的前身

仙童半导体公司,曾经是世界上最大、最富创新精神和最令人振奋的半导体生产企业,为硅谷的成长奠定了坚实的基础。更重要的是,这家公司还为硅谷孕育了成千上万的技术人才和管理人才,它不愧是电子、电脑业界的“西点军校”&#xff0…

servlet加载资源两种方式-内外(初始化参数).properties文件

在servlet中加载资源很方便,通过servletContext,这个是web服务器加载完web项目返回的参数之一,还有servletConfig,得到web项目一些配置信息,request和response,等等,我们现在用的这个servletContext也叫做C…

java 登录编程_Java编程通过session访问需要登录的页面

使用Java访问一般网页,进行数据抓取等比较简单,直接用URL和URLConnection连接所需要的网站地址即可,然后对返回的html源码进行处理分析,获取感兴趣的内容。不过如果是需要登录后才能访问的网页就不能直接传入网站url进行连接了&am…

ZDB5202烧成控制器方法

1.跳线和ZDB5202的安装位置如下图 黄色开关设置为off状态,就是靠近班子里面的一方。 2.打开z-wave programmer软件,设置如下图,注意烧写接口为spi,烧写的时候会提示的。选yes是uart,选no是spi。…

判断一个数是不是整数

<?php //判断一个数是整数吗&#xff1f; function check($num){if($num>1){return (check($num-1));//采用递归&#xff0c;一直减到0到1之间}elseif($num<0){return(check((-1)*$num-1));//采用递归&#xff0c;一直减到0到1之间}else{if(($num>0) && (…

z-wave问题汇总

1. 如果发送的串口数据的checksum不对的话&#xff0c;z-wave结点会响应一个0x15。 2. 5202&#xff0c;5101既可以做控制也可以做设备端。他们都是外置天线&#xff0c;距离会好一点。 另外5202和5101也可以做路由结点。 5304只能做控制端&#xff0c;5304的天线是…

java enumeration 排序_Java如何对java.util.Enumeration进行排序?

在此代码段中&#xff0c;您将看到如何对Enumeration对象的内容进行排序。我们首先创建一个随机数并将其存储在中Vector。我们用这些数字&#xff0c;并创建和Enumeration调用对象Vector的elements()方法。我们把它转换为java.util.List&#xff0c;然后排序的内容List使用Coll…

controller配对与接触配对

1&#xff0e; 当点击添加按钮后 以上数据&#xff0c;都是z-wave主控制器与pc controller软件的交换。 2&#xff0e; 当连续点击从结点的配对按钮后。 3&#xff0e; 当点击remove按钮后 4&#xff0e; 当连续点击从结点接触配对按钮后

php可以调用windowsapi吗_2.如何调用WindowsApi

2.如何调用WindowsApi在上一篇章节中 很不专业的介绍了一下WindowsApi 如果你本身就知道 那你也压根不用看 如果你本身就不知道 就算我说的再多 估计你也觉得是多余 所以还是来点实际的首先 在C#中想要调用那些Api(当然不一定是Windows提供的Api) 你得添加一个引用&#xff1a;…