Google Cloud Vision API with Java

以下說明如何在 Java 中使用 Google Cloud Vision API。

  1. 前往 Google Cloud Console https://console.cloud.google.com/
  2. 建立一個專案。
  3. 輸入專案名稱。
  4. 選擇 APIs Services -> Enabled APIs & services。
  5. 選擇 ENABLED APIs AND SERVICES。
  6. 在搜尋框中輸入 vision
  7. 找到 Cloud Vision API 點擊進入。
  8. 啟用這個 Cloud Vision API API
  9. 建立一個 Service account 。選擇 Credentials -> + CREATE CREDENTIALS -> Service account
  10. 輸入 Service account 的 name 與 ID 並選擇 CREATE AND CONTINUE
  11. 第二步,可以跳過,選擇 CONTINUE
  12. 第三步,可以跳過,選擇 DONE ,建立 Service Account
  13. 點擊剛剛建立的 Service Account
  14. 選擇 KEYS -> ADD KEY -> Create new key
  15. 選擇 JSON ,就會產生一個 JSON 檔案,供之後 Java 程式使用
  16. 建立一個 Java 專案,並引用 google-cloud-vision 依賴,
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>libraries-bom</artifactId>
    <version>26.50.0</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>

    <dependencies>
    <dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-vision</artifactId>
    </dependency>
    </dependencies>
  17. 在程式碼中使用以下程式碼引入上面建立的 GoogleCredentials
    1
    2
    GoogleCredentials credentials = GoogleCredentials
    .fromStream(new FileInputStream("<在步驟15產生的json檔案>"));
  18. 使用以下程式碼將 圖片文字的 Pdf 轉為 文字
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    public static void processPdf() throws IOException {

    GoogleCredentials credentials = GoogleCredentials
    .fromStream(new FileInputStream("<在步驟15產生的json檔案>"));

    ImageAnnotatorSettings imageAnnotatorSettings = ImageAnnotatorSettings.newBuilder()
    .setCredentialsProvider(FixedCredentialsProvider.create(credentials)).build();

    try (ImageAnnotatorClient vision = ImageAnnotatorClient.create(imageAnnotatorSettings)) {

    String fileName = "./image-based-pdf-sample.pdf";
    Path path = Paths.get(fileName);
    byte[] data = Files.readAllBytes(path);
    ByteString pdfBytes = ByteString.copyFrom(data);

    InputConfig inputConfig = InputConfig.newBuilder().setMimeType("application/pdf") // Supported MimeTypes:
    // "application/pdf",
    // "image/tiff"
    .setContent(pdfBytes).build();

    Feature feature = Feature.newBuilder().setType(Feature.Type.DOCUMENT_TEXT_DETECTION).build();

    AnnotateFileRequest request = AnnotateFileRequest.newBuilder().setInputConfig(inputConfig)
    .addFeatures(feature).build();
    List<AnnotateFileRequest> requests = new ArrayList<>();
    requests.add(request);

    BatchAnnotateFilesResponse response = vision.batchAnnotateFiles(requests);
    List<AnnotateFileResponse> responses = response.getResponsesList();

    for (AnnotateFileResponse res : responses) {
    if (res.hasError()) {
    System.out.format("Error: %s%n", res.getError().getMessage());
    return;
    }

    int pageSize = res.getTotalPages();

    System.out.println("pageSize = " + pageSize);

    for (int i = 0; i < pageSize; i++) {
    AnnotateImageResponse annotateImageResponse = res.getResponses(i);

    System.out.format("%nText: %s%n", annotateImageResponse.getFullTextAnnotation().getText());
    }
    }

    }
    }
  19. 使用以下程式碼,可以辨認圖片
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    public static void image() throws IOException {

    GoogleCredentials credentials = GoogleCredentials
    .fromStream(new FileInputStream("<在步驟15產生的json檔案>"));

    ImageAnnotatorSettings imageAnnotatorSettings = ImageAnnotatorSettings.newBuilder()
    .setCredentialsProvider(FixedCredentialsProvider.create(credentials)).build();

    try (ImageAnnotatorClient vision = ImageAnnotatorClient.create(imageAnnotatorSettings)) {

    String fileName = "./test.jpg";

    Path path = Paths.get(fileName);
    byte[] data = Files.readAllBytes(path);
    ByteString imgBytes = ByteString.copyFrom(data);

    List<AnnotateImageRequest> requests = new ArrayList<>();
    Image img = Image.newBuilder().setContent(imgBytes).build();
    Feature feat = Feature.newBuilder().setType(Type.LABEL_DETECTION).build();
    AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build();
    requests.add(request);

    BatchAnnotateImagesResponse response = vision.batchAnnotateImages(requests);
    List<AnnotateImageResponse> responses = response.getResponsesList();

    for (AnnotateImageResponse res : responses) {
    if (res.hasError()) {
    System.out.format("Error: %s%n", res.getError().getMessage());
    return;
    }

    for (EntityAnnotation annotation : res.getLabelAnnotationsList()) {
    annotation.getAllFields().forEach((k, v) -> System.out.format("%s : %s%n", k, v.toString()));
    }
    }
    }
    }

