我有一个pdf,其中包含一些数据,后跟一些空格.我不知道数据有多大,但我想在数据之后删除空白

PdfReader reader = new PdfReader(PDFLOCATION);

Rectangle rect = new Rectangle(700, 2000);

Document document = new Document(rect);

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(SAVELCATION));

document.open();

int n = reader.getNumberOfPages();

PdfImportedPage page;

for (int i = 1; i <= n; i++) {

document.newPage();

page = writer.getImportedPage(reader, i);

Image instance = Image.getInstance(page);

document.add(instance);

}

document.close();

有没有办法剪切/修剪新文档中每个页面的空白?

此PDF包含矢量图形.

我使用iTextPDF,但可以切换到任何Java库(mavenized,Apache许可首选)

解决方法:

>由于您只想修剪页面,这不是PdfWriter getImportedPage用法的情况,而是PdfStamper的使用情况.使用PdfStamper的主代码可能如下所示:

PdfReader reader = new PdfReader(resourceStream);

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("target/test-outputs/test-trimmed-stamper.pdf"));

// Go through all pages

int n = reader.getNumberOfPages();

for (int i = 1; i <= n; i++)

{

Rectangle pageSize = reader.getPageSize(i);

Rectangle rect = getOutputPageSize(pageSize, reader, i);

PdfDictionary page = reader.getPageN(i);

page.put(PdfName.CROPBOX, new PdfArray(new float[]{rect.getLeft(), rect.getBottom(), rect.getRight(), rect.getTop()}));

stamper.markUsed(page);

}

stamper.close();

如您所见,我还为您的getOutputPageSize方法添加了另一个参数.这是页码.毕竟,要修剪的空白区域在不同的页面上可能会有所不同.

>如果源文档不包含矢量图形,您可以简单地使用iText解析器包类.甚至已经有一个基于它们的TextMarginFinder.在这种情况下,getOutputPageSize方法(带有附加页面参数)可能如下所示:

private Rectangle getOutputPageSize(Rectangle pageSize, PdfReader reader, int page) throws IOException

{

PdfReaderContentParser parser = new PdfReaderContentParser(reader);

TextMarginFinder finder = parser.processContent(page, new TextMarginFinder());

Rectangle result = new Rectangle(finder.getLlx(), finder.getLly(), finder.getUrx(), finder.getUry());

System.out.printf("Text/bitmap boundary: %f,%f to %f, %f\n", finder.getLlx(), finder.getLly(), finder.getUrx(), finder.getUry());

return result;

}

将此方法与您的文件test.pdf一起使用会导致:

如您所见,代码根据页面上的文本(和位图图像)内容进行修剪.

>要找到关于矢量图形的边界框,你基本上也必须这样做,但是你必须扩展这里使用的解析器框架来通知它的监听器(TextMarginFinder本质上是一个监听器,用于绘制从解析器框架发送的事件).矢量图形操作也是如此.这是非常重要的,特别是如果您还不熟悉PDF语法的话.

>如果要剪裁的PDF不是太通用但可以强制在相关位置包含一些文本或位图图形,但是,无论如何,您可以使用上面的示例代码(可能稍有更改).

例如.如果您的PDF始终以文本开头并以文本底部结尾,则可以更改getOutputPageSize以创建结果矩形,如下所示:

Rectangle result = new Rectangle(pageSize.getLeft(), finder.getLly(), pageSize.getRight(), finder.getUry());

这只会修剪顶部和底部的空白区域:

根据您的输入数据池和要求,这可能就足够了.

或者,您可以根据您对输入数据的了解使用其他一些启发式方法.如果您对文本的位置有所了解(例如,标题始终居中,而其他文本始终从左侧开始),则可以轻松扩展TextMarginFinder以利用此知识.

最近(2015年4月,iText 5.5.6-SNAPSHOT)的改进

当前的开发版本5.5.6-SNAPSHOT扩展了解析器包,还包括矢量图解析.这允许扩展iText的原始TextMarginFinder类,实现新的ExtRenderListener方法,如下所示:

@Override

public void modifyPath(PathConstructionRenderInfo renderInfo)

{

List points = new ArrayList();

if (renderInfo.getOperation() == PathConstructionRenderInfo.RECT)

{

float x = renderInfo.getSegmentData().get(0);

float y = renderInfo.getSegmentData().get(1);

float w = renderInfo.getSegmentData().get(2);

float h = renderInfo.getSegmentData().get(3);

points.add(new Vector(x, y, 1));

points.add(new Vector(x+w, y, 1));

points.add(new Vector(x, y+h, 1));

points.add(new Vector(x+w, y+h, 1));

}

else if (renderInfo.getSegmentData() != null)

{

for (int i = 0; i < renderInfo.getSegmentData().size()-1; i+=2)

{

points.add(new Vector(renderInfo.getSegmentData().get(i), renderInfo.getSegmentData().get(i+1), 1));

}

}

for (Vector point: points)

{

point = point.cross(renderInfo.getCtm());

Rectangle2D.Float pointRectangle = new Rectangle2D.Float(point.get(Vector.I1), point.get(Vector.I2), 0, 0);

if (currentPathRectangle == null)

currentPathRectangle = pointRectangle;

else

currentPathRectangle.add(pointRectangle);

}

}

@Override

public Path renderPath(PathPaintingRenderInfo renderInfo)

