Salesforce中Blob对象的toPdf方法的字符集问题

Salesforce中Blob对象的toPdf方法的字符集问题,salesforce,apex-code,Salesforce,Apex Code,我需要打印出pdf文档中的土耳其字符,如“ş”、“ç”、“ü”等。 我正在使用以下代码 global class InvoicePDFGenerator { public static final String FORM_HTML_START = '<HTML><BODY>'; public static final String FORM_HTML_END = '</BODY></HTML>'; webservice

我需要打印出pdf文档中的土耳其字符,如“ş”、“ç”、“ü”等。 我正在使用以下代码

global class InvoicePDFGenerator {

    public static final String FORM_HTML_START = '<HTML><BODY>';
    public static final String FORM_HTML_END = '</BODY></HTML>';

    webservice static void generateInvoicePDF(String invoiceId){
        OppoInvoice__c invoice= [SELECT Id,Account_Name__c FROM OppoInvoice__c WHERE Id=:invoiceId];
        String pdfContent = '';
        try {
            pdfContent = '<html><head><meta http-equiv=content-type content=text/html;charset=iso-8859-9></meta></head><body>';

            pdfContent = pdfContent + '<P>' + invoice.Account_Name__c+ '</P>';
            pdfContent = pdfContent + FORM_HTML_END;
        }catch(Exception e){
            pdfContent = '' + FORM_HTML_START;
            pdfContent = pdfContent + '<P>THERE WAS AN ERROR GENERATING PDF: ' + e.getMessage() + '</P>';
            pdfContent = pdfContent + FORM_HTML_END;
        }

        Attachment attachmentPDF = new Attachment();
        attachmentPDF.parentId = invoice.Id;
        attachmentPDF.Name = 'Invoice.pdf';
        attachmentPDF.body = Blob.toPDF(pdfContent); //This creates the PDF content
        insert attachmentPDF;

    }
}
全局类InvoicePDFGenerator{
公共静态最终字符串FORM_HTML_START='';
公共静态最终字符串形式_HTML_END='';
webservice静态void generateInvoicePDF(字符串invoiceId){
OppoInvoice\uuuuuC发票=[从OppoInvoice\uuuuC中选择Id、帐户名称\uuuuuuC,其中Id=:invoiceId];
字符串pdfContent='';
试一试{
pdfContent='';
pdfContent=pdfContent+'

'+发票。账户名称\uuuu c+'

'; pdfContent=pdfContent+FORM\u HTML\u END; }捕获(例外e){ pdfContent=''+表单\u HTML\u开始; pdfContent=pdfContent+'

生成PDF时出错:'+e.getMessage()++'

'; pdfContent=pdfContent+FORM\u HTML\u END; } 附件attachmentPDF=新附件(); attachmentPDF.parentId=invoice.Id; 附件pdf.Name='Invoice.pdf'; attachmentPDF.body=Blob.toPDF(pdfContent);//这将创建PDF内容 插入附件PDF; } }

我认为问题是由附件pdf.body=Blob.toPDF(pdfContent)行引起的。您对这个问题有什么想法吗?

这可能是您应该向Salesforce报告的
Blob.toPDF
方法的一个限制

我能想到的最接近的解决方案是对每个字符串使用
escapeHtml4()
方法,但这只包括字符实体的子集。它将示例字符串
'abcşidça'
转换为
'abcşidç;a'


如果
meta
标记不太可能影响输出,您可以尝试仅使用
启动HTML,看看这是否有帮助。

我将带有土耳其语字符的字符串常量推入pdfContent。输出为“öçÖÜ” 对于输入值为“çşāıāŞĞ࢜”


这是没有查询的代码

global class AccountPDFGenerator
{

    webservice static void generateInvoicePDF(String accountId)
    {
//     Account account = [SELECT Id,Name FROM Account WHERE Id=:accountId];

        String accId = accountId;

        String pdfContent = '';
        try
        {
            pdfContent = '<html><head><meta http-equiv="content-type" content="text/html; charset=iso-8859-9"></meta></head><body>';           
            pdfContent = pdfContent + '<p style="color:red">' + 'öçşğüıÖÇŞĞÜİ' + '</p>';
            pdfContent = pdfContent + '</body></html>';
        }catch(Exception e)
        {
            pdfContent = pdfContent + '<P>THERE WAS AN ERROR GENERATING PDF: ' + e.getMessage() + '</P>';
        }
        pdfContent = 'öçşğüıÖÇŞĞÜİ'; 

        Attachment attachmentPDF = new Attachment();
        attachmentPDF.parentId = accId;
        attachmentPDF.Name = 'Invoice.pdf';
//     attachmentPDF.body= Blob.valueOf(pdfContent);
        attachmentPDF.body = Blob.toPDF(pdfContent); //This creates the PDF content
        insert attachmentPDF;

    } 

}
这是html文件内容

<html><head><meta http-equiv=content-type content=text/html;charset=iso-8859-9></meta></head><body><p>öçşğüıÖÇŞĞÜİ</p></body></html>


发生了什么?我假设Salesforce在其字符串中使用UTF-8。您是否尝试省略了试图设置
charset=iso-8859-9
META
标记?我也尝试了UTF-8,但结果没有改变。代码工作正常,但不显示土耳其语字符。例如,如果pdfContent变量的值为“abcşidça”,则pdf文档的输出为“abcida”。它是如何编写一个元标记的?你能给我举个例子吗?(1)你能发布一个不使用查询的代码版本吗?换句话说,您可以将带有土耳其语字符的字符串常量推送到pdfContent中吗。这将允许其他人(如我)在不同的条件下尝试Blob.toPDF()。(2) 你能用这些相同的土耳其语字符创建一个html文件,并验证这个文件在浏览器中工作。这是一个没有查询的代码<代码>全局类AccountPDFGenerator{webservice静态void generateInvoicePDF(字符串accountId){//Account Account=[选择Id,帐户名称,其中Id=:accountId];字符串pdfContent='çşĞııÌĞÜİ';附件附件附件PDF=新附件();attachmentPDF.parentId=accountId;attachmentPDF.Name='Invoice.pdf';//attachmentPDF.body=Blob.valueOf(pdfContent);attachmentPDF.body=Blob.topf(pdfContent);//这将创建pdf内容插入attachmentPDF;}
<html><head><meta http-equiv=content-type content=text/html;charset=iso-8859-9></meta></head><body><p>öçşğüıÖÇŞĞÜİ</p></body></html>