日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的java修改pdf内容流_java – 在PDFBox中,如何更改PDRectangle对象的原点(0,0)?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。