20200326のJavaに関する記事は5件です。

Javaアプリケーションでは、Word(DOC/DOCX)ドキュメントをPDFに変換します

Spire.Docの助けのもとで、私達は簡単にword文書をPDFとして保存できます。この文はWord(.doc..docx)をPDFとして保存する方法を以下の3つの方面から紹介します。


  • Word文書をPDFに直接Javaアプリケーションで変換する

  • Word文書をPDFファイルに暗号化されたパスワードで変換結果ファイル

  • 画像の品質を設定するときにWord文書

Word文書をPDFに直接Javaアプリケーションで変換する

import com.spire.doc.*;
public class toPDF {
    public static void main(String[] args) {
        String inputFile="data/convertedTemplate.docx";
        String outputFile="output/toPDF.pdf";
        //サンプルドキュメントの読み込み
        Document document = new Document();
        document.loadFromFile(inputFile);

        //文書を保存
        document.saveToFile(outputFile, FileFormat.PDF);
    }
}

Word文書をPDFファイルに暗号化されたパスワードで変換結果ファイル

PDF文書のセキュリティを変換するために、パスワード保護PDFを設定できます。

import com.spire.doc.Document;
import com.spire.doc.ToPdfParameterList;
import com.spire.pdf.security.*;

public class toPdfWithPassword {
    public static void main(String[] args) {

        String inputFile="data/convertedTemplate.docx";
        String outputFile="output/toPdfWithPassword.pdf";

        //サンプルドキュメントの読み込み
        Document document = new Document();
        document.loadFromFile(inputFile);

        ToPdfParameterList toPdf = new ToPdfParameterList();

        //パスワードの設定
        String password = "E-iceblue";
        toPdf.getPdfSecurity().encrypt(password, password, PdfPermissionsFlags.None, PdfEncryptionKeySize.Key_128_Bit);

        //文書を保存
        document.saveToFile(outputFile, toPdf);
    }
}

画像の品質を設定するときにWord文書

々は、特にドキュメントの画像の多くのWord文書を変換した後、出力PDFドキュメントのサイズは明らかに元のWord文書よりも大きいです。同時に、結果のPDFファイルのサイズを設定するには、イメージの質を設定することができます。Javaのspire . docは、ドキュメントのメソッドを提供します。setjpegquality ()は、JPEG画像の品質を0から100に設定します。出力画像品質のデフォルトセットは、元の80 %です。

import com.spire.doc.*;
public class ShapeAsImage {
    public static void main(String[] args) throws Exception {

        //サンプルドキュメントの読み込み
        Document document = new Document();
        document.loadFromFile("Sample.docx");

        //画像の品質を設定
        document.setJPEGQuality(40);

        ToPdfParameterList pdf = new ToPdfParameterList();
        pdf.setDisableLink(true);

        //文書を保存
        document.saveToFile("output/ImageQuality.pdf", FileFormat.PDF);
    }
}

Javaのための無料のSpire . docを使用することは非常に簡単です。あなたの読書のおかげで、それが助けることを願います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WebSocket: Server=Java, Client=Java,JavaScript

Runtime

Server : Tomcat 8.5

Server : Java

import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import javax.websocket.EndpointConfig;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/hellowebsocket")
public class ChatWebSocket {
    // 全てのクライアント
    private static Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>());
    // メッセージを送信してきたクライアント
    private Session currentSession = null;
    /*
     * 接続がオープンしたとき
     */
    @OnOpen
    public void onOpen(Session session, EndpointConfig ec) {
        sessions.add(session);
        currentSession = session;
    }
    @OnMessage
    public String onMessage(String message) throws IOException {
        Iterator<Session> it = sessions.iterator();
        while (it.hasNext()) {
            Session s = it.next();
            if (s != currentSession) {
                s.getBasicRemote().sendText(message);
            }
        }
        return message;
    }
    @OnClose
    public void onClose(Session session) {
        sessions.remove(session);
    }
}