{

if (renderInfo.getOperation() != PathPaintingRenderInfo.NO_OP)

{

if (textRectangle == null)

textRectangle = currentPathRectangle;

else

textRectangle.add(currentPathRectangle);

}

currentPathRectangle = null;

return null;

}

@Override

public void clipPath(int rule)

{

}

使用此类修剪空白会导致

这几乎是人们所希望的.

注意:上面的实现远非最佳.它甚至不正确,因为它包括太多的所有曲线控制点.此外,它忽略了线宽或楔形类型之类的东西.它实际上只是一个概念验证.

标签:java,itext,pdf-generation,itextpdf

来源: https://codeday.me/bug/20190916/1806749.html

java 裁剪 pdf_java – 使用iTextPDF修剪页面的空白相关推荐

  1. java 裁剪 pdf_Java PDF 切割、截取、合并工具类、转图片等

    依赖导入 com.itextpdf itextpdf 5.5.13 org.apache.pdfbox pdfbox 2.0.15 org.apache.pdfbox fontbox 2.0.15 工 ...

  2. Java实现生成可跳转指定页面的二维码

    Java实现生成可跳转指定页面的二维码 package test; import java.awt.BasicStroke; import java.awt.Graphics; import java ...

  3. java网店系统_关于java网店系统的404页面 你知道多少

    几乎每个网店系统都有404页面,java网店系统也不例外.关于java商城系统的404页面,你知道多少呢?为什么java商城网店系统要设置404页面呢? Java商城系统的404页面是什么 404也页 ...

  4. Java裁剪音乐,利用IO流

    ** Java裁剪音乐,利用IO流 ** 主方法 public static void main(String[] args) throws IOException {//输入流对象,路径要裁剪文件路 ...

  5. Aspose.PSD使用教程:使用 Java 裁剪或旋转 PSD 图像

    目录 使用 Java 使用 Shift 方法裁剪 PSD 图像 在 Java 中使用矩形坐标裁剪 PSD 图像 使用 Java 以任意角度旋转 PSD 图像 PSD图像文件用于为徽标.横幅.小册子和许 ...

  6. vue项目在ie、360兼容模式页面显示空白问题

    vue项目中,出现在ie与360兼容模式下打开页面呈现空白问题,如下: 控制台报main.js中语法错误~ 上网搜了一下,大部分解决方案是在webpack配置中与main.js中引入babel-pol ...

  7. vue打包完index.html空白,解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题-20210315083204.pdf-原创力文档...

    解解决决Vue项项目目打打包包后后打打开开index.html页页面面显显示示空空白白以以及及图图片片路路径径错错误误的的问问题题 V ue项目运行npm run build后会生成一 dist文件夹 ...

  8. Vue通过build打包后 打开index.html页面是空白的

    最近在build打包vue项目遇到了几个问题,如下: 1.npm run build打包项目之后,我们通常是把dist文件里面被压缩后的static文件跟index.html提交到服务器,但最近发现直 ...

  9. jsp空白页面传html代码,echarts在HTML里测试一般,在jsp页面不显示,而且还把整个页面变成空白...

    echarts在HTML里测试正常,在jsp页面不显示,而且还把整个页面变成空白 echarts在HTML里测试正常,在jsp页面不显示,而且还把整个页面变成空白,请大神帮忙,急,在线等 Create ...

最新文章

  1. zipparameters 使用_如何在linux服务器上使用--enable-zip参数重新编译php?
  2. 全球CMOS图像传感器厂商最新排名:黑马杀出
  3. Silve“.NET研究”rlight 游戏开发小技巧:传说中的透视跑马灯
  4. c mysql 延时_Mysql 优化之延迟索引和分页优化
  5. jdk 1.8 内存可见性_JDK 14中的常规,安全和确定性外部内存访问
  6. css中border制作各种形状
  7. Linux内核的Nand驱动流程分析
  8. 戴森吸尘器被《消费者报告》从推荐名单除名:不耐用
  9. html5 canvas图表,Chart.js基于Canvas画布的HTML5统计图表库 - 资源分享
  10. ThreadLocal类的实现用法
  11. Windows:打开MSDTC,恢复Windows任务栏,查看windows日志,打开远程桌面,打开Services,资源监控...
  12. c语言编程运行符号是什么,c语言编程用的符号有哪些
  13. 【考研数学】张宇1000题,汤家凤1800,李永乐660,应该怎么选择?
  14. 【016】随缘画-根据输入文字随机生成艺术画(带算法)
  15. c语言汇率转换代码_基于C语言实现的货币转换器.doc
  16. 搜索局域网内电脑共享文件的方法
  17. php-fpm的几种重启方式
  18. 全景图矫正 matlab,全景图的后期水平矫正的三种方法
  19. RNN学习笔记3-LSTM
  20. PCIe扫盲系列博文连载目录

热门文章

  1. c语言学习-判断一个数的正、负,输出相应信息
  2. git pull git add git commit git branch git更新代码git提交git分支管理
  3. OpenShift 4 之一些实用命令和技巧
  4. PyTorch 1.6 发布:原生支持自动混合精度训练并进入稳定阶段
  5. Blazor 状态管理
  6. Visual Studio 2019 16.3 Preview 3 发布,使用 IntelliCode 重构更容易
  7. C#中面向对象编程中的函数式编程
  8. Linus 将 Linux 的软盘驱动 floppy 标记为“孤立”状态
  9. Dubbo Metrics 发布新版本 2.0.1 | Dubbo 的度量统计基础设施
  10. TensorFlow简介:向量对象