支持excel ole对象产生的emf文件

This commit is contained in:
csh 2024-09-20 14:09:02 +08:00
parent 448bbfc7e2
commit 5dc201c1a2
1 changed files with 36 additions and 5 deletions

View File

@ -29,6 +29,7 @@ private
function RToDrawingRange(r: R); function RToDrawingRange(r: R);
function RAlternateContentToRange(r: R); function RAlternateContentToRange(r: R);
function RFootnoteReference(r: R); function RFootnoteReference(r: R);
function RObject(r: R);
function SetLinesAlignment(); function SetLinesAlignment();
function ResetCoordinates(); function ResetCoordinates();
function NewLineRange(): TSPdfLineRange; function NewLineRange(): TSPdfLineRange;
@ -87,7 +88,6 @@ begin
bookmark_flag := false; bookmark_flag := false;
for _,element in elements do for _,element in elements do
begin begin
if not ifObj(element.XmlNode) then continue;
if element.LocalName = "r" then if element.LocalName = "r" then
begin begin
empty_flag := false; empty_flag := false;
@ -120,6 +120,7 @@ begin
else if ifObj(element.Drawing.XmlNode) then {self.}RToDrawingRange(element); else if ifObj(element.Drawing.XmlNode) then {self.}RToDrawingRange(element);
else if ifObj(element.AlternateContent.XmlNode) then {self.}RAlternateContentToRange(element); else if ifObj(element.AlternateContent.XmlNode) then {self.}RAlternateContentToRange(element);
else if ifObj(element.FootnoteReference.XmlNode) then {self.}RFootnoteReference(element); else if ifObj(element.FootnoteReference.XmlNode) then {self.}RFootnoteReference(element);
else if ifObj(element.Object) then {self.}RObject(element);
else if not fld then {self.}RToTextRange(element, bookmark_name); else if not fld then {self.}RToTextRange(element, bookmark_name);
end end
else if element.LocalName = "fldSimple" then else if element.LocalName = "fldSimple" then
@ -519,6 +520,27 @@ begin
// range := new TSPdfParagraphRange(self, page_, docx_components_ware_, ); // range := new TSPdfParagraphRange(self, page_, docx_components_ware_, );
end; end;
function TSPdfParagraphRange.RObject(r: R);
begin
id := r.Object.Shape.Imagedata.Id;
image := {self.}GetImageData(id);
if not image then return;
style := r.Object.Shape.Style;
style_arr := str2array(style, ";");
for _,str in style_arr do
begin
if startsStr("width:", str) then w := strtofloat(str[7:length(str)-2]);
else if startsStr("height:", str) then h := strtofloat(str[8:length(str)-2]);
end
image_range := new TSPdfImageRange();
image_range.Image := image;
image_range.StartX := 0;
image_range.StartY := 0;
image_range.Width := w;
image_range.DynamicHeight := h;
range_array_[length(range_array_)] := image_range;
end;
function TSPdfParagraphRange.GetXYCordinates(): array of real; function TSPdfParagraphRange.GetXYCordinates(): array of real;
begin begin
xml_file := docx_to_pdf_.GetCurrentXmlFile(); xml_file := docx_to_pdf_.GetCurrentXmlFile();
@ -549,12 +571,21 @@ begin
image := docx_components_ware_.Zip().Get(image_path); image := docx_components_ware_.Zip().Get(image_path);
data := image.Data(); data := image.Data();
image_path := docx_to_pdf_.GetCachePath(image_path); image_path := docx_to_pdf_.GetCachePath(image_path);
writeFile(rwBinary(), "", image_path, 0, length(data)-1, data); writeFile(rwBinary(), "", image_path, 0, length(data), data);
image_type := extractFileExt(image_path);
if image_type = ".emf" then
begin
image_old_path := image_path;
image_path := replaceStr(image_path, "emf", "png");
gdipconvimagetype("", image_old_path, "", image_path, "image/png");
image_type := ".png";
fileDelete("", image_old_path);
end
image := nil; image := nil;
case {self.}GetImageFileType(data) of case image_type of
"png": ".png":
image := docx_to_pdf_.GetPdf().LoadPngImageFromFile("", image_path); image := docx_to_pdf_.GetPdf().LoadPngImageFromFile("", image_path);
"jpg": ".jpg", ".jpeg":
image := docx_to_pdf_.GetPdf().LoadJpegImageFromFile("", image_path); image := docx_to_pdf_.GetPdf().LoadJpegImageFromFile("", image_path);
end; end;
fileDelete("", image_path); fileDelete("", image_path);