在AX 2009中通过批处理作业生成损坏的pdf文件

时间:2013-11-26 13:00:31

标签: pdf axapta dynamics-ax-2009

我遇到了通过批处理作业生成报告pdf文件的问题。它工作正常,除非使用批处理作业执行(有时它可以工作,但大部分时间我已经损坏了pdf文件):

 while(qr.next())  //loop on my quotationId with some filters
        {
        salesQuotation = qr.get(tablenum(salesQuotationTable));
        filenamePDF = strfmt("%1%2",SalesQuotation.QuotationId,".pdf");

        permissionSetPDF =  new Set(Types::Class);
        permissionSetPDF.add(new FileIOPermission(filenamePDF,'w'));
        permissionSetPDF.add(new InteropPermission(InteropKind::ClrInterop));
        CodeAccessPermission::assertMultiple(permissionSetPDF);

        report = new ReportRun(new Args(ReportStr(DevisContactBusinessV2)));
        report.query().interactive(false);
        report.report().interactive(false);
        report.args().caller(null);

        report.args().parm(SalesQuotation.QuotationId);

        report.printJobSettings().setTarget(PrintMedium::File);
        report.printJobSettings().format(PrintFormat::PDF);
        report.printJobSettings().warnIfFileExists(false);
        report.printJobSettings().fileName(strfmt("%1%2",path,filenamePDF));

        report.run();

        //tried to get around the file size problem by execute pdf file generation outside the loop
        fi = new System.IO.FileInfo(strfmt('%1%2',path,filenamePDF));
        length = fi.get_Length();

        if(length <= 1000)
            {
               info(strfmt("%1 %2","Quotation problem",SalesQuotation.QuotationId));
               this.OBRfixPDF(salesQuotation.QuotationId);
            }
        else
            {
                info(strfmt("%1 %2","Quotation OK:",SalesQuotation.QuotationId));
            }

        CodeAccessPermission::revertAssert();
    }

生成的文件似乎已损坏,它们的大小为1 ko且无法读取。报告中没有图像,我使用的是没有SP1的AX 2009。

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题并且信不信由它与字体和字体缓存有关。我不得不做一些改变,但你需要做的第一件事就是:

report.printJobSettings.format(PrintFormat::PDF_Embed_Fonts);

然后在Class“ClassFactory”createViewer方法中添加名为“noFontCache”的布尔变量,在“ReportOutputUserType :: PDFEmbedFonts”的情况下,将代码更改为以下内容:

noFontCache = true;
return new PDFViewer(jobsCursor,pagesCursor,true,noFontCache);

然后在新的mehtod下的类PDFViewer中,将方法签名更改为:

public void new(PrintJobHeader _jobCursor, PrintJobPages _pagesCursor, boolean _embedFonts = false, boolean _noFontCache = false) 

然后,在方法结束的超级调用之前添加以下代码:

if(_noFontCache)
{
    pdfFontCache = new SysPdfFontCache();
}
else
{
     pdfFontCache  = infolog.getPdfFontCache();
}

这允许AX生成新的字体缓存,而不是使用现有的字体缓存(由用户在其客户端计算机上生成,现在该服务器与运行批处理作业的服务器不同)。

答案 1 :(得分:0)

这是AX 2009的一个已知问题(我相信前7或8)。由于安全问题,如果它们包含图像,则存在阻止从服务器生成PDF的限制。

我没有更多相关信息,但有一个修补程序,您可以通过CustomerSource找到它。您还可以在以下位置找到指向它的链接: http://blogs.msdn.com/b/emeadaxsupport/archive/2011/09/19/you-cannot-print-images-on-batch-reports-now-you-can.aspx

答案 2 :(得分:0)

如果您使用Web服务或Web应用程序中的Business Connector组件,则会出现此问题。 这是修复: http://support.microsoft.com/kb/937345