gpt4 book ai didi

java - 使用 COSStream 对象编辑 PDF 文件中的图像

转载 作者:太空宇宙 更新时间:2023-11-04 06:58:24 25 4
gpt4 key购买 nike

我尝试使用 PDFBox 库编辑 PDF 文件中的图像。我如何有仅适用于 jpeg 图像的示例。 ImageIO.read() 无法解码带有“png”后缀的图像。这是代码示例。所以我的问题是:如何对 PDF 文档中的所有类型的图像执行相同的操作?我仍然可以使用 ImageIO 还是需要其他方法?

public static void main(String[] args) throws Exception {

PDDocument doc = PDDocument.load("docs/input1.pdf");

// Get all images from first page
Map<String, PDXObjectImage> pageImages = ((PDPage) doc.getDocumentCatalog().getAllPages().get(0)).getResources().getImages();
if (pageImages != null)
{
// iterate by images
Iterator<String> imageIter = pageImages.keySet().iterator();
while (imageIter.hasNext())
{
String key = imageIter.next();

PDXObjectImage image = pageImages.get(key); // get page image object
String suffix = image.getSuffix(); // get image suffix
String imageName = key+'.'+suffix; // compose image name

System.out.print("process "+imageName+"... ");

COSStream s = image.getCOSStream(); // get COSStream to manipulate
BufferedImage img = ImageIO.read(s.getFilteredStream()); // get BufferedImage to edit

if(img == null)
{
System.out.println("Can't decode");
}
else
{
paint(img.createGraphics()); // draw on it
ImageIO.write(img, suffix, new File("out/"+imageName)); // write file to check result...

// encode image back to COSStream
OutputStream out = s.createFilteredStream();
ImageIO.write(img, suffix, out);
out.close();
System.out.println("done");
}
}
}
doc.save("out/output1.pdf"); // save document
}

/**
* Draw red rectangular to test
* @param g graphics
*/
public static void paint(Graphics2D g) {
int xpoints[] = {25, 245, 245, 25};
int ypoints[] = {25, 25, 545, 545};
g.setColor(Color.RED);
g.fillPolygon(xpoints, ypoints, 4);
}

最佳答案

最好不要使用 PDXObjectImage 流,而是创建 PDXObjectImage 的新实例并将其替换到资源集合中。这是更通用和通用的方式。使用 getRGBImage() 将 PDXObjectImage 转换为 BufferedImage 并使用构造函数(PDPixelMap、PDJpeg 等)将编辑结果转换回 PDXObjectImage。请注意,由于错误,JBIG2 和 Jpeg2000 图像仍然存在问题。这是我用来查找和转换文档中所有图像的代码示例:

// Recursive resource processor
// Here can be images inside in PDXObjectForm objects
protected static void processResources(PDResources resources, PDDocument doc, String filename) throws IllegalArgumentException, SecurityException, IOException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, JBIG2Exception, ColorSpaceException, ICCProfileException
{
if(resources == null) return;
Map<String, PDXObject> xObjects = resources.getXObjects();
if (xObjects == null) return;

// iterate by images
Iterator<String> imageIter = xObjects.keySet().iterator();
while (imageIter.hasNext())
{
String key = imageIter.next();

PDXObject o = xObjects.get(key);

if(o instanceof PDXObjectImage)
xObjects.put(key, processImage((PDXObjectImage) o /*, some additional parms... */));

if(o instanceof PDXObjectForm)
processResources(((PDXObjectForm) o).getResources(), doc, filename);
}

resources.setXObjects(xObjects);
}

注意 resources.setXObjects() 最后的调用 - 如果没有它,您在 resources.getXObjects() 获得的集合中所做的更改将不会写回文档。

关于java - 使用 COSStream 对象编辑 PDF 文件中的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22432142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com