Client 1 : Java

import java.net.URI;
import java.util.Scanner;
import javax.websocket.ContainerProvider;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;
public class Client {
    public static void main(String[] args) throws Exception {
        String msg;
        Scanner scanIn = new Scanner(System.in);
        // 初期化のため WebSocket コンテナのオブジェクトを取得する
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        // サーバー・エンドポイントの URI
        URI uri = URI.create("ws://localhost:8080/hellowebsocket");
        // サーバー・エンドポイントとのセッションを確立する
        Session session = container.connectToServer(new WebSocketClientMain(), uri);

        while (true) {
            msg = scanIn.nextLine();
            session.getBasicRemote().sendText(msg);
            if (msg.equals("")) {
                break;
            }
        }
        scanIn.close();
        session.close();
    }
}

Client 1 : maven

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.glassfish.tyrus.bundles/tyrus-standalone-client -->
    <dependency>
        <groupId>org.glassfish.tyrus.bundles</groupId>
        <artifactId>tyrus-standalone-client</artifactId>
        <version>1.16</version>
    </dependency>
</dependencies>

Client 2 : JavaScript

<html>
<head>
<title>Chat</title>
<script type="text/javascript" src="./jquery.js"></script>
<script>
    var fullpath = document.location.pathname;
    var path = fullpath.substring(0, fullpath.lastIndexOf("/"));
    var url = "ws://" + document.location.host + path + "/hellowebsocket";
    var ws = new WebSocket(url); // 重要
    $(function() {
        $("#button-search").click(postChat);
        ws.onmessage = function(receive) {
            $("#message").text(receive.data);
        };
    });
    function postChat() {
        var text = $("#q").val();
        var state = ws.readyState;
        if (state == ws.OPEN) {
            ws.send(text);
        } else {
            alert("connection state is not OPEN: " + state);
        }
    }
</script>
</head>
<body>
    <div>
        <div id="inputform">
            <textarea id="q" cols="80" rows="2"></textarea>
            <input type="button" id="button-search" value="POST" />
        </div>
    </div>
    <div id="message"></div>
</body>
</html>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

これだけでOK WebSocket: Server=Java, Client=Java,JavaScript

Java製のWebSocket Serverに対し、
複数のJava WebSocket Client と JavaScript WebSocket Client が接続し、
クライアントからのメッセージは各クライアントに対してブロードキャストされるものと想定します。

動作確認済 Runtime

  1. Local Server : Tomcat 8.5
  2. Azure WebApp Service (Tomcat 9.0)

Server : Java

import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import javax.websocket.EndpointConfig;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/hellowebsocket")
public class ChatWebSocket {
    // 全てのクライアント
    private static Set<Session> sessions = Collections.synchronizedSet(new HashSet<Session>());
    // メッセージを送信してきたクライアント
    private Session currentSession = null;
    /*
     * 接続がオープンしたとき
     */
    @OnOpen
    public void onOpen(Session session, EndpointConfig ec) {
        sessions.add(session);
        currentSession = session;
    }
    @OnMessage
    public String onMessage(String message) throws IOException {
        Iterator<Session> it = sessions.iterator();
        while (it.hasNext()) {
            Session s = it.next();
            if (s != currentSession) {
                s.getBasicRemote().sendText(message);
            }
        }
        return message;
    }
    @OnClose
    public void onClose(Session session) {
        sessions.remove(session);
    }
}

Client 1 : Java

import java.net.URI;
import java.util.Scanner;
import javax.websocket.ContainerProvider;
import javax.websocket.Session;
import javax.websocket.WebSocketContainer;
public class Client {
    public static void main(String[] args) throws Exception {
        String msg;
        Scanner scanIn = new Scanner(System.in);
        // 初期化のため WebSocket コンテナのオブジェクトを取得する
        WebSocketContainer container = ContainerProvider.getWebSocketContainer();
        // サーバー・エンドポイントの URI
        URI uri = URI.create("ws://localhost:8080/hellowebsocket");
        // サーバー・エンドポイントとのセッションを確立する
        Session session = container.connectToServer(new WebSocketClientMain(), uri);

        while (true) {
            msg = scanIn.nextLine();
            session.getBasicRemote().sendText(msg);
            if (msg.equals("")) {
                break;
            }
        }
        scanIn.close();
        session.close();
    }
}

