使用 PDFBox 创建 PDF 并向其绘制 PDJpeg 时,在将 PDJpeg 绘制到 PDF 之前调整其大小时,图像的颜色会发生更改/反转。此问题仅在使用 Adobe Reader 等的 Windows XP 和 Windows 7 上可见。Mac 上的预览或 Windows 8 中的新 PDF 预览版本在某种程度上不受此影响。
样品:
Adobe Reader 中的 PDF 屏幕截图
Mac 预览中的相同 PDF
这就是我在代码中所做的:
- 创建 PDDocument
- 创建 PDJpeg 的 HashMap(用于缓存目的):
- 通过 ImageIO.read() 初始化的 BufferedImage 创建 PDJpegs
- 通过在 PDJpegs 上调用 setHeight() 和 setWidth() 来调整 PDJpegs 的大小
- 将 PDJpeg 添加到 HashMap
- 创建 PDPage 并将其添加到 PDDocument
- 创建 PDPageContentStream
- 在 PDPage 上绘制一些 PDJpeg
- 关闭 PDPageContentStream
- 保存 PDDocument
- 关闭 PDDocument
调整 PDJpeg 大小的方法:
private void preparePDFIconCache(List<AbstractDataItem> list) throws IOException {
iconCache = new HashMap<String, PDJpeg>();
for (AbstractDataItem item : list) {
String iconResourcePath = "/com/graphics/icons/" + item.getIconName();
URL iconURL = this.getClass().getResource(iconResourcePath);
BufferedImage icon = null;
if (iconURL != null) {
icon = ImageIO.read(iconURL);
} else {
String myIconResourcePath = SettingsDataModel.getInstance().getMyIconsPath() + File.separator + item.getIconName();
File iconFile = new File(myIconResourcePath);
if (iconFile.exists()) {
URL myIconURL = iconFile.toURI().toURL();
if (myIconURL != null) {
icon = ImageIO.read(myIconURL);
}
}
}
if (icon != null) {
PDJpeg pdfIcon = new PDJpeg(currentDocument, icon);
pdfIcon.setHeight(iconWidthXHeight);
pdfIcon.setWidth(iconWidthXHeight);
iconCache.put(item.getIconName(), pdfIcon);
}
}
}
如果在初始化 PDJpeg 之前调整 BufferedImages 的大小,则一切正常,但它们看起来并不那么清晰。
有没有人有好的解决方案或遇到过同样的问题?