PDFBox 2.0.3使用TextPosition坐标设置cropBox

时间:2016-09-25 16:09:41

标签: java pdf pdfbox

我已使用TextPosition跟踪PDFTextStripper个对象,找到了该网页中感兴趣的区域,如示例所示: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之外,我试图保持其他所有内容。

https://github.com/apache/pdfbox/blob/2.0.3/tools/src/main/java/org/apache/pdfbox/tools/PDFToImage.java

OLD CROPBOX:[0.0,0.0,595.276,841.89] - >新的CROPBOX [50.0,42.0,592.0,642.0]。

那么如何在正确设置庄稼时使用getYDirAdjgetXDirAdj

我可以从此处下载我正在处理的原始pdf文件:http://downloadcenter.samsung.com/content/UM/201504/20150407095631744/ENG-US_NMATSCJ-1.103-0330.pdf

1 个答案:

答案 0 :(得分:1)

裁剪页面

在评论中,OP将他的问题缩小为

  

确定。鉴于从PDRectangle rect = new PDRectangle(40f, 680f, 510f, 100f)获得的java TextLocation如何将java代码片段设置为单个页面的cropBox?或者你会怎么做?基于TextLocation的rect - >一些转变 - > 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

Adob​​e Reader现在仅显示第12页的这一部分:

Screenshot

请注意,相关页面不仅指定了媒体框(必填)和裁剪框,还定义了出血框和艺术框。因此,考虑那些比裁剪框更有趣的框的应用程序可能以不同方式显示页面。特别是艺术框(被定义为"页面的有意义内容的范围")可能被一些应用程序认为是重要的。

渲染裁剪的页面

在对这个答案的评论中,OP评论了

  

这很好并且有效。它正确地将页面保存在PDF文件中。我试图在JPG中做同样的事情并且失败了。

我将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

结果:

Result image

因此,我不能在这里重现一个问题。

检查可能的详细信息:

  • ImageIOUtil不是主PDFBox工件的一部分,而是位于 pdfbox-tools ;该工件的版本是否与核心 pdfbox 工件的版本相匹配?
  • 我在Oracle Java 8环境中运行代码;其他Java环境可能会产生不同的结果。
  • 我们的实施方式存在细微差别。例如。我通过InputStream加载PDF,你直接从文件系统加载,我已经硬编码了页码,你有一些变量,......这些差异都不会引起你的问题,但谁知道......