Client 1 : maven

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.glassfish.tyrus.bundles/tyrus-standalone-client -->
    <dependency>
        <groupId>org.glassfish.tyrus.bundles</groupId>
        <artifactId>tyrus-standalone-client</artifactId>
        <version>1.16</version>
    </dependency>
</dependencies>

Client 2 : JavaScript

<html>
<head>
<title>Chat</title>
<script type="text/javascript" src="./jquery.js"></script>
<script>
    var fullpath = document.location.pathname;
    var path = fullpath.substring(0, fullpath.lastIndexOf("/"));
    var url = "ws://" + document.location.host + path + "/hellowebsocket";
    var ws = new WebSocket(url); // 重要
    $(function() {
        $("#button-search").click(postChat);
        ws.onmessage = function(receive) {
            $("#message").text(receive.data);
        };
    });
    function postChat() {
        var text = $("#q").val();
        var state = ws.readyState;
        if (state == ws.OPEN) {
            ws.send(text);
        } else {
            alert("connection state is not OPEN: " + state);
        }
    }
</script>
</head>
<body>
    <div>
        <div id="inputform">
            <textarea id="q" cols="80" rows="2"></textarea>
            <input type="button" id="button-search" value="POST" />
        </div>
    </div>
    <div id="message"></div>
</body>
</html>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java】基本型変数の代入と参照型変数の代入の違い

どーも、ふぎとです。
今回も自身の復習を兼ねての投稿です。

「変数への代入」

「変数への代入」とは、変数に何かしらの値をセット
すること。

「基本型変数」への代入

基本型変数とは、「値そのものを保持する変数」のこと。
例えば、int型の変数numberに3を代入すると、numberが
保持する値は3になる。

int number = 3; //整数3numberに代入

「参照型変数」への代入

参照型変数とは、「コンピュータのメモリ上に確保された
ある領域(オブジェクト)への参照(オブジェクトの場所
を示す位置情報)を保持する変数」のこと。

String word = "Qiita"; //変数wordに文字列"Qiita"を代入?

上の例では、String型の変数wordに文字列"Qiita"が代入され
ているように見える。言い換えると、変数wordが保持する値
は文字列"Qiita"であるように見える。
しかし実際には、変数wordが保持している値は「String型オブ
ジェクトへの参照」である。つまり、「コンピュータのメモリ
上に確保された、文字列"Qiita"を格納する為の領域の位置情報」
を変数wordは持つのである。

この、変数が持つ値の性質の違いは、「他の変数にその変数を
代入する」ときに目に見えて現れてくる。

「他の変数にその変数を代入する」

int i = 21;
int k = i ; //int型変数kに変数iの値を代入
int i = 30; //変数i30を再代入

//StringBuilder型変数sb1(参照型変数)を宣言
StringBuilder sb1 = new StringBuilder();
sb1.append("Qiita"); //sb1が参照するオブジェクトに文字列"Qiita"を追加
StringBuilder sb2 = sb1; //sb2sb1の値を代入
sb1.append("★"); //sb1が参照するオブジェクトに文字列"★"を追加

System.out.println(i);   //30」を出力
System.out.println(k);   //21」を出力
System.out.println(sb1); //Qiita★」を出力
System.out.println(sb2) ;//Qiita★」を出力

