PDFBox创建并打印PDF文件, 以及缩放问题的处理.

PDFBox带了一些很方便的API, 可以直接创建 读取 编辑 打印PDF文件.

创建PDF文件

 1     public static byte[] createHelloPDF() {
 2         ByteArrayOutputStream out = new ByteArrayOutputStream();
 3         try {
 4             PDDocument doc = new PDDocument();
 5             PDPage page = new PDPage();
 6             doc.addPage(page);
 7             PDFont font = PDType1Font.HELVETICA_BOLD;
 8             PDPageContentStream content = new PDPageContentStream(doc, page);
 9             content.beginText();
10             content.setFont(font, 20);
11             content.moveTextPositionByAmount(250, 700);
12             content.drawString("Hello Print!");
13 
14             content.endText();
15             content.close();
16             doc.save(out);
17             doc.close();
18         } catch (Exception e) {
19             e.printStackTrace();
20         }
21         return out.toByteArray();
22     }

这边如果不把他save到byte[]里, 而是直接close, 返回PDDocument 给外部文件.

可能会出现Cannot read while there is an open stream writer

 打印文件

1         // 获取本地创建的空白PDF文件
2         PDDocument document = PDDocument.load(createHelloPDF());
3         // 加载成打印文件
4         PDFPrintable printable = new PDFPrintable(document);
5         PrinterJob job = PrinterJob.getPrinterJob();
6         job.setPrintable(printable);
7         job.print();

如需要打印自定义纸张, 参加另外一篇博客 使用PDFBox打印自定义纸张的PDF

如果想要读取本地pdf文件, 那就更简单了, 直接 

1         InputStream in = new FileInputStream("d:\\cc.pdf");
2         PDDocument document = PDDocument.load(in); 

缩放问题

不过发现打印出来的pdf文件存在缩放问题. 显得边距很大, 能跑马.

研究了下, 发现PDFPrintable可以接受是否缩放的参数.

 1         public enum Scaling {
 2             // 实际大小
 3             ACTUAL_SIZE,
 4             // 缩小
 5             SHRINK_TO_FIT,
 6             // 拉伸
 7             STRETCH_TO_FIT,
 8             // 适应
 9             SCALE_TO_FIT;
10 
11             private Scaling() {
12             }
13         }

因此只要在 new PDFPrintable(document), 传入Scaling, 就不会缩放了.

Scaling.ACTUAL_SIZE

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏nimomeng的自我进阶

OC优化指南

a) Reusing UITableViewCell:利用cellWithTableView:cellIdentifier:nibName: b)...

1441
来自专栏FreeBuf

如何在CTF中少走弯路(基础篇)

自己并不是专业的赛棍也没有打过很多比赛,这篇文章是自己在CTF中对于杂项这块知识学习的小结,希望可以对初入CTF的同学有所帮助,在CTF中少走弯路从而更快的提升...

1.3K4
来自专栏圣杰的专栏

Asp.net mvc 知多少(三)

本系列主要翻译自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想...

2126
来自专栏blackheart的专栏

[信息安全] 4.一次性密码 && 身份认证三要素

在信息安全领域,一般把Cryptography称为密码,而把Password称为口令。日常用户的认知中,以及我们开发人员沟通过程中,绝大多数被称作密码的东西其...

2986
来自专栏Java架构师历程

Struts2的工作原理

在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处?

1004
来自专栏生信宝典

OrthoMCL鉴定物种同源基因 (安装+使用)

1.1K7
来自专栏小灰灰

Java & PhantomJs 实现html输出图片

Java & PhantomJs 实现html输出图片 借助phantomJs来实现将html网页输出为图片 I. 背景 如何在小程序里面生成一张图,分享到朋...

7148
来自专栏软件工程师成长笔记

CXF实现webService服务

Web Service也叫XML Web Service,WebService是一种可以接收从Internet或者Internet上的其它系统中传递过来的请求,...

2033
来自专栏hrscy

RxSwift - Why

官方建议总是使用 .addDisposableTo(disposeBag) 即使对于简单绑定来说那不是必要的。

1522
来自专栏点滴积累

Cesium中Clock控件及时间序列瓦片动态加载

前言 前面已经写了两篇博客介绍Cesium,一篇整体上简单介绍了Cesium如何上手,还有一篇介绍了如何将Cesium与分布式地理信息处理框架Geotrelli...

4504

扫码关注云+社区

领取腾讯云代金券