Java调用PDFBox打印自定义纸张PDF

打印对象

一份设置为A3纸张, 页面边距为(10, 10, 10, 10)mm的PDF文件.

PageFormat

 默认PDFPrintable无法设置页面大小.

1         PDFPrintable printable = new PDFPrintable(document);
2         PrinterJob job = PrinterJob.getPrinterJob();
3         job.setPrintable(printable);

需要把它放到一个Book中, 再设置即可

1         Book book = new Book();
2         book.append(printable, pageFormat);
3         printerJob.setPageable(book);
4         printerJob.print();

设置纸张属性

1         Paper paper = new Paper();
2         paper.setSize(width, height);
3         // 设置边距
4         paper.setImageableArea(marginLeft, marginRight, width - (marginLeft + marginRight), height - (marginTop + marginBottom));
5         // 自定义页面设置
6         PageFormat pageFormat = new PageFormat();
7         // 设置页面横纵向
8         pageFormat.setOrientation(PageFormat.PORTRAIT);
9         pageFormat.setPaper(paper);

注意: 这边计量单位都是在dpi 72下的尺寸.  

如果拿到是mm, 需要转为px. 例如10mm转换

10 * 72 * 10 / 254 = 28px

如果打印出现了截断, 一般是因为没有添加自定义纸张导致的. 参考 Java读取打印机自定义纸张.

完整代码如下

 1         InputStream in = new FileInputStream("d:\\a3.pdf");
 2         PDDocument document = PDDocument.load(in);
 3         PDFPrintable printable = new PDFPrintable(document, Scaling.ACTUAL_SIZE);
 4 
 5         PrinterJob printerJob = PrinterJob.getPrinterJob();
 6 
 7         PaperSize a3 = PaperSize.PAPERSIZE_A3;
 8         // A3 纸张在72 dpi下的宽高 841 * 1190
 9         int width = a3.getWidth().toPixI(72);
10         int height = a3.getHeight().toPixI(72);
11         // 10mm边距, 对应 28px
12         int marginLeft = 28;
13         int marginRight = 28;
14         int marginTop = 28;
15         int marginBottom = 28;
16 
17         Paper paper = new Paper();
18         paper.setSize(width, height);
19         // 设置边距
20         paper.setImageableArea(marginLeft, marginRight, width - (marginLeft + marginRight), height - (marginTop + marginBottom));
21         // 自定义页面设置
22         PageFormat pageFormat = new PageFormat();
23         // 设置页面横纵向
24         pageFormat.setOrientation(PageFormat.PORTRAIT);
25         pageFormat.setPaper(paper);
26 
27         Book book = new Book();
28         book.append(printable, pageFormat);
29         printerJob.setPageable(book);
30         printerJob.print();

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏图形学与OpenGL

3.6.2 编程实例-河南地图绘制

#include <iostream> #include <fstream> #include<vector> #include <GL/glut.h> usi...

13410
来自专栏生信技能树

使用ESTIMATE来对转录组表达数据根据stromal和immune细胞比例估算肿瘤纯度

ESTIMATE (Estimation of STromal and Immune cells in MAlignant Tumor tissues usin...

63620
来自专栏ACM小冰成长之路

51Nod-1868-彩色树

ACM模版 描述 ? 题解 树型DP,先上官方题解: ? 官方题解说的十分清楚,和我的代码思路也恰好吻合,大体上是针对每种颜色求出不包括该种颜色的路径的点对儿数...

24670
来自专栏机器之心

教程 | 如何将模型部署到安卓移动端,这里有一份简单教程

截至 2018 年,全球活跃的安卓设备已经超过了 20 亿部。安卓手机的迅速普及在很大程度上得益于各种各样的智能应用,从地图到图片编辑器无所不有。随着深度学习技...

40610
来自专栏瓜大三哥

优化策略之Opt_design

opt_design [-retarget] [-propconst] [-sweep] [-bram_power_opt] [-remap]

33760
来自专栏编程微刊

【前端统计图】echarts多条折线图和横柱状图实现

29030
来自专栏落影的专栏

OpenGL ES实践教程(三)镜子效果

教程 OpenGLES实践教程1-Demo01-AVPlayer OpenGL ES实践教程2-Demo02-摄像头采集数据和渲染 其他教程请移步OpenG...

41440
来自专栏落影的专栏

OpenGL ES实践教程(二)摄像头采集数据和渲染

教程 这一篇教程是摄像头采集数据和渲染,包括了三部分内容,渲染部分-OpenGL ES,摄像头采集图像部分-AVFoundation和图像数据创建纹理部分-G...

48150
来自专栏向治洪

iOS自动布局框架之Masonry

目前iOS开发中大多数页面都已经开始使用Interface Builder的方式进行UI开发了,但是在一些变化比较复杂的页面,还是需要通过代码来进行UI开发的。...

22260
来自专栏非著名程序员

Palette让你的应用风格统一,绚丽多彩

今天这个是Android Material Design系列之Palette,Material Design系列的第五篇文章了,由于最近这个系列文章浏览量比较低...

19380

扫码关注云+社区

领取腾讯云代金券