基本型変数は、「値そのものを保持する変数」だ。そのため、
上の例において、int型変数kにiを代入したとき、その時点で
iが保持している値(21)が代入され、保持されることになる。
したがって、iに30を再代入してもkの値は変化せず21のまま
となる。
一方、参照型変数は「オブジェクトへの参照を保持する変数」
だ。よって、sb2にsb1を代入すると、「sb1が参照しているオ
ブジェクトへの参照」が値として代入されることになる。つま
り、「sb1が保持しているオブジェクトの位置情報」を、sb2も
また保持することになる。そのため、sb1が参照するオブジェク
トに文字列"★"を追加してから出力したとき、同じオブジェクト
を参照しているsb2にも変化があらわれるのだ。

まとめ

・基本型変数は「値そのもの」を値として保持する
・参照型変数は「オブジェクトへの参照」を値として保持する
・2種類の変数の性質の違いは「他の変数にその変数(の値)
 を代入したとき」に顕在化する

...
では今回はこの辺で。ふぎとでした。

(P.S.)記事の内容への指摘などあれば
   遠慮なくお知らせくださいm(__)m

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java EE(Jakarta EE)で「私はロボットではありません」を作る

0.環境

今回のこの記事を書いた環境

OS...Windows 10
IDE...Eclipse 2020-3
Java...Open JDK 14
サーブレットコンテナ...Apache Tomcat 9.0.33

1.reCAPTCHAを作成する

まずreCAPTCHAのサイトにアクセスします。
reCAPTCHA

+ボタンで作成。

自分のサイトの情報を入力していきます。

SS1.png

ラベルにはわかりやすい名前を入力します。

reCAPTCHA タイプは、「私はロボットではありません」をやりたいのでreCAPTCHA v2を選択。
すると、「私はロボットではありません」チェックボックスというのが出てきますので選択されていることを確認します。

ドメインは「私はロボットではありません」を設定するドメインを入力します。
一番上のドメインを登録しておけばサブドメインでも使えます。
開発環境でも使う場合は「localhost」も登録してやりましょう。

オーナーは…まぁ好きなようにすれば良いでしょう。

最後にreCAPTCHA 利用規約に同意して、アラートをオーナーに送信するか選択したら送信をクリック

次の画面で2つの文字列が表示されるので両方ともメモっておきます。

2.Eclipseで新しいプロジェクトを作成する

今回は「RecaptchaTest」にします。
(もう既に作ってある場合はそれを使ってください。)

3.HTML作成

Eclipseで作成したプロジェクトのWebContentに新しいHTMLファイルを作成しましょう。

もしくは外部のエディターで作ってプロジェクト内に貼り付けても問題無いでしょう。

普段こんなクソコード書かないんですがまぁ今回はサンプルなので。。。

<!doctype html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>reCAPTCHAのサンプル</title>
        <script src="https://www.google.com/recaptcha/api.js" async defer></script>
    </head>
    <body>
        <form action="login" method="post">
            ID:<input type="text" name="id"><br>
            パスワード:<input type="password" name="current-password">
            <div class="g-recaptcha" data-sitekey="[ここにさっき表示された2つの文字列のうち、上のボックスに入ってた文字列を入れる]"></div>
            <input type="submit" value="ログイン">
        </form>
    </body>
</html>

大事なのはheadのscriptを読み込む事と、formの中に

<div class="g-recaptcha" data-sitekey="[さっき表示された上のボックスに書いてあったやつ]">

を入れる事。

このdivを入れたところにあの「私はロボットではありません」のやつが表示されることになります。

んで、上のHTMLを完成させたら試しにサーバで実行してみましょう。
下の画像のようになればここまでおkです!!

SS3.PNG

4.クラス作成

GoogleのreCAPTCHAに結果を問い合わせるクラス(モデル)を作りましょう。

仕組みは簡単で決められたURLに決められたパラメータを乗せてPOSTしたらレスポンスでJSONが帰ってくる。

以下のコードのSECRET_KEYを自分で取得した文字列に変えましょうね~~~

package com.sakurai_shinya.recaptcha;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;

public class RecaptchaAuthenticator {

