android - 从 Oracle 程序运行 Powershell 命令

标签 android oracle powershell oracle12c

我需要从我的 android studio 应用程序将 pdf 文档打印到我的网络打印机。我想打印所有图像和格式的 pdf,但是,我找到的解决方案只允许从 pdf 中提取和打印文本。

我还看到提到 Ghostscript 等工具的解决方案,这些工具应该将 pdf 转换为 postscript 文件,但这些工具不适用于 Android Studio,或者至少我还没有想出如何将它们集成到我的应用。我无法购买像 jPDFPrint 这样的工具,它完全符合我的需要。

我开始考虑变通办法,并想到将我的 pdf 作为 blob 发送到我的 oracle 数据库,并从过程调用 power shell 命令以将其打印到特定打印机。

我已经创建并测试了以下命令以从我的 PC 打印到我的网络打印机,效果很好。

    Start-Process -FilePath “c:\test.pdf” –Verb PrintTo '\\PrintServer\PrinterName' -PassThru | %{sleep 10;$_} | kill

现在我需要 oracle 部分的帮助。是否可以从 oracle 12c 中调用或运行 powershell 命令并将 pdf blob 以及打印机名称传递给它?

最佳答案

将 BLOB 提取为 PDF。

创建您的系统文件夹,例如 c:\printthis

然后创建映射到此文件夹的 Oracle 目录对象:

CREATE OR REPLACE DIRECTORY print_dir AS 'C:\print_this';

GRANT READ WRITE ON DIRECTORY print_dir TO PUBLIC;

此过程将 BLOB 提取到文件中。

CREATE OR REPLACE PROCEDURE extract_pdf ( p_id IN VARCHAR2 ) AS
   CURSOR c1 IS 
      SELECT doc_blob, doc_name
      FROM doc_table
      WHERE doc_id = p_id;
   r1         c1%ROWTYPE;
   v_size     NUMBER( 5,0) := 32000;
   v_len      NUMBER(38,0);
   v_buffer   RAW(32000);
   v_file     UTL_FILE.FILE_TYPE;
BEGIN
   OPEN c1;
   FETCH c1 INTO r1;
   v_file  := UTL_FILE.FOPEN('PRINT_DIR', r1.doc_name, 'wb', 32760 );
   v_start := 1;
   v_len   := DBMS_LOB.GETLENGTH( r.bbl_fic );
   WHILE v_start <= v_len LOOP
      DBMS_LOB.READ(
             r.bbl_fic,
             LEAST( v_len - v_start + 1, v_size ),
             v_start,
             v_buffer
           );
      UTL_FILE.PUT_RAW( v_file, v_buffer );
      UTL_FILE.FFLUSH( v_file ); 
      v_start := v_start + v_size;
    END LOOP;
    UTL_FILE.FCLOSE( v_file );
--  Write the CMD file
    v_file := UTL_FILE.FOPEN('PRINT_DIR', r1.doc_name || '.bat', 'w' );
    UTL_FILE.PUT_LINE(     'Start-Process -FilePath “c:\print_this\' || r1.doc_name || '” –Verb PrintTo '\\PrintServer\PrinterName' -PassThru | %{sleep 10;$_} | kill' );
    UTL_FILE.CLOSE(v_file);
END;
/

运行的 Windows At 作业轮询 c:\print_this 文件夹中的文件并运行 .bat 命令,然后将其删除。

@ECHO OFF
setlocal enabledelayedexpansion
for %%f in (c:\print_this\*.bat) do (
  echo "Name: %%f"
  powershell %%f
  del %%f
)

问题仍然是如何将它们拼接在一起。您的 Android 应用程序调用您的过程以将 PDF 存储为 BLOB。它还必须能够调用上面建议的过程以将保存的 BLOB 提取到数据库服务器文件,因此在保存 BLOB 之后调用提取 ODF 和创建打印 bat 脚本的过程。

Task Scheduler 作业轮询 bat 脚本的目录,运行它们并删除它们。

您不能直接从 Oracle 中向服务器主机发出命令。您可以使用 DBMS_SCHEDULER。在上面的示例中,作业将 doc_id 作为参数,并通过 DBMS_SCHEDULER.RUN_JOB 执行。我不记得如何准确地执行此操作,但我希望我对 Windows 中的任务计划程序的其他建议对您有所帮助。

关于android - 从 Oracle 程序运行 Powershell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56393976/

相关文章:

Android Google 加号登录按钮

Android:访问构成视频的图像

sql-server - Enter-PSSession 后 Invoke-SqlCmd 出现 'NT AUTHORITY\ANONYMOUS LOGON' 错误?

string - 如何使用多个字符的字符串在 PowerShell 中 "split"字符串?

powershell - 无法使用 Powershell 2.0 压缩文件

android - 使用 Sinch 发送消息总是失败

java - 如何在 Android Studio 中创建分数计数器?

oracle - oracle如何创建只读数据库链接

oracle - BPEL中的表达式构建器

java - Oracle 是否支持通过 JDBC 的服务器端可滚动游标?