parent
9dc7a66b62
commit
1cd72f6247
|
|
@ -44,10 +44,10 @@ private
|
||||||
current_page_: TSPage;
|
current_page_: TSPage;
|
||||||
point_: TSPoint; // 定位坐标点
|
point_: TSPoint; // 定位坐标点
|
||||||
page_array_: array of TSPage;
|
page_array_: array of TSPage;
|
||||||
toc_array_: tableArray;
|
|
||||||
toc_unmacthed_array_: tableArray;
|
|
||||||
sect_ware_: TSSectWare;
|
sect_ware_: TSSectWare;
|
||||||
sect_pr_adapter_: SectPrAdapter;
|
sect_pr_adapter_: SectPrAdapter;
|
||||||
|
toc_array_: tableArray;
|
||||||
|
toc_unmacthed_array_: tableArray;
|
||||||
range_page_number_array_: tableArray;
|
range_page_number_array_: tableArray;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
@ -100,12 +100,15 @@ begin
|
||||||
elements := sect_ware.Elements;
|
elements := sect_ware.Elements;
|
||||||
for _,element in elements do
|
for _,element in elements do
|
||||||
begin
|
begin
|
||||||
|
// if _ = 64 then
|
||||||
|
// if _ = 19 then
|
||||||
|
// println("_ = {}", _);
|
||||||
if element.LocalName = "p" then {self.}TransformP(sect_ware, element);
|
if element.LocalName = "p" then {self.}TransformP(sect_ware, element);
|
||||||
else if element.LocalName = "tbl" then {self.}TransformTbl(sect_ware, element);
|
else if element.LocalName = "tbl" then {self.}TransformTbl(sect_ware, element);
|
||||||
else if element.LocalName = "sdt" then {self.}TransformSdt(sect_ware, element);
|
else if element.LocalName = "sdt" then {self.}TransformSdt(sect_ware, element);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
ProcessNumpages();
|
{self.}ProcessNumpages();
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSDocxToPdf.GetCurrentPoint(): Point;
|
function TSDocxToPdf.GetCurrentPoint(): Point;
|
||||||
|
|
@ -197,7 +200,8 @@ begin
|
||||||
page.SetHeight(sect_ware_.SectPr.PgSz.H);
|
page.SetHeight(sect_ware_.SectPr.PgSz.H);
|
||||||
|
|
||||||
len := length(page_array_);
|
len := length(page_array_);
|
||||||
start := ifString(sect_ware.SectPr.PgNumType.Start) and trystrtoint(sect_ware.SectPr.PgNumType.Start, r) ? r : 0;
|
start := sect_ware.SectPr.PgNumType.Start;
|
||||||
|
println("start = {}, type = {}", start, ifInt(start));
|
||||||
current_page_ := new TSPage();
|
current_page_ := new TSPage();
|
||||||
current_page_.Index := len;
|
current_page_.Index := len;
|
||||||
current_page_.PdfPage := page;
|
current_page_.PdfPage := page;
|
||||||
|
|
@ -278,7 +282,7 @@ begin
|
||||||
{self.}ResetCoordinates(sect_ware);
|
{self.}ResetCoordinates(sect_ware);
|
||||||
|
|
||||||
len := length(page_array_);
|
len := length(page_array_);
|
||||||
start := ifString(sect_ware.SectPr.PgNumType.Start) and trystrtoint(sect_ware.SectPr.PgNumType.Start, r) ? r : 0;
|
start := sect_ware.SectPr.PgNumType.Start;
|
||||||
current_page_ := new TSPage();
|
current_page_ := new TSPage();
|
||||||
current_page_.Index := len;
|
current_page_.Index := len;
|
||||||
current_page_.PdfPage := page;
|
current_page_.PdfPage := page;
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,11 @@ public
|
||||||
function AlignHeight(height: real; surplus: real);
|
function AlignHeight(height: real; surplus: real);
|
||||||
function GetLastPage();
|
function GetLastPage();
|
||||||
function Do();override;
|
function Do();override;
|
||||||
|
function SetVMergeEdge(range: TSPdfCellRange);
|
||||||
|
function GetRegionArr(): array of Region;
|
||||||
|
|
||||||
|
public
|
||||||
|
VMerge;
|
||||||
|
|
||||||
private
|
private
|
||||||
[weakref]docx_to_pdf_: TSDocxToPdf;
|
[weakref]docx_to_pdf_: TSDocxToPdf;
|
||||||
|
|
@ -37,6 +42,7 @@ begin
|
||||||
tbl_pr_ := tbl_pr;
|
tbl_pr_ := tbl_pr;
|
||||||
region_array_ := array();
|
region_array_ := array();
|
||||||
{self.}TSPage := page_;
|
{self.}TSPage := page_;
|
||||||
|
{self.}VMerge := tc_.TcPr.XmlChildVMerge.Val ? tc_.TcPr.XmlChildVMerge.Val : tc_.TcPr.VMerge;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfCellRange.Calc();
|
function TSPdfCellRange.Calc();
|
||||||
|
|
@ -47,6 +53,7 @@ begin
|
||||||
region.RectangleRange.Width := {self.}Width;
|
region.RectangleRange.Width := {self.}Width;
|
||||||
region.RectangleRange.FixedHeight := {self.}FixedHeight;
|
region.RectangleRange.FixedHeight := {self.}FixedHeight;
|
||||||
region.RectangleRange.TSPage := page_;
|
region.RectangleRange.TSPage := page_;
|
||||||
|
region.RectangleRange.TcPr := tc_.TcPr;
|
||||||
region_array_[length(region_array_)] := region;
|
region_array_[length(region_array_)] := region;
|
||||||
|
|
||||||
{self.}EndX := {self.}StartX;
|
{self.}EndX := {self.}StartX;
|
||||||
|
|
@ -118,6 +125,7 @@ begin
|
||||||
region.RectangleRange.Width := {self.}Width;
|
region.RectangleRange.Width := {self.}Width;
|
||||||
region.RectangleRange.DynamicHeight := span;
|
region.RectangleRange.DynamicHeight := span;
|
||||||
region.RectangleRange.TSPage := page_;
|
region.RectangleRange.TSPage := page_;
|
||||||
|
region.RectangleRange.TcPr := tc_.TcPr;
|
||||||
region_array_[length(region_array_)] := region;
|
region_array_[length(region_array_)] := region;
|
||||||
surplus -= span;
|
surplus -= span;
|
||||||
hash[region.RectangleRange.TSPage.Index] := region;
|
hash[region.RectangleRange.TSPage.Index] := region;
|
||||||
|
|
@ -131,6 +139,7 @@ begin
|
||||||
region.RectangleRange.Width := {self.}Width;
|
region.RectangleRange.Width := {self.}Width;
|
||||||
region.RectangleRange.DynamicHeight := surplus;
|
region.RectangleRange.DynamicHeight := surplus;
|
||||||
region.RectangleRange.TSPage := page_;
|
region.RectangleRange.TSPage := page_;
|
||||||
|
region.RectangleRange.TcPr := tc_.TcPr;
|
||||||
region_array_[length(region_array_)] := region;
|
region_array_[length(region_array_)] := region;
|
||||||
hash[region.RectangleRange.TSPage.Index] := region;
|
hash[region.RectangleRange.TSPage.Index] := region;
|
||||||
{self.}EndY := region.RectangleRange.EndY - surplus;
|
{self.}EndY := region.RectangleRange.EndY - surplus;
|
||||||
|
|
@ -146,3 +155,16 @@ function TSPdfCellRange.GetLastPage();
|
||||||
begin
|
begin
|
||||||
return page_;
|
return page_;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TSPdfCellRange.GetRegionArr(): array of Region;
|
||||||
|
begin
|
||||||
|
return region_array_;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSPdfCellRange.SetVMergeEdge(range: TSPdfCellRange);
|
||||||
|
begin
|
||||||
|
rect := region_array_[length(region_array_)-1].RectangleRange;
|
||||||
|
range_rect := range.GetRegionArr();
|
||||||
|
range_rect := range_rect[0].RectangleRange;
|
||||||
|
rect.DynamicHeight += range_rect.DynamicHeight;
|
||||||
|
end;
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ public
|
||||||
function Do();override;
|
function Do();override;
|
||||||
|
|
||||||
private
|
private
|
||||||
function ProcessTrData(grid_cols: array of GridCol; tr: Tr; tbl_pr: TblPr): array of TSPdfAbstractRange;
|
function GetCellMatrix(grid_cols: array of GridColUnitDecorator);
|
||||||
function ResetCoordinates(tbl_pr: TblPr; grid_cols: array of GridCol);
|
function ResetCoordinates(tbl_pr: TblPr; grid_cols: array of GridCol);
|
||||||
function SetTblPr(tbl_pr: TblPr);
|
function SetTblPr(tbl_pr: TblPr);
|
||||||
function SetTblPrByStyleId(var tbl_pr: TblPr; style_id: string);
|
function SetTblPrByStyleId(var tbl_pr: TblPr; style_id: string);
|
||||||
|
|
@ -13,6 +13,7 @@ private
|
||||||
function SetTrPrByStyleId(var tr_pr: TrPr; style_id: string);
|
function SetTrPrByStyleId(var tr_pr: TrPr; style_id: string);
|
||||||
function SetTcPr(var tc_pr: TcPr);
|
function SetTcPr(var tc_pr: TcPr);
|
||||||
function SetTcPrByStyleId(var tc_pr: TcPr; style_id: string);
|
function SetTcPrByStyleId(var tc_pr: TcPr; style_id: string);
|
||||||
|
function SetTblStylePr(var tc_pr: TcPr; type: string);
|
||||||
|
|
||||||
private
|
private
|
||||||
[weakref]docx_to_pdf_: TSDocxToPdf;
|
[weakref]docx_to_pdf_: TSDocxToPdf;
|
||||||
|
|
@ -20,7 +21,7 @@ private
|
||||||
[weakref]sect_ware_: TSSectWare;
|
[weakref]sect_ware_: TSSectWare;
|
||||||
[weakref]table_: Tbl;
|
[weakref]table_: Tbl;
|
||||||
[weakref]page_: TSPage;
|
[weakref]page_: TSPage;
|
||||||
[weakref]range_array_: tableArray;
|
range_array_: tableArray;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfTableRange.Create(docx_to_pdf: TSDocxToPdf; pg: PdfPage; components: Components; sect_ware: TSSectWare; table: Tbl);
|
function TSPdfTableRange.Create(docx_to_pdf: TSDocxToPdf; pg: PdfPage; components: Components; sect_ware: TSSectWare; table: Tbl);
|
||||||
|
|
@ -36,30 +37,30 @@ end;
|
||||||
|
|
||||||
function TSPdfTableRange.Calc();
|
function TSPdfTableRange.Calc();
|
||||||
begin
|
begin
|
||||||
// return;
|
|
||||||
{self.}SetTblPr(table_.TblPr);
|
{self.}SetTblPr(table_.TblPr);
|
||||||
tbl_pr := new TblPrUnitDecorator(table_.TblPr);
|
table_.TblPr := new TblPrUnitDecorator(table_.TblPr);
|
||||||
grid_cols := table_.TblGrid.GridCols();
|
grid_cols := table_.TblGrid.GridCols();
|
||||||
for i:=0 to length(grid_cols)-1 do
|
for i:=0 to length(grid_cols)-1 do
|
||||||
grid_cols[i] := new GridColUnitDecorator(grid_cols[i]);
|
grid_cols[i] := new GridColUnitDecorator(grid_cols[i]);
|
||||||
{self.}ResetCoordinates(tbl_pr, grid_cols);
|
{self.}ResetCoordinates(table_.TblPr, grid_cols);
|
||||||
{self.}EndX := {self.}StartX;
|
{self.}EndX := {self.}StartX;
|
||||||
{self.}EndY := {self.}StartY;
|
{self.}EndY := {self.}StartY;
|
||||||
// 如果是根据内容自适应,应该计算并调整grid_cols的值
|
// 如果是根据内容自适应,应该计算并调整grid_cols的值
|
||||||
trs := table_.Trs();
|
{self.}GetCellMatrix(grid_cols);
|
||||||
for i,tr in trs do
|
|
||||||
range_array_[i] := {self.}ProcessTrData(grid_cols, tr, tbl_pr);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfTableRange.Do();
|
function TSPdfTableRange.Do();
|
||||||
begin
|
begin
|
||||||
for _,row in range_array_ do
|
for _,row in range_array_ do
|
||||||
for _,range in row do
|
for _,range in row do
|
||||||
range.Do();
|
if ifObj(range) then range.Do();
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfTableRange.ProcessTrData(grid_cols: array of GridCol; tr: Tr; tbl_pr: TblPr): array of TSPdfAbstractRange;
|
function TSPdfTableRange.GetCellMatrix(grid_cols: array of GridColUnitDecorator);
|
||||||
begin
|
begin
|
||||||
|
trs := table_.Trs();
|
||||||
|
for i,tr in trs do
|
||||||
|
begin
|
||||||
{self.}SetTrPr(tr.TrPr);
|
{self.}SetTrPr(tr.TrPr);
|
||||||
tr_pr := new TrPrUnitDecorator(tr.TrPr);
|
tr_pr := new TrPrUnitDecorator(tr.TrPr);
|
||||||
height := tr_pr.TrHeight.Val;
|
height := tr_pr.TrHeight.Val;
|
||||||
|
|
@ -67,34 +68,61 @@ begin
|
||||||
tc_y := {self.}EndY;
|
tc_y := {self.}EndY;
|
||||||
tc_h := height;
|
tc_h := height;
|
||||||
max_height := 0;
|
max_height := 0;
|
||||||
cell_range_array := array();
|
|
||||||
tcs := tr.Tcs();
|
tcs := tr.Tcs();
|
||||||
for i,tc in tcs do
|
pos := 0;
|
||||||
|
for j,tc in tcs do
|
||||||
begin
|
begin
|
||||||
cell_range := new TSPdfCellRange(docx_to_pdf_, page_, docx_components_ware_, sect_ware_, tc, tbl_pr);
|
if i = 0 then {self.}SetTblStylePr(tc.TcPr, "firstRow");
|
||||||
|
cell_range := new TSPdfCellRange(docx_to_pdf_, page_, docx_components_ware_, sect_ware_, tc, table_.TblPr);
|
||||||
cell_range.StartX := tc_x;
|
cell_range.StartX := tc_x;
|
||||||
cell_range.StartY := tc_y;
|
cell_range.StartY := tc_y;
|
||||||
cell_range.Width := grid_cols[i].W;
|
|
||||||
cell_range.FixedHeight := tc_h;
|
cell_range.FixedHeight := tc_h;
|
||||||
if i = length(tcs)-1 and i <> length(grid_cols)-1 then
|
cell_range.Width := grid_cols[pos].W;
|
||||||
begin
|
range_array_[i][pos] := cell_range;
|
||||||
for j:=i+1 to length(grid_cols)-1 do
|
grid_span := new GridSpanUnitDecorator(tc.TcPr.GridSpan);
|
||||||
cell_range.Width += grid_cols[j].W;
|
pos++;
|
||||||
end
|
for k:=grid_span.Val-1 downto 1 do
|
||||||
|
cell_range.Width += grid_cols[pos++].W;
|
||||||
cell_range.Calc();
|
cell_range.Calc();
|
||||||
tc_x += grid_cols[i].W;
|
tc_x += cell_range.Width;
|
||||||
if cell_range.DynamicHeight > max_height then max_height := cell_range.DynamicHeight;
|
if cell_range.DynamicHeight > max_height then max_height := cell_range.DynamicHeight;
|
||||||
cell_range_array[length(cell_range_array)] := cell_range;
|
|
||||||
end
|
end
|
||||||
if tc_h > max_height then max_height := tc_h;
|
if tc_h > max_height then max_height := tc_h;
|
||||||
surplus := max_height - ({self.}EndY - sect_ware_.SectPr.PgMar.Bottom);
|
surplus := max_height - ({self.}EndY - sect_ware_.SectPr.PgMar.Bottom);
|
||||||
for _,range in cell_range_array do
|
arr := range_array_[i];
|
||||||
|
for _,range in arr do
|
||||||
begin
|
begin
|
||||||
range.AlignHeight(max_height, surplus);
|
range.AlignHeight(max_height, surplus);
|
||||||
{self.}EndY := range.EndY; // 理论上每个range.EndY都是一个值
|
{self.}EndY := range.EndY; // 理论上每个range.EndY都是一个值
|
||||||
page_ := range.GetLastPage();
|
page_ := range.GetLastPage();
|
||||||
end
|
end
|
||||||
return cell_range_array;
|
end
|
||||||
|
for i:=length(range_array_)-1 downto 0 do
|
||||||
|
begin
|
||||||
|
for j:=0 to length(range_array_[i])-1 do
|
||||||
|
begin
|
||||||
|
range := range_array_[i][j];
|
||||||
|
if ifnil(range) then continue;
|
||||||
|
if range.VMerge then
|
||||||
|
begin
|
||||||
|
if range.VMerge = "restart" then
|
||||||
|
begin
|
||||||
|
break;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
range_array_[i-1][j].SetVMergeEdge(range);
|
||||||
|
range_array_[i][j] := nil;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TSPdfTableRange.SetTblStylePr(var tc_pr: TcPr; type: string);
|
||||||
|
begin
|
||||||
|
{self.}SetTcPr(tc_pr);
|
||||||
|
tbl_style_pr := docx_components_ware_.GetTblStylePrByType(table_.TblPr.TblStyle.Val, type);
|
||||||
|
if tbl_style_pr then tc_pr.Copy(tbl_style_pr.TcPr);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfTableRange.ResetCoordinates(tbl_pr: TblPr; grid_cols: array of GridCol);
|
function TSPdfTableRange.ResetCoordinates(tbl_pr: TblPr; grid_cols: array of GridCol);
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
type TSPdfRectangleRange = class(TSPdfBasicRange)
|
type TSPdfRectangleRange = class(TSPdfBasicRange)
|
||||||
|
uses TSColorToolKit;
|
||||||
public
|
public
|
||||||
function Create();
|
function Create();
|
||||||
function Do();override;
|
function Do();override;
|
||||||
|
public
|
||||||
|
TcPr: TcPr;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSPdfRectangleRange.Create();
|
function TSPdfRectangleRange.Create();
|
||||||
|
|
@ -14,8 +16,16 @@ function TSPdfRectangleRange.Do();override;
|
||||||
begin
|
begin
|
||||||
// {self.}Page.SetRGBStroke(1.0, 0.0, 0.0);
|
// {self.}Page.SetRGBStroke(1.0, 0.0, 0.0);
|
||||||
// println("page = {}, endx = {}, endy = {}, DynamicHeight = {}, Width = {}", {self.}Page, {self.}EndX, {self.}EndY, {self.}DynamicHeight, {self.}Width);
|
// println("page = {}, endx = {}, endy = {}, DynamicHeight = {}, Width = {}", {self.}Page, {self.}EndX, {self.}EndY, {self.}DynamicHeight, {self.}Width);
|
||||||
|
if {self.}TcPr.Shd.Fill then
|
||||||
|
begin
|
||||||
|
[r, g, b] := TSColorToolKit.HexToRGB({self.}TcPr.Shd.Fill);
|
||||||
|
{self.}TSPage.PdfPage.SetRGBFill(r/255, g/255, b/255);
|
||||||
|
{self.}TSPage.PdfPage.Rectangle({self.}EndX, {self.}EndY - {self.}DynamicHeight, {self.}Width, {self.}DynamicHeight);
|
||||||
|
{self.}TSPage.PdfPage.Fill();
|
||||||
|
{self.}TSPage.PdfPage.SetRGBFill(0, 0, 0);
|
||||||
|
end
|
||||||
{self.}TSPage.PdfPage.SetGrayStroke(0.5);
|
{self.}TSPage.PdfPage.SetGrayStroke(0.5);
|
||||||
{self.}TSPage.PdfPage.SetLineWidth(0.5);
|
{self.}TSPage.PdfPage.SetLineWidth(0.25);
|
||||||
{self.}TSPage.PdfPage.Rectangle({self.}EndX, {self.}EndY - {self.}DynamicHeight, {self.}Width, {self.}DynamicHeight);
|
{self.}TSPage.PdfPage.Rectangle({self.}EndX, {self.}EndY - {self.}DynamicHeight, {self.}Width, {self.}DynamicHeight);
|
||||||
{self.}TSPage.PdfPage.Stroke();
|
{self.}TSPage.PdfPage.Stroke();
|
||||||
{self.}TSPage.PdfPage.SetGrayStroke(0);
|
{self.}TSPage.PdfPage.SetGrayStroke(0);
|
||||||
|
|
|
||||||
|
|
@ -5,17 +5,20 @@ public
|
||||||
function GetStylesAdapter(): StylesAdapter;
|
function GetStylesAdapter(): StylesAdapter;
|
||||||
function GetDocumentRelsAdapter(): RelationShipsAdapter;
|
function GetDocumentRelsAdapter(): RelationShipsAdapter;
|
||||||
function GetNumberingWare(): TSNumberingWare;
|
function GetNumberingWare(): TSNumberingWare;
|
||||||
|
function GetTblStylePrByType(style_id: string; type: string): TblStylePr;
|
||||||
|
|
||||||
private
|
private
|
||||||
styles_deserialize_flag_;
|
styles_deserialize_flag_;
|
||||||
styles_adapter_;
|
styles_adapter_;
|
||||||
document_rels_adapter_;
|
document_rels_adapter_;
|
||||||
numbering_ware_;
|
numbering_ware_;
|
||||||
|
tbl_style_pr_hash_;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSDocxComponentsWare.Create();
|
function TSDocxComponentsWare.Create();
|
||||||
begin
|
begin
|
||||||
class(Components).Create();
|
class(Components).Create();
|
||||||
|
tbl_style_pr_hash_ := array();
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TSDocxComponentsWare.GetStyles(): Styles;
|
function TSDocxComponentsWare.GetStyles(): Styles;
|
||||||
|
|
@ -50,3 +53,13 @@ begin
|
||||||
return numbering_ware_;
|
return numbering_ware_;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TSDocxComponentsWare.GetTblStylePrByType(style_id: string; type: string): TblStylePr;
|
||||||
|
begin
|
||||||
|
if tbl_style_pr_hash_[style_id][type] then return tbl_style_pr_hash_[style_id][type];
|
||||||
|
styles_adapter := {self.}GetStylesAdapter();
|
||||||
|
style := styles_adapter.GetStyleByStyleId(style_id);
|
||||||
|
style := new StyleAdapter(style);
|
||||||
|
tbl_style_pr := style.GetTblStylePrByType(type);
|
||||||
|
tbl_style_pr_hash_[style_id][type] := tbl_style_pr;
|
||||||
|
return tbl_style_pr;
|
||||||
|
end;
|
||||||
|
|
|
||||||
|
|
@ -30,5 +30,5 @@ end;
|
||||||
|
|
||||||
function TSSectWare.AddElement(element: tslobj);
|
function TSSectWare.AddElement(element: tslobj);
|
||||||
begin
|
begin
|
||||||
Elements[length(Elements)] := element;
|
{self.}Elements[length({self.}Elements)] := element;
|
||||||
end;
|
end;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue