【问题标题】:How to initialize multiple instance of Amyuni Pdf library?如何初始化 Amyuni Pdf 库的多个实例?
【发布时间】:2016-06-14 23:39:43
【问题描述】:

我正在使用 Windows 服务中的 Amyuni pdf 库,该服务作为 LocalSystem Account 运行。以下是我用于打印的代码。

 private void Initialize()
    {
        acPDFCreatorLib.Initialize();
        acPDFCreatorLib.SetLicenseKey(licenseTo, activationCode);
    }

......打印pdf

using (FileStream file1 = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                using (IacDocument doc1 = new IacDocument())
                {
                    doc1.Open(file1, "");
                    doc1.AttributeByName("Title").Value = documentName;
                    doc1.SetAttributeForMultipleSelection("UnicodeFonts", true, false);
                    doc1.Copies = printEvent.Copies;
                    bool printed = doc1.Print(printerName, false);
                    PrintSystemJobInfo PrintSystemJobInfo = GetPrintJob(printerName, fileName);
                    if (printed)
                    {
                        Logger.Log(string.Format("[AMYUNI]  PDF' {0} ' printed using printer {1}", documentName, printerName));
                        return true;
                    }
                    return false;
                }

对于某些打印机 'doc1.Print(printerName, false);'在不工作并且它没有返回结果。用于调用打印函数的线程永远不会返回。所以我们无法识别错误。

所以现在,我们计划的解决方案是在不同线程中为每台打印机初始化 amyuni 库实例。有了这个,我们将能够使我们的解决方案适用于其他打印机,即使它被单个打印机阻止(amyuni 库冻结不响应)。

对于这个我们如何初始化库的多个实例?

【问题讨论】:

    标签: c# pdf printing pdf-generation


    【解决方案1】:

    此调用保持原样,但仅在主线程中

    private void Initialize()
        {
            acPDFCreatorLib.Initialize();
            acPDFCreatorLib.SetLicenseKey(licenseTo, activationCode);
        }
    

    剩下的部分在单独的线程中:

    using (FileStream file1 = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                    using (IacDocument doc1 = new IacDocument())
                    {
                        doc1.Open(file1, "");
                        doc1.AttributeByName("Title").Value = documentName;
                        doc1.SetAttributeForMultipleSelection("UnicodeFonts", true, false);
                        doc1.Copies = printEvent.Copies;
                        bool printed = doc1.Print(printerName, false);
                        PrintSystemJobInfo PrintSystemJobInfo = GetPrintJob(printerName, fileName);
                        if (printed)
                        {
                            Logger.Log(string.Format("[AMYUNI]  PDF' {0} ' printed using printer {1}", documentName, printerName));
                            return true;
                        }
                        return false;
                    }
    

    根据您的工作流程,您可能需要确保 PDF Creator IacDocument 实例在该实例的打印完成之前没有被释放。

    免责声明:此答案由 Amyuni Technologies 的一名员工提供。

    【讨论】:

    • 我们已经在单独的线程中使用它。执行日志如下。 -[Thread 11]Initializing acPDFCreatorLib -[Thread 14] Printing PDF ' -[Thread 5]Initializing acPDFCreatorLib -[Thread 15] Printing PDF ' 但它似乎在高级别使用我在使用 @987654323 初始化时创建的相同参考@ 因此,如果 acPDFCreatorLib 因打印机上的问题而崩溃,它也会停止为其他打印​​机工作。你能解释一下它是如何工作的吗
    • @charithsoori 如果您的打印机使用的是假脱机服务,那么如果一个打印作业崩溃,所有其他待处理的作业都将遭遇同样的命运。
    • “但它似乎在高级别的使用相同的引用”我不明白你的意思......你正在创建文档类的实例,所以只有你可以判断你是否是否在所有线程中使用相同的引用。
    • 顺便说一下,你不应该在每个线程上调用 acPDFCreatorLib.Initialize(),你应该在创建第一个文档实例之前在主线程中调用一次。
    • 我们的问题是我们有一台特殊的打印机需要“启用白色背景”。如果我们不这样做,我们的应用程序将停止为所有打印机打印,而不仅仅是该打印机。由于它对所有打印机都停止,我们的假设是 Amyuni 库崩溃。而且我们无法识别它,因为它没有返回或给出异常。因此,现在我们需要我们的应用程序与 Amyuni 库完全隔离。通过这样做,我们预计如果 Amyuni 库停止像上面那样在一台打印机上工作,它仍然可以在其他打印机上工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2013-10-18
    相关资源
    最近更新 更多