java处理图片 adobe_JAVA使用jacob调用adobe动态库pdf转换图片 | 学步园

前提,目前java处理pdf 转换图片,能达到高清的很少。所有的java pdf工具我都试过了

,或多或少都有一些问题,达不到理想的效果。

我试过pdfbox、PDFRenderer、xpdf、jpedal等等pdf工具,不是中文乱码、字体不识别、

格式混乱、就是分辨率过低,毕竟都是开源的工具。其中有一个收费的纯java的pdf工具转换效

果非常理想,就是太贵了。这里附上这个收费的地址,有兴趣的可以去看看,反正很贵就是了,

最后就在网上漫无目的搜索,就发现了一个解决方案,是C#解决pdf转换图片的案例。很

里面全是C#的pdf转换图片的案例。通过这位仁兄的调用adobe官方的dll接口得到启发,我就用jacob

(java调用dll的一个工具包),通过调用adobe官方提供的Acrobat.dll接口进行pdf转图片,效果不错

很清晰,pdf支持的字体均可以转换出来。

这个方法同时也有问题,就是不支持多线程同时调用。一旦出现并发的情况,会报错windows剪切板

不可用。目前我想到的方法是用多线程排队的机制进行转换,一定程度上效率不高。如果各位同学有

更好的解决方法,欢迎来讨论。

需要的包:

jacob-1.17-M2

adobe arcobat pro X

这种方法只适用于windows下,linux的同学就没办法了。

具体代码如下:

jacob调用dll转换的具体处理代码

public static void savaPageAsJpgByAcrobat(St

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要判断图片是否旋转,可以通过读取图片的 Exif 信息来获取图片的朝向。Exif 是一种存储在 JPG、TIFF、RAW 等格式的照片中的元数据,其中包含了拍摄时的时间、地点、相机型号等信息,还包括图片的朝向。 Java 中可以使用 ImageIO 类读取图片的 Exif 信息,代码如下: ``` File file = new File("image.jpg"); ImageInputStream input = ImageIO.createImageInputStream(file); Iterator<ImageReader> readers = ImageIO.getImageReaders(input); if (readers.hasNext()) { ImageReader reader = readers.next(); reader.setInput(input); IIOMetadata metadata = reader.getImageMetadata(0); Node root = metadata.getAsTree(metadata.getNativeMetadataFormatName()); Node orientationNode = findOrientationNode(root); int orientation = getOrientation(orientationNode); System.out.println("图片朝向:" + orientation); } ``` 其中,`findOrientationNode` 和 `getOrientation` 方法分别用于查找朝向节点和获取朝向值,代码如下: ``` private static Node findOrientationNode(Node root) { Node orientationNode = null; NodeList nodeList = root.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); if ("{http://ns.adobe.com/exif/1.0/}IFD".equals(node.getNodeName())) { orientationNode = findOrientationNode(node); if (orientationNode == null) { NamedNodeMap attributes = node.getAttributes(); if (attributes != null) { orientationNode = attributes.getNamedItem("Orientation"); } } break; } } return orientationNode; } private static int getOrientation(Node orientationNode) { if (orientationNode == null) { return 1; } String value = orientationNode.getNodeValue(); if (value == null) { return 1; } return Integer.parseInt(value); } ``` 如果图片的朝向不是默认的 1,就需要将图片旋转到正确的方向。可以使用 Java 的 AffineTransform 类来进行图片旋转,代码如下: ``` File file = new File("image.jpg"); ImageInputStream input = ImageIO.createImageInputStream(file); BufferedImage image = ImageIO.read(input); int orientation = getOrientation(findOrientationNode(root)); AffineTransform transform = new AffineTransform(); switch (orientation) { case 2: transform.scale(-1.0, 1.0); transform.translate(-image.getWidth(), 0); break; case 3: transform.translate(image.getWidth(), image.getHeight()); transform.rotate(Math.PI); break; case 4: transform.scale(1.0, -1.0); transform.translate(0, -image.getHeight()); break; case 5: transform.rotate(Math.PI / 2); transform.scale(-1.0, 1.0); break; case 6: transform.rotate(Math.PI / 2); transform.translate(0, -image.getHeight()); break; case 7: transform.rotate(-Math.PI / 2); transform.scale(-1.0, 1.0); transform.translate(-image.getHeight(), 0); break; case 8: transform.rotate(-Math.PI / 2); transform.translate(-image.getWidth(), 0); break; } BufferedImage rotatedImage = new BufferedImage(image.getHeight(), image.getWidth(), image.getType()); Graphics2D g = rotatedImage.createGraphics(); g.setTransform(transform); g.drawImage(image, 0, 0, null); g.dispose(); ImageIO.write(rotatedImage, "jpg", new File("rotated.jpg")); ``` 其中,根据不同的朝向值,使用不同的变换矩阵来旋转图片。最后使用 ImageIO 将旋转后的图片保存到文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值