1

出力として XLS ファイルを生成する Java アプレットに取り組んでいます。ドキュメントを変更できないようにする必要があるため、ユーザーがドキュメントを表示、ダウンロード、および印刷できるようにする前に、ドキュメントを PDF (またはそれ以上の PDF/A) に変換する必要があります。

ソリューションをコーディングしてみましたが、うまくいきました。出力 XLS が JODConverter 入力ファイルになり、すべて正常に動作するように、アプレットに JODConverter 2 をダウンロードしてバンドルしました。問題は、このコンポーネントのサイズです: ほぼ 2MB です。私のアプレットはすでに 3 MB であるため、JODConverter も同梱したくありません...

Webサービスとしても機能するドキュメントを読みました.POSTリクエストを作成し、それをサービスに送信してファイルを取得します.JODConverterの単一のkbをダウンロードする必要はありません. それは素晴らしいように聞こえますが、私はそれを機能させることができません。

以下は私が書いたコードです:

public class Main
{
    public static void main(String[] args) throws Exception
    {
        doPost(new URL("http://localhost:8090/pdfconverter/service"), "C:\\Documents and Settings\\Administrator\\Desktop\\Gestione oneri\\calcolo oneri XP.xls");
    }


    private static void doPost(URL url, String binaryFile)
    {
        try
        {
            File binFile = new File(binaryFile);
            URLConnection conn = url.openConnection();
            conn.addRequestProperty("Content-Type", "multipart/form-datastrong text");
            conn.addRequestProperty("Accept", "application/pdf");
            conn.setDoOutput(true);
            DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
            FileInputStream input = new FileInputStream(binFile);
            byte[] buffer = new byte[1024];
            for(int length = 0; (length = input.read(buffer)) > 0;)
            {
                wr.write(buffer, 0, length);
            }
            wr.flush(); // Important! Output cannot be closed. Close of writer will close output as well.
            // Get the response and write it to a file.
            File file = new File("C:\\Documents and Settings\\Administrator\\Desktop\\Gestione oneri\\calcolo oneri XP2.pdf");
            FileOutputStream wrFile = new FileOutputStream(file);
            DataInputStream dataInput = new DataInputStream(conn.getInputStream());
            buffer = new byte[1024];
            for(int length = 0; (length = dataInput.read(buffer)) > 0;)
            {
                wrFile.write(buffer, 0, length);
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

JODConverter Web サービスを含む WAR をダウンロードして tomcat\webapps\pdfconverter に配置し、OpenOffice サービスを開始するスクリプトを作成しました。

soffice -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\" -nofirststartwizard

しかし、ここに私のスタックトレースがあります:

java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:8090/pdfconverter/service
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at main.Main.doPost(Main.java:128)
at main.Main.main(Main.java:25)

Main.java:128 は行です

DataInputStream dataInput = new DataInputStream(conn.getInputStream());

Tomcat ログには次のように表示されます: アクセス ログ:

127.0.0.1 - - [30/Jan/2013:11:45:24 +0100] "POST /pdfconverter/service HTTP/1.1" 500 4426

[コンテンツ タイプを text/plain から multipart/form-data に変更した後の編集] 標準ログ:

Grave: Servlet.service() for servlet [DocumentConverterServiceServlet] in context with path [/pdfconverter] threw exception
java.lang.IllegalArgumentException: unsupported input mime-type: multipart/form-data
at com.artofsolving.jodconverter.web.DocumentConverterServiceServlet.doPost(DocumentConverterServiceServlet.java:69)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)

変換プロセス中に例外が発生したため、POST に問題があると思いますが、問題が見つからないようです: 投稿されたコードは、さまざまな試行錯誤の最後のバージョンであるため、おそらくこれより前に私はPOSTの正しいコードを使用し、他の何かを台無しにしました...どんな提案も大歓迎です!

4

1 に答える 1

1

最初はasで.xlsファイルを送信していましたが、何らかのエラーが原因でドキュメントを解析できないという例外が発生しました (おそらく JODConverter 2 がファイルをファイルとして変換しようとしていたのでしょう)。Mime-Typetext/plain.xls.txt

これは最初の例外でした。現在、サポートされていない例外が発生していmultipart/form-dataます。これMime-Typeはドキュメントを表すことはありません。あるドキュメントを別のドキュメントで .pdf として変更する場合は、有効なMime-Type定義を提供する必要があります。

.xlsファイルの場合、これは有効Mime-Typeですapplication/vnd.ms-excel。ここで他のタイプを見つけることができます: mime-types for xls

この変更により、リクエストを JODConverter に送信できるようになります。

于 2013-01-30T12:17:33.250 に答える