Crystal report使用Java为日语字符发布PDF字体

Crystal report使用Java为日语字符发布PDF字体,java,asp.net,crystal-reports,crystal-reports-server,Java,Asp.net,Crystal Reports,Crystal Reports Server,我使用crystal report生成不同格式的文件(pdf、excel、word)。发送电子邮件时导出的.rpt文件。我在以PDF附件形式发送电子邮件时遇到问题。日语字符显示为方框。当我作为Excel或Word附件发送时,我能够看到日文字符 为了解决这个问题,我在谷歌上搜索了一下,发现这是crystal report导出为PDF时的字体问题,我们需要为日文字符提供“MS哥特式”字体。我在“crystal reposrt designer”的某个特定领域尝试了同样的方法,现在效果很好 但这并不是

我使用crystal report生成不同格式的文件(pdf、excel、word)。发送电子邮件时导出的.rpt文件。我在以PDF附件形式发送电子邮件时遇到问题。日语字符显示为方框。当我作为Excel或Word附件发送时,我能够看到日文字符

为了解决这个问题,我在谷歌上搜索了一下,发现这是crystal report导出为PDF时的字体问题,我们需要为日文字符提供“MS哥特式”字体。我在“crystal reposrt designer”的某个特定领域尝试了同样的方法,现在效果很好

但这并不是我想要的解决方案,因为有数千个报告(.rpt文件),每个报告中都有许多字段,所以对每个报告中的每个字段都这样做是不可行的

所以我想在我的java代码for.pdf文件中以编程方式实现它

private void exportReport(HttpSession session, HttpServletRequest req, ReportClientDocument rptDoc, String sReport)
        throws Exception
    {
        String sExportType = req.getParameter("cmbExportTypes");
        
        if (sReport == null)
            sReport = (String) session.getValue("selected_report");
            
        sReport = Util.removeEndingChar(sReport, ".rpt");
        
        String sExtension = "";
        
        if (sExportType.toLowerCase().indexOf("word") != -1)
            sExtension = ".doc";
        else if (sExportType.toLowerCase().indexOf("excel") != -1)
            sExtension = ".xls";
        else if (sExportType.toLowerCase().indexOf("pdf") != -1)
            sExtension = ".pdf";
        else if (sExportType.toLowerCase().indexOf("rtf") != -1)
            sExtension = ".rtf";
        else if (sExportType.toLowerCase().indexOf("report") != -1)
            sExtension = ".rpt";
            
        String sFileName = sReport + sExtension;
        FileType file = new FileType(-1, sFileName, false);
        
        FieldObject fieldObject = new FieldObject();
        IFontColor fontColor = fieldObject.getFontColor();
        IFont iFont = fontColor.getIFont();
        iFont.setName("MS Gothic");
        iFont.setSize(9.5f);
        
        //rptDoc.getReportDefController().getReportObjectController().modify(fieldObject ,fieldObject);
        
        // 07/03/2012 EA: PR #15087  -- Support Crystal Reports 2008 SP5
        InputStream  byteIS = rptDoc.getPrintOutputController().export(ReportExportFormat.from_string(sExportType));
        EmailAttachment attachment = new EmailAttachment(byteIS, file.type, sFileName);
        session.putValue("report_attachment", attachment);
        
        rptDoc.close();
    }

我仍然在用那些方块来代替日本汉字。我需要帮助。我认为modify方法需要一些更改。

我认为这不会以编程方式工作。在我们公司,我们还得出结论,我们必须改变报告的字体-(

此外,我不建议它以编程的方式进行。每种字体都是不同的。当我获取一份报告并将所有字段从“Tahoma”更改为“Verdana”时,这些字段会被替换,变为长、重叠等等。 同样的情况也可能发生在这里


也许你不必更改所有千份报告。也许只有那些包含日语字符的字段并且经常使用的报告。

是的,这是正确的,所有报告的字体都会更改,而不管语言如何。我还告诉我的客户使用“crystal report server”更改他们希望使用日文/中文字符的任何特定字段的字体。因为我没有找到不进行代码更改的任何其他解决方案,如果代码更改,那么这就是问题所在。