Apache PDFBoxの例での.Netフレームワークを介したJavaと1Cの統合

例としてApache PDFBoxを使用したIKVM.Netを介したJavaと1Cの統合



Javaと1Cの統合に関するインターネット上の情報はほとんどありません。 それにもかかわらず、1C内で評価したい仕事の興味深いJavaプロジェクトがあります。 Apache PDFBoxはそのような人気のあるプロジェクトの1つです。 そのため、pdfファイルは非常に一般的であり、1Cにはこの形式を操作するための優れたツールがありません。 ここで提案する方法は、IKVM.NETユーティリティを介してJAVAライブラリを.Netアセンブリに転送し、統合ツールを使用して1C内でこのアセンブリを使用することです。

Apache PDFBoxは、PDFドキュメントを操作するためのJavaライブラリです。 テキストの抽出、PDFの印刷、ドキュメントのマージと分割、画像への変換、フォームへの記入、PDFの作成、PDF / Aの確認、Lucene Search Engineとの統合などの操作を実行できます。 この例では、バージョン1.8.2が使用されています。

IKVM.Netは、Monoおよび.Netフレームワーク用のJava仮想マシンです。 IKVM.Netでは、Javaライブラリを.Netアセンブリに変換してから、.Netフレームワークを使用してライブラリにアクセスできます。 IKVM.Netには、さまざまなJavaクラスを担当する多くのヘルパーアセンブリが含まれています。 この例では、バージョン7.2.4630.5を使用しています。


Jarをdllアセンブリに変換



このステップでは、IKVM.Net 7.2.4630.5がコンピューターにインストールされていると想定しています。

Jarライブラリを.Netフレームワークアセンブリに変換する前に、Java Runtime Engineをインストールし、JAVA_HOME環境変数を設定する必要があります。

JAVA_HOME C:\Progra~1\Java\jre6

JAVA_HOME環境変数

アセンブリ変換コマンドの形式は次のとおりです。

ikvmc.exe -out:pdfbox.dll pdfbox-app-1.8.2.jar

出力は、アセンブリに応じて、pdfbox.dllアセンブリです。

 IKVM.OpenJDK.Beans.dll IKVM.OpenJDK.Core.dll IKVM.OpenJDK.Jdbc.dll IKVM.OpenJDK.Media.dll IKVM.OpenJDK.Naming.dll IKVM.OpenJDK.Security.dll IKVM.OpenJDK.SwingAWT.dll IKVM.OpenJDK.Text.dll IKVM.OpenJDK.Util.dll IKVM.OpenJDK.XML.API.dll IKVM.Runtime.dll 


この段階では、この方法の欠点は、大量に共同供給されるアセンブリに関連しています。 PDFBox.dllには約10 MB、補助アセンブリには約18 MBが必要です。

1C内で簡単なPDFBox操作を実行する


JAVAから変換されたPDFBox.dllアセンブリは、.Net Bridgeを介して1C内で起動されます。

必要なすべてのアセンブリをダウンロードします。
 net.LoadAssemblyFrom( + "IKVM.AWT.WinForms.dll"); net.LoadAssemblyFrom( + "IKVM.OpenJDK.Beans.dll"); net.LoadAssemblyFrom( + "IKVM.OpenJDK.Core.dll"); net.LoadAssemblyFrom( + "IKVM.OpenJDK.Jdbc.dll"); net.LoadAssemblyFrom( + "IKVM.OpenJDK.Media.dll"); net.LoadAssemblyFrom( + "IKVM.OpenJDK.Naming.dll"); net.LoadAssemblyFrom( + "IKVM.OpenJDK.Security.dll"); net.LoadAssemblyFrom( + "IKVM.OpenJDK.SwingAWT.dll"); net.LoadAssemblyFrom( + "IKVM.OpenJDK.Text.dll"); net.LoadAssemblyFrom( + "IKVM.OpenJDK.Util.dll"); net.LoadAssemblyFrom( + "IKVM.OpenJDK.XML.API.dll"); net.LoadAssemblyFrom( + "IKVM.Runtime.dll"); net.LoadAssemblyFrom( + "pdfbox.dll"); 


PDFファイルを開く:
 pdf = net.CallStatic("org.apache.pdfbox.pdmodel.PDDocument", "load", ); 


PDFからテキストを取得:
 stripper = net.New("org.apache.pdfbox.util.PDFTextStripper"); Pdf = stripper.getText(pdf); 


ドキュメントを単一ページのPDFに分割します。
 splitter = net.New("org.apache.pdfbox.util.Splitter"); splitter.setSplitAtPage(1);  = splitter.split(pdf).toArray();   = 0  .Length - 1  .GetValue().save( + ( + 1) + ".pdf"); ; 


元のPDFの奇数ページから新しいドキュメントを作成します。
  = pdf.getDocumentCatalog().getAllPages(); newPdf = net.New("org.apache.pdfbox.pdmodel.PDDocument");   = 0  .size() - 1    % 2 = 1  ; ; newPdf.addPage(.get()); ; newPdf.save(Pdf); 


未解決の問題



最も単純な操作が正常に機能したという事実にもかかわらず、ページ/ドキュメントを画像ファイルに変換する問題は未解決のままでした。

  = net.GetStatic("java.awt.image.BufferedImage", "TYPE_INT_ARGB"); imageWriter = net.New("org.apache.pdfbox.util.PDFImageWriter"); success = imageWriter.writeImage(pdf, "png", "", 1, 3, "document-img", , 96); 


上記のコードは、画像ファイルへの誤ったテキスト出力につながります。 結果のpngファイルは次のとおりです。 テキストは、写真の左上隅に非常に小さな活字で表示されます。

PDFBox出力エラー

記事の資料のアーカイブ: Java1C.zip(14.36 mb)

Source: https://habr.com/ru/post/J193212/


All Articles