整個 Java 程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package ultrasigncorp.vision;

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.google.cloud.vision.v1.AnnotateImageRequest;
import com.google.cloud.vision.v1.Feature;
import com.google.cloud.vision.v1.Feature.Type;
import com.google.cloud.vision.v1.Image;
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.api.gax.longrunning.OperationFuture;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.Storage.BlobListOption;
import com.google.cloud.storage.StorageOptions;
import com.google.cloud.vision.v1.*;
import com.google.protobuf.ByteString;
import com.google.protobuf.util.JsonFormat;
import com.google.cloud.vision.v1.AnnotateFileResponse.Builder;

public class Main {
public static void main(String... args) throws Exception {
image();
processPdf();
}

public static void image() throws IOException {
GoogleCredentials credentials = GoogleCredentials
.fromStream(new FileInputStream("./test.json"));
ImageAnnotatorSettings imageAnnotatorSettings = ImageAnnotatorSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credentials)).build();
try (ImageAnnotatorClient vision = ImageAnnotatorClient.create(imageAnnotatorSettings)) {
String fileName = "./test.jpg";
Path path = Paths.get(fileName);
byte[] data = Files.readAllBytes(path);
ByteString imgBytes = ByteString.copyFrom(data);
List<AnnotateImageRequest> requests = new ArrayList<>();
Image img = Image.newBuilder().setContent(imgBytes).build();
Feature feat = Feature.newBuilder().setType(Type.LABEL_DETECTION).build();
AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build();
requests.add(request);
BatchAnnotateImagesResponse response = vision.batchAnnotateImages(requests);
List<AnnotateImageResponse> responses = response.getResponsesList();

for (AnnotateImageResponse res : responses) {
if (res.hasError()) {
System.out.format("Error: %s%n", res.getError().getMessage());
return;
}

for (EntityAnnotation annotation : res.getLabelAnnotationsList()) {
annotation.getAllFields().forEach((k, v) -> System.out.format("%s : %s%n", k, v.toString()));
}
}
}
}

public static void processPdf() throws IOException {

GoogleCredentials credentials = GoogleCredentials
.fromStream(new FileInputStream("./test.json"));

ImageAnnotatorSettings imageAnnotatorSettings = ImageAnnotatorSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credentials)).build();

try (ImageAnnotatorClient vision = ImageAnnotatorClient.create(imageAnnotatorSettings)) {

String fileName = "./image-based-pdf-sample.pdf";
Path path = Paths.get(fileName);
byte[] data = Files.readAllBytes(path);
ByteString pdfBytes = ByteString.copyFrom(data);

InputConfig inputConfig = InputConfig.newBuilder().setMimeType("application/pdf")
.setContent(pdfBytes).build();

Feature feature = Feature.newBuilder().setType(Feature.Type.DOCUMENT_TEXT_DETECTION).build();

AnnotateFileRequest request = AnnotateFileRequest.newBuilder().setInputConfig(inputConfig)
.addFeatures(feature).build();
List<AnnotateFileRequest> requests = new ArrayList<>();
requests.add(request);

BatchAnnotateFilesResponse response = vision.batchAnnotateFiles(requests);
List<AnnotateFileResponse> responses = response.getResponsesList();

for (AnnotateFileResponse res : responses) {
if (res.hasError()) {
System.out.format("Error: %s%n", res.getError().getMessage());
return;
}

int pageSize = res.getTotalPages();

System.out.println("pageSize = " + pageSize);

for (int i = 0; i < pageSize; i++) {
AnnotateImageResponse annotateImageResponse = res.getResponses(i);

System.out.format("%nText: %s%n", annotateImageResponse.getFullTextAnnotation().getText());
}
}

}
}
}

Reference:

評論