.NET C# - MigraDoc - 如何更改文档字符集?

7
我已经搜索了解决此问题的方法,但仍然找不到答案。如果有帮助,将不胜感激。
    Document document = new Document();
    Section section = document.AddSection();

    Paragraph paragraph = section.AddParagraph();

    paragraph.Format.Font.Color = Color.FromCmyk(100, 30, 20, 50);

    paragraph.AddText("ąčęėįųųūū");

    paragraph.Format.Font.Size = 9;
    paragraph.Format.Alignment = ParagraphAlignment.Center; 
    </b>

<...>

在上述示例中,“ąčęėįųųūū”这些字符无法在导出的PDF中显示。

我该如何设置“MigraDoc”字符集?

2个回答

11

只需告诉渲染器创建一个Unicode文档即可:

PdfDocumentRenderer renderer = new PdfDocumentRenderer(true, PdfSharp.Pdf.PdfFontEmbedding.Always);
renderer.Document = document;

PdfDocumentRenderer的第一个参数必须设置为true才能获得Unicode。 请注意,并非所有的True Type字体都包含所有的Unicode字符(但Arial、Verdana等应该可以使用)。

这里提供了一个完整的示例: http://www.pdfsharp.net/wiki/HelloMigraDoc-sample.ashx


非常感谢!运行得非常顺利。 - C.L.
那么,WinANSI是MigraDoc的默认字符集吗? - Sunil
PDF文件具有PDF编码(类似于ANSI)或Unicode编码。 - I liked the old Stack Overflow
我下载了文件到“尝试泰语字体”中。它只对泰语字体无效,但其他语言都可以。 - riseres

4
如果你正在混合使用PDFSharp和MigraDoc,就像我一样(这意味着你有一个PdfSharp对象PdfDocument document和一个MigraDoc对象Document doc,它作为document的一部分呈现),那么一切都不是那么简单。PDFSharp团队提供的示例仅在您单独使用MigraDoc时有效。
所以你应该这样使用:
  • 确保你先渲染MigraDoc文档,然后再将MigraDoc对象呈现到PDF sharp XGraphics gfx
  • 使用hack方法为gfx对象设置编码。

XGraphics gfx = XGraphics.FromPdfPage(page);
        // HACK²
            gfx.MUH = PdfFontEncoding.Unicode;
            gfx.MFEH = PdfFontEmbedding.Always;
        // HACK²
  Document doc = new Document();

  PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(true, PdfFontEmbedding.Always);
        pdfRenderer.Document = doc;
        pdfRenderer.RenderDocument();

  MigraDoc.Rendering.DocumentRenderer docRenderer = new DocumentRenderer(doc);
        docRenderer.PrepareDocument();
        docRenderer.RenderObject(gfx, XUnit.FromCentimeter(5), XUnit.FromCentimeter(10), "12cm", para);

适用于1.5.x-betax版本

 let gfx = XGraphics.FromPdfPage(page)
 gfx.MUH <- PdfFontEncoding.Unicode
 let doc = new Document()

 let pdfRenderer = new PdfDocumentRenderer(true, PdfFontEmbedding.Always)
 pdfRenderer.Document <- doc
 pdfRenderer.RenderDocument()

 let docRenderer = new DocumentRenderer(doc)
 docRenderer.PrepareDocument()
 docRenderer.RenderObject(gfx, XUnit.FromCentimeter 5, XUnit.FromCentimeter 10, "12cm", para)

感谢您提供特殊用例样本的链接,但是四年前的问题显然是关于标准用例的。 - I liked the old Stack Overflow
从来没有注意到你明确指出的区别。感谢你提供的绝佳提示。 - humbleSapiens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接