识别PDF中二维码
实现步骤:
1.使用icepdf把pdf转化为图片
2.使用google的zxing识别图片中的二维码
包引用
gradle
// https://central.sonatype.com/artifact/com.google.zxing/core
implementation 'com.google.zxing:core:3.5.3'
// https://central.sonatype.com/artifact/com.google.zxing/javase
implementation 'com.google.zxing:javase:3.5.3'
// https://central.sonatype.com/artifact/org.icepdf.os/icepdf-core
implementation('org.icepdf.os:icepdf-core:6.2.2') {
exclude group: 'javax.media', module: 'jai_core'
}
代码部分,一个类几个方法就实现了,还是比较简单
java
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.util.GraphicsRenderingHints;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
public class Test {
//缩放比例
public static float scale = 2f;
//旋转角度
public static float rotation = 0f;
//识别PDF中的二维码
public static void main(String[] args) throws Exception {
long time = System.currentTimeMillis();
File file = new File("C:\\Users\\yujing\\Desktop\\111.pdf");
//PDF转byte
byte[] pdfBytes = fileToByte(file);
//byte转imageByte
byte[] imageBytes = pdfByteToImgByte(pdfBytes);
//保存到本地
//byteToFile(imageBytes, new File("D:/pdf_" + UUID.randomUUID() + ".png"));
//二维码识别
String text = imageToQRCode(imageBytes);
System.out.println(text);
System.out.println("耗时:" + (System.currentTimeMillis() - time) + "ms");
}
/**
* pdf转图片
*/
public static byte[] pdfByteToImgByte(byte[] pdfBytes) throws Exception {
byte[] result = null;
Document document = new Document();
document.setByteArray(pdfBytes, 0, pdfBytes.length, "");
for (int i = 0; i < document.getNumberOfPages(); i++) {
BufferedImage image = (BufferedImage) document.getPageImage(i, GraphicsRenderingHints.SCREEN, org.icepdf.core.pobjects.Page.BOUNDARY_CROPBOX, rotation, scale);
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image, "png", bos);
result = bos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
image.flush();
}
document.dispose();
return result;
}
/**
* 识别 png图片中的二维码信息
*/
public static String imageToQRCode(byte[] imageInByte) throws Exception {
MultiFormatReader multiFormatReader = new MultiFormatReader();
InputStream in = new ByteArrayInputStream(imageInByte);
BufferedImage image = ImageIO.read(in);
// 定义二维码参数
Map<DecodeHintType, String> hints = new HashMap<>();
hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
// 获取读取二维码结果
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
Result result = multiFormatReader.decode(binaryBitmap, hints);
return result.getText();
}
public static byte[] fileToByte(File file) {
if (file == null || !file.exists()) return null;
try (FileInputStream stream = new FileInputStream(file); ByteArrayOutputStream out = new ByteArrayOutputStream((int) file.length())) {
byte[] b = new byte[1024 * 4];
int n;
while ((n = stream.read(b)) != -1)
out.write(b, 0, n);
return out.toByteArray();
} catch (IOException ignored) {
}
return null;
}
public static boolean byteToFile(byte[] bytes, File file) {
if (!Objects.requireNonNull(file.getParentFile()).exists()) // 如果位置不存在
file.getParentFile().mkdirs();
if (file.exists()) file.delete();
FileOutputStream out;
try {
out = new FileOutputStream(file);
out.write(bytes);
out.flush();
out.close();
} catch (FileNotFoundException e) {
System.out.println("No Find File");
return false;
} catch (IOException e) {
System.out.println("IO Error");
return false;
}
return true;
}
}