fax4j意外的结果:无法发送传真

时间:2013-05-15 09:16:39

标签: java fax

我正在尝试使用fax4j库(http://fax4j.sourceforge.net)以编程方式发送传真,但遗憾的是我无法这样做。

我使用了javadoc中提供的示例代码来尝试它并最终修改它以尝试了解库。

这段代码 WORKS ,就像在程序中完成它的执行而不会抛出任何异常,但它并没有真正发送传真,这正是我想要实现的。

package com.myclasses;

import java.io.*;
import java.util.Properties;

import org.fax4j.FaxClient;
import org.fax4j.FaxClientFactory;
import org.fax4j.FaxJobStatus;
import org.fax4j.FaxJob;
import org.fax4j.FaxJob.FaxJobPriority;

public class MyTestClass
{
    public static void main(String[] args)
    throws InterruptedException, IOException
    {
        File file = new File("Drive:\\Directory\\MyFile.pdf");
        System.out.println("File Opened");

        FaxClient faxClient = FaxClientFactory.createFaxClient();
        System.out.println("Client created");

        System.out.println(faxClient.getProvider().getName());
        System.out.println(faxClient.getProvider().getDescription());

        FaxJob faxJob = faxClient.createFaxJob();
        System.out.println("Job Created");

        faxJob.setFile(file);
        System.out.println("file added");

        faxJob.setPriority(FaxJobPriority.HIGH_PRIORITY);
        System.out.println("priority set");

        faxJob.setTargetAddress(recipient);
        System.out.println("recipient set");

        faxClient.submitFaxJob(faxJob);
        System.out.println("Fax Job Sumbitted: " + faxJob.getID());


        while (faxClient.getFaxJobStatus(faxJob) == FaxJobStatus.PENDING)
        {
            System.out.println("STATUS: "
                + faxClient.getFaxJobStatus(faxJob).toString());

            for (int i = 0; i < 100; i++)
            {
                Thread.sleep(100);
                System.out.print(".");
            }
        }

        System.out.println("STATUS: "
            + faxClient.getFaxJobStatus(faxJob).toString());

    }
}

它与示例代码或多或少完全相同,只是它向控制台提供输出以标记点。

我还在最后添加了循环,以定期检查作业的状态并保持程序运行,直到作业不再“挂起”为止。由于这种情况没有发生,我得到的是无休止的循环。

虽然相当完整,但javadoc有点模糊,难以理解,因为我不确切知道我在寻找什么。我在网上找不到任何教程,所以任何帮助都会非常感激。

或者如果有人知道使用fax4j的传真发送应用程序,其中有来源可用(即使只是咨询),这将是惊人的,因为这样我可以看到它是如何正确使用。


修改

当我首先写下这个问题时,我忘了添加一个细节,回想起来可能有一些重要性。

执行faxClient.sumbitFaxJob(faxJob)指令时,将打开Adobe Reader但未加载任何文件。但是看看Adobe Reader中的文件历史记录,我得到的可能就是%HOMEDIR%\AppData\Local\Temp\long-randomly-generated-name.pdf(无法使用Adobe Reader获取完整目录,当我尝试重新加载文件时,文件不存在)。

同样,当我将源文件更改为非pdf时,我在Java中获得了%HOMEDIR%\AppData\Local\Temp上名为`fax4j_random-suite-of-digit.vbs的空文件的异常:

Exception in thread "main" org.fax4j.FaxException: Error while invoking VBS script, error found at line 145: faxJobID=faxDocumentInstance.Send,  script output:
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. Tous droits réservés.

[fax4j-vbs][DEBUG] Sending fax

Script error:
C:\Users\8809898B\AppData\Local\Temp\fax4j_1590168650663566246.vbs(145, 1) (null): Données non valides. 


at org.fax4j.spi.vbs.VBSFaxClientSpi.invokeScript(VBSFaxClientSpi.java:722)
at org.fax4j.spi.vbs.VBSFaxClientSpi.submitFaxJobImpl(VBSFaxClientSpi.java:416)
at org.fax4j.spi.AbstractFaxClientSpi.submitFaxJob(AbstractFaxClientSpi.java:204)
at org.fax4j.spi.adapter.AdapterFaxClientSpi.submitFaxJobImpl(AdapterFaxClientSpi.java:505)
at org.fax4j.spi.AbstractFaxClientSpi.submitFaxJob(AbstractFaxClientSpi.java:204)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.fax4j.spi.AbstractFaxClientSpiProxy.invoke(AbstractFaxClientSpiProxy.java:202)
at $Proxy0.submitFaxJob(Unknown Source)
at org.fax4j.FaxClient.submitFaxJob(FaxClient.java:211)
at com.myclasses.MyTestClass.main(MyTestClass.java:43)

1 个答案:

答案 0 :(得分:0)

我看到你使用Windows所以我建议使用Windows SPI。 基本上你只需要确保fax4j.dll和fax4j.exe在本机路径上(通过java.library.path或windows PATH设置)

在打印方面,acrobat也不是一个好的第三方,并且有很多问题。 去官方fax4j论坛,你会看到其他pdf阅读器推荐支持更好的打印。使用acrobat的东西不会很好。