Save Image to word of HTML reference

2019-09-09 13:19发布

问题:

I export data from my database to word in HTML format from my web application, which works fine for me , i have inserted image into record, the document displays the image also , all works fine for me except when i save that file and send to someone else .. ms word will not find link to that image

Is there anyway to save that image on the document so path issues will not raise

Here is my code : StrTitle contains all the HTML including Image links as well

  string strBody = "<html>" +
            "<body>" + strTitle +
            "</body>" +
            "</html>";
        string fileName = "Policies.doc";
        //object missing = System.Reflection.Missing.Value;
        // You can add whatever you want to add as the HTML and it will be generated as Ms Word docs
        Response.AppendHeader("Content-Type", "application/msword");
        Response.AppendHeader("Content-disposition", "attachment; filename=" + fileName);
        Response.Write(strBody);

回答1:

You can create your html img tag with the image data encoded with base64. This way the image data is contained in the html document it self.

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA..." />



回答2:

You images are probably only available via filesystem (i.e. their src starts with file).

There are a few ways

  1. Make the image available via the internet: make sure their src starts with http and that they are hosted on a web server visible to the downloader (for example, the same server from which they are dowonloading the image)

  2. Use a library, for example see NuGet

  3. You can inline the images as @DevZer0 suggests.

Based on experience

  1. Is the simplest to implement but has some annoyances (the server needs to be available to the user)

  2. Is probably the best way if you do a lot of Word or Office files manipulation.

  3. Can be done and it would solve the problem, although you wouldn't have a full library to support further use cases.



回答3:

Use a word document creation library if you really want to have flexibility in creating doc or docx type files. Like all other popular document formats, the structure needs to be accurate enough for the program that opens up the documents. Like you obviously cannot create a PDF file just by setting content type "application/PDF", if your content is not in a structure that PDF reader expects. Content type would just make the browser identify the extension (incorrectly in this case) and download it as a PDF, but its actually simple text. Same goes for MS word or any other format that requires a particular document structure to be parsed and displyed properly.



回答4:

Since every picture, table is of type shape in Word/Excel/Powerpoint, you could simply add with your program an AlternativeText to your picture, which would actually save a URL of the download URL and when you open, it will retrieve its URL and replace it.

foreach (NetOffice.WordApi.InlineShape s in docWord.InlineShapes)
{
    if (s.Type==NetOffice.WordApi.Enums.WdInlineShapeType.wdInlineShapePicture &&  s.AlternativeText.Contains("|"))
    {
          s.AlternativeText=<your website URL to download the picture>;
    }
}

This would be the C# approach, but would require more time for the picture. If you write a small software for it, which replaces all pictures which contain a s.AlternativeText, you could replace a lot of pictures at same time.

NetOffice.WordApi.InlineShape i=appWord.ActiveDocument.InlineShapes.AddPicture(s.AlternativeText, false, true);

It will look for the picture at that location.

You can do that for your whole document with the 1 loop I wrote you. Means, if it is a picture and contains some AlternativeText, then inside you loop you use the AddPicture function.

Edit: Anoter solution, would be to set a hyperlink to your picture, which would actually go to a FTP server where the picture is located and when you click on the picture, it will open it, means he can replace it by himself(bad, if you have 200 pictures in your document)

Edit according Clipboard:

 string html = Clipboard.GetText(TextDataFormat.Html);
 File.WriteAllText(temporaryFilePath, html);
 NetOffice.WordApi.InlineShape i=appWord.ActiveDocument.InlineShapes.AddPicture(temporaryFilePath, false, true);

The Clipboard in Word is capable to transform a given HTML and when you paste it to transform that table or picture into Word. This works too for Excel, but doesn't for Powerpoint. You could do something like that for your pictures and drag and drop from your database.