PDFBox 2.0.3 使用 TextPosition 坐标设置 cropBox
PDFBox 2.0.3 Set cropBox using TextPosition coordinates
我通过使用 PDFTextStripper
跟踪 TextPosition
个对象在页面中找到了一个感兴趣的区域,如示例所示:https://github.com/apache/pdfbox/blob/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/PrintTextLocations.java
如图所示,TextPosition 已从诸如
text.getXDirAdj()
、text.getWidthDirAdj()
、text.getYDirAdj()
、text.getHeightDir()
.
在这个例子中,除了设置目标页面的 cropBox 之外,我尝试保持其他一切不变。
旧裁剪框:[0.0,0.0,595.276,841.89] -> 新裁剪框[50.0,42.0,592.0,642.0]。
那么如何使用 getYDirAdj
和 getXDirAdj
来正确设置裁剪框?
我正在处理的原始pdf文件可以从这里下载:http://downloadcenter.samsung.com/content/UM/201504/20150407095631744/ENG-US_NMATSCJ-1.103-0330.pdf
裁剪页面
OP 在评论中将他的问题简化为
Ok. Given a java PDRectangle rect = new PDRectangle(40f, 680f, 510f, 100f)
obtained from TextLocation
how would a java code snippet, that sets the cropBox of a single page look like ? Or how would you do it? TextLocation
based rect --> some transformation --> setCropBox(theRightBox)
.
要将给定文档第十二页的裁剪框设置为给定 PDRectangle
,您可以使用如下代码:
PDDocument pdDocument = PDDocument.load(resource);
PDPage page = pdDocument.getPage(12-1);
page.setCropBox(new PDRectangle(40f, 680f, 510f, 100f));
pdDocument.save(new File(RESULT_FOLDER, "ENG-US_NMATSCJ-1.103-0330-page12cropped.pdf"));
(SetCropBox.java测试方法testSetCropBoxENG_US_NMATSCJ_1_103_0330
)
Adobe Reader 现在仅显示第十二页的这一部分:
但是请注意,相关页面不仅指定了媒体框(强制性)和裁剪框,还定义了出血框和艺术框。因此,认为那些框比裁剪框更有趣的应用程序可能会以不同方式显示页面。特别是艺术框(被定义为“页面有意义内容的范围”)可能被一些应用程序认为是重要的。
正在呈现裁剪后的页面
在对此答案的评论中,OP 评论道
This is good and works. It correctly saves the page in the PDF file. I've tried to do the same in JPG and failed.
我将 OP 的代码精简到最基本的部分
PDDocument pdDocument = PDDocument.load(resource);
PDPage page = pdDocument.getPage(12-1);
page.setCropBox(new PDRectangle(40f, 680f, 510f, 100f));
PDFRenderer renderer = new PDFRenderer(pdDocument);
BufferedImage img = renderer.renderImage(12 - 1, 4f);
ImageIOUtil.writeImage(img, new File(RESULT_FOLDER, "ENG-US_NMATSCJ-1.103-0330-page12cropped.jpg").getAbsolutePath(), 300);
pdDocument.close();
(SetCropBox.java测试方法testSetCropBoxImgENG_US_NMATSCJ_1_103_0330
)
结果:
因此,我无法在此处重现问题。
可能要检查的详细信息:
ImageIOUtil
不是主要 PDFBox 工件的一部分,而是位于 pdfbox-tools 中;该工件的版本是否与核心 pdfbox 工件的版本匹配?
- 我运行 Oracle Java 8环境下的代码;其他 Java 环境可能会产生不同的结果。
- 我们的实施存在细微差别。例如。我通过
InputStream
加载 PDF,你直接从文件系统加载,我硬编码了页码,你把它放在某个变量中,... None 这些差异应该会导致你的问题,但是谁知道...
我通过使用 PDFTextStripper
跟踪 TextPosition
个对象在页面中找到了一个感兴趣的区域,如示例所示:https://github.com/apache/pdfbox/blob/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/PrintTextLocations.java
如图所示,TextPosition 已从诸如
text.getXDirAdj()
、text.getWidthDirAdj()
、text.getYDirAdj()
、text.getHeightDir()
.
在这个例子中,除了设置目标页面的 cropBox 之外,我尝试保持其他一切不变。
旧裁剪框:[0.0,0.0,595.276,841.89] -> 新裁剪框[50.0,42.0,592.0,642.0]。
那么如何使用 getYDirAdj
和 getXDirAdj
来正确设置裁剪框?
我正在处理的原始pdf文件可以从这里下载:http://downloadcenter.samsung.com/content/UM/201504/20150407095631744/ENG-US_NMATSCJ-1.103-0330.pdf
裁剪页面
OP 在评论中将他的问题简化为
Ok. Given a java
PDRectangle rect = new PDRectangle(40f, 680f, 510f, 100f)
obtained fromTextLocation
how would a java code snippet, that sets the cropBox of a single page look like ? Or how would you do it?TextLocation
based rect --> some transformation -->setCropBox(theRightBox)
.
要将给定文档第十二页的裁剪框设置为给定 PDRectangle
,您可以使用如下代码:
PDDocument pdDocument = PDDocument.load(resource);
PDPage page = pdDocument.getPage(12-1);
page.setCropBox(new PDRectangle(40f, 680f, 510f, 100f));
pdDocument.save(new File(RESULT_FOLDER, "ENG-US_NMATSCJ-1.103-0330-page12cropped.pdf"));
(SetCropBox.java测试方法testSetCropBoxENG_US_NMATSCJ_1_103_0330
)
Adobe Reader 现在仅显示第十二页的这一部分:
但是请注意,相关页面不仅指定了媒体框(强制性)和裁剪框,还定义了出血框和艺术框。因此,认为那些框比裁剪框更有趣的应用程序可能会以不同方式显示页面。特别是艺术框(被定义为“页面有意义内容的范围”)可能被一些应用程序认为是重要的。
正在呈现裁剪后的页面
在对此答案的评论中,OP 评论道
This is good and works. It correctly saves the page in the PDF file. I've tried to do the same in JPG and failed.
我将 OP 的代码精简到最基本的部分
PDDocument pdDocument = PDDocument.load(resource);
PDPage page = pdDocument.getPage(12-1);
page.setCropBox(new PDRectangle(40f, 680f, 510f, 100f));
PDFRenderer renderer = new PDFRenderer(pdDocument);
BufferedImage img = renderer.renderImage(12 - 1, 4f);
ImageIOUtil.writeImage(img, new File(RESULT_FOLDER, "ENG-US_NMATSCJ-1.103-0330-page12cropped.jpg").getAbsolutePath(), 300);
pdDocument.close();
(SetCropBox.java测试方法testSetCropBoxImgENG_US_NMATSCJ_1_103_0330
)
结果:
因此,我无法在此处重现问题。
可能要检查的详细信息:
ImageIOUtil
不是主要 PDFBox 工件的一部分,而是位于 pdfbox-tools 中;该工件的版本是否与核心 pdfbox 工件的版本匹配?- 我运行 Oracle Java 8环境下的代码;其他 Java 环境可能会产生不同的结果。
- 我们的实施存在细微差别。例如。我通过
InputStream
加载 PDF,你直接从文件系统加载,我硬编码了页码,你把它放在某个变量中,... None 这些差异应该会导致你的问题,但是谁知道...