我需要从我的 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/