java修改pdf内容流_java – 在PDFBox中,如何更改PDRectangle对象的原点(0,0)?
你可以稍微改變坐標(biāo)系,但最有可能的事情不會(huì)變得更加優(yōu)雅.
首先……
首先讓我們澄清一些誤解:
你假設(shè)
In PDFBox, PDRectangle objects’ default origin (0,0) seems to be the lower-left corner of a page.
對(duì)于所有情況都不是這樣,僅僅是經(jīng)常.
包含顯示的頁(yè)面區(qū)域(在紙上或屏幕上)的區(qū)域通常由相關(guān)頁(yè)面的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.
因此,原點(diǎn)(0,0)可以在任何地方,它可以在頁(yè)面的左下角,左上角,中間或甚至遠(yuǎn)離顯示的頁(yè)面區(qū)域.
通過(guò)旋轉(zhuǎn)入口,該區(qū)域甚至可以旋轉(zhuǎn)(旋轉(zhuǎn)90°,180°或270°).
將原點(diǎn)(如您所觀察到的)放在左下方僅按慣例完成.
此外,您似乎認(rèn)為坐標(biāo)系是不變的.實(shí)際情況并非如此,您可以通過(guò)這些操作大幅度轉(zhuǎn)換用戶空間坐標(biāo)系,您可以平移,旋轉(zhuǎn),鏡像,傾斜和/或縮放它!
因此,即使在開(kāi)始時(shí)坐標(biāo)系是通常的坐標(biāo)系,原點(diǎn)在左下方,x軸向右,y軸向上,也可以在某種程度上改變?yōu)轫?yè)面內(nèi)容描述中的奇怪的東西.繪制矩形新的PDRectangle(0,0,100,100)可能會(huì)在頁(yè)面中心右側(cè)產(chǎn)生一些菱形形式.
你可以做什么…
如您所見(jiàn),PDF用戶空間中的坐標(biāo)是一個(gè)非常動(dòng)態(tài)的問(wèn)題.你可以做些什么來(lái)馴服情況,取決于你使用矩形的上下文.
不幸的是,你在描述你所做的事情時(shí)非常模糊.因此,這也有些模糊.
協(xié)調(diào)頁(yè)面內(nèi)容
如果要在現(xiàn)有頁(yè)面上繪制一些矩形,首先需要一個(gè)頁(yè)面內(nèi)容流來(lái)寫(xiě)入,即PDPageContentStream實(shí)例,并且應(yīng)該以保證原始用戶空間坐標(biāo)系沒(méi)有受到干擾的方式準(zhǔn)備它. .通過(guò)使用帶有三個(gè)布爾參數(shù)的構(gòu)造函數(shù)將所有它們?cè)O(shè)??置為true來(lái)獲得這樣的實(shí)例:
PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true, true);
然后,您可以將變換應(yīng)用于坐標(biāo)系.您希望左上角是原點(diǎn),x值向下增加.如果頁(yè)面的裁剪框告訴您左上角有坐標(biāo)(xtl,ytl),則應(yīng)用
contentStream.concatenate2CTM(new AffineTransform(1, 0, 0, -1, xtl, ytl));
從這里你有一個(gè)你想要的坐標(biāo)系,原點(diǎn)左上角和y坐標(biāo)鏡像.
但要注意一件事:如果你要繪制文本,不僅文本插入點(diǎn)y坐標(biāo)是鏡像的,而且文本本身除非你通過(guò)添加一個(gè)鏡像文本矩陣來(lái)抵消它!因此,如果您想添加更多文本,這可能不如您想要的那么優(yōu)雅.
協(xié)調(diào)注釋
如果您不想在內(nèi)容流中使用矩形,而是添加注釋,則不受上述轉(zhuǎn)換的影響,但您也無(wú)法使用它.
因此,在此上下文中,您必須按原樣拍攝裁剪框并相應(yīng)地變換矩形.
為什么PDFBox文本提取坐標(biāo)是這樣的
基本上用于以正確的順序?qū)⑽谋拘蟹旁谝黄鸩⒄_排序行,您不需要這樣一個(gè)奇怪的情況,而是一個(gè)簡(jiǎn)單的穩(wěn)定坐標(biāo)系.一些PDFBox開(kāi)發(fā)人員為此選擇了左上角,y增加向下的變體,因此TextPosition坐標(biāo)已經(jīng)標(biāo)準(zhǔn)化為該方案.
在我看來(lái),更好的選擇是使用默認(rèn)的用戶空間坐標(biāo),以便更容易地重復(fù)使用坐標(biāo).因此,您可能希望嘗試使用textPosition.getTextMatrix().getTranslateX(),textPosition.getTextMatrix().getTranslateY()以獲取TextPosition textPosition
總結(jié)
以上是生活随笔為你收集整理的java修改pdf内容流_java – 在PDFBox中,如何更改PDRectangle对象的原点(0,0)?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 多地高考结束 考生称英语比数学好考:有男
- 下一篇: 场面壮观!云南超1亿只蝴蝶大爆发