0

我在 Open Office XML 方面不是最出色的,并且一直在努力尝试将图像添加到我在 C#/ASP.Net 中以编程方式生成的 docx 文件中。我正在尝试将徽标放在简历文本块的顶部。当我只使用主要文本部分(resumeText)时,我的程序运行良好,但是当我添加代码以尝试添加图像时,我收到一个错误“文件'..'.docx 不能打开是因为内容有问题。然后详细信息说“未声明的前缀”。我以为我已经从另一个示例中正确复制了 xml,但似乎无法让它工作。谁能看到我哪里出错了?感谢任何人都可以提供的任何帮助。这是相关代码:

protected void ibtDownload_Click(object sender, ImageClickEventArgs e)
{
    string attachmentDir = "~/tempDwnlds/";
    string fileName = m_candidateUser.firstName + "_" + m_candidateUser.lastName + "_" + m_candidateUser.userID.ToString().Substring(0, 6);
    string imagesPath = Server.MapPath("Images/Logo1.jpg");
    CreateNewWordDocument(Server.MapPath(attachmentDir) + fileName + ".docx", Server.HtmlEncode(m_candidate.resume), imagesPath);       
}


public static void CreateNewWordDocument(string document, string resumeText, string imagesPath)
{
    using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(document, WordprocessingDocumentType.Document))
    {
        // Set the content of the document so that Word can open it.
        MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();
        ImagePart newImage = wordDoc.MainDocumentPart.AddImagePart("images/jpeg");
        using (Stream image = new FileStream(imagesPath, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            newImage.FeedData(image);
        }
        SetMainDocumentContent(mainPart, resumeText, imagesPath);
    }
}

// Set the content of MainDocumentPart.
public static void SetMainDocumentContent(MainDocumentPart part, string resumeText, string imagesPath)
{

    string docXml =
     @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?> 
<w:document xmlns:w=""http://schemas.openxmlformats.org/wordprocessingml/2006/main"">
    <w:body>
        <w:p>
          <w:r>
            <w:drawing>
              <wp:inline>
                <wp:extent cx=""3200400"" cy=""704850"" /> <!-- describes the size of the image -->
                <wp:docPr id=""2"" name=""Picture 1"" descr=""filename.JPG"" />
                <a:graphic>
                  <a:graphicData uri=""http://schemas.openxmlformats.org/drawingml/2006/picture"">
                    <pic:pic>
                      <pic:nvPicPr>
                        <pic:cNvPr id=""0"" name=""filename.JPG"" />
                        <pic:cNvPicPr />
                      </pic:nvPicPr>
                      <pic:blipFill>
                        <a:blip r:embed=""" + imagesPath + @""" /> <!-- this is the ID you need to find -->
                        <a:stretch>
                          <a:fillRect />
                        </a:stretch>
                      </pic:blipFill>
                      <pic:spPr>
                        <a:xfrm>
                          <a:ext cx=""3200400"" cy=""704850"" />
                        </a:xfrm>
                        <a:prstGeom prst=""rect"" />
                      </pic:spPr>
                    </pic:pic>
                  </a:graphicData>
                </a:graphic>
              </wp:inline>
            </w:drawing>
          </w:r>
        </w:p>
        <w:p>
            <w:r>
                <w:t xml:space='preserve'>" + WrappableDocXText(resumeText) + @"</w:t>
            </w:r>
        </w:p>
    </w:body>
</w:document>";

    using (Stream stream = part.GetStream())
    {
        byte[] buf = (new UTF8Encoding()).GetBytes(docXml);
        stream.Write(buf, 0, buf.Length);
    }
}

public static string WrappableDocXText(string source)
{
    string nwln = Environment.NewLine;
    return source.Replace(nwln, "<w:br/>");
}
4

1 回答 1

1

RelationshipId 应该在那里而不是 imagesPath @<a:blip r:embed=""" + imagesPath + @""" />你可以得到string relationshipId = mainPart.GetIdOfPart(imagePart)

你可以找到示例代码@msdn链接如何将图片插入到文字处理文档

更新: 您需要在两个地方进行更改 1) 传递图像部分的 id,如下所示SetMainDocumentContent(mainPart, resumeText, mainPart.GetIdOfPart(newImage));

2) 添加命名空间,如下所示

公共静态无效 SetMainDocumentContent(MainDocumentPart 部分,字符串 resumeText,字符串 relId){

        string docXml =   @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?><w:document xmlns:a=""http://schemas.openxmlformats.org/drawingml/2006/main"" xmlns:pic=""http://schemas.openxmlformats.org/drawingml/2006/picture"" xmlns:a14=""http://schemas.microsoft.com/office/drawing/2010/main"" xmlns:wpc=""http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"" xmlns:mc=""http://schemas.openxmlformats.org/markup-compatibility/2006"" xmlns:r=""http://schemas.openxmlformats.org/officeDocument/2006/relationships"" xmlns:m=""http://schemas.openxmlformats.org/officeDocument/2006/math"" xmlns:wp14=""http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing"" xmlns:wp=""http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"" xmlns:w=""http://schemas.openxmlformats.org/wordprocessingml/2006/main"" xmlns:w14=""http://schemas.microsoft.com/office/word/2010/wordml"" xmlns:wpg=""http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"" xmlns:wpi=""http://schemas.microsoft.com/office/word/2010/wordprocessingInk"" xmlns:wne=""http://schemas.microsoft.com/office/word/2006/wordml"" xmlns:wps=""http://schemas.microsoft.com/office/word/2010/wordprocessingShape"">    <w:body>
    <w:p>
      <w:r>
        <w:drawing>
          <wp:inline >
            <wp:extent cx=""3200400"" cy=""704850"" /> <!-- describes the size of the image -->
            <wp:docPr id=""2"" name=""Picture 1"" descr=""filename.JPG"" />
            <a:graphic>
              <a:graphicData uri=""http://schemas.openxmlformats.org/drawingml/2006/picture"">
                <pic:pic>
                  <pic:nvPicPr>
                    <pic:cNvPr id=""0"" name=""filename.JPG"" />
                    <pic:cNvPicPr />
                  </pic:nvPicPr>
                  <pic:blipFill>
                    <a:blip r:embed=""" + relId + @""" /> <!-- this is the ID you need to find -->
                    <a:stretch>
                      <a:fillRect />
                    </a:stretch>
                  </pic:blipFill>
                  <pic:spPr>
                    <a:xfrm>
                      <a:ext cx=""3200400"" cy=""704850"" />
                    </a:xfrm>
                    <a:prstGeom prst=""rect"" />
                  </pic:spPr>
                </pic:pic>
              </a:graphicData>
            </a:graphic>
          </wp:inline>
        </w:drawing>
      </w:r>
    </w:p>
    <w:p>
        <w:r>
            <w:t xml:space='preserve'>" + WrappableDocXText(resumeText) + @"</w:t>
        </w:r>
    </w:p>
</w:body>

";

        using (Stream stream = part.GetStream())
        {
            byte[] buf = (new UTF8Encoding()).GetBytes(docXml);
            stream.Write(buf, 0, buf.Length);
        }
    }
于 2012-04-25T03:47:54.707 回答