    private static final String URL = "https://www.google.com/recaptcha/api/siteverify";
    private static final String SECRET_KEY = "[下のボックスに入っていた文字列]";

    public static boolean checkRecaptcha(String userToken) throws IOException {
        String recaptchaResponse = post(new URL(URL), "secret=" + SECRET_KEY + "&response=" + userToken);
        return recaptchaResponse.contains("\"success\": true,");
    }

    private static String post(URL url, String parameters) throws IOException {
        HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
        con.setDoOutput(true);
        try (DataOutputStream dos = new DataOutputStream(con.getOutputStream())) {
            dos.writeBytes(parameters);
            dos.flush();
        }
        if (con.getResponseCode() != 200) {
            throw new IOException("サーバとの通信でエラーが発生しました。");
        }
        StringBuilder sb = new StringBuilder();
        try (BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()))) {
            String tempStr;
            while ((tempStr = in.readLine()) != null) {
                sb.append(tempStr);
            }
        }
        return sb.toString();
    }
}

面倒くさいのでレスポンスをcontainsで「"success": true,」が入ってたらOK、入ってなかったらNGって作った。
ちゃんとやるならちゃんとオブジェクト作ってパースしてって作った方が良いよねぇ

5.コントローラー(Servlet)作成

サーブレットのコード一応全部乗せておくけどPOSTのところだけしかいらない。
というかPOSTのところだけ見ろ

package com.sakurai_shinya.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sakurai_shinya.recaptcha.RecaptchaAuthenticator;

@WebServlet("/login")
public class Login extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html");
        super.service(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.sendRedirect("login.html");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        boolean recaptchaResult = false;
        try {
            recaptchaResult = RecaptchaAuthenticator.checkRecaptcha(request.getParameter("g-recaptcha-response"));
        } catch (IOException e) {
            response.getWriter().append("reCAPTCHA認証サーバの通信でエラーが発生しました。" + e.toString());
        }
        if (recaptchaResult) {// reCAPTCHA成功
            // ここにIDとパスワードを照合する処理。
            String inputId = request.getParameter("id");
            String inputPass = request.getParameter("current-password");
            response.getWriter().append("reCAPTCHA認証に成功。<br>ID:" + inputId + "<br>パスワード:" + inputPass);
        } else {// reCAPTCHA失敗
            response.getWriter().append("reCAPTCHA認証に失敗しました。");
        }
    }
}
RecaptchaAuthenticator.checkRecaptcha(request.getParameter("g-recaptcha-response"));

さっき作ったクラスのcheckRecaptchaを呼び出すと結果がtrueかfalseか例外で帰ってくるからtrueだったらreCAPTCHA成功、falseだったらreCAPTCHA失敗、例外はエラーってことになる。

ちなみにg-recaptchaのやつをformに貼るとg-recaptcha-responseってパラメータが不思議な力で一緒にPOSTされるようになる。
これをGoogleのサーバに送ってユーザを特定するんですね~~~

6.テスト

では試しに実行してみましょう!
result1.PNG

こうしてチェックを入れた場合とチェックを入れなかった場合でテストしてみてください!
result2.PNG

result3.PNG

7.おまけ

7-1.黒くする方法

g-recaptchaを持ってるやつにdata-theme=darkを追加すると黒くなります。
これで黒いサイトでもかっこよく配置できる!!

<div class="g-recaptcha" data-sitekey="6Lfx-eMUAAAAALrP774ZrvQa_AtguQhusF0M2W6s" data-theme="dark"></div>

こんな感じ↓

SS4.PNG

7-2.英語にする方法

api.jsのGETパラメータにhl=enをつけると英語になります。

<script src="https://www.google.com/recaptcha/api.js?hl=en" async defer></script>

SS5.PNG

変な位置で勝手に改行される日本語とは違ってスタイリッシュな印象になりますね~

ちなみに他の言語はreCAPTCHAのガイドに乗ってます。
Language Codes  |  reCAPTCHA  |  Google Developers

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む