欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

PDF二维码识别,PDF转图像再识别二维码的java实现

最编程 2024-03-13 09:07:30
...
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; } }