Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Dynamic page margins #1746

Open
wants to merge 15 commits into
base: 0.1
Choose a base branch
from

Conversation

seahorsepip
Copy link

Makes document definition pageMargins dynamic (based on current page):

var docDefinition = {
  // [left, top, right, bottom] or [horizontal, vertical] or just a number for equal margins
  // E.g. make top margin on first page larger for logo that's already on the paper
  pageMargins: currentPage =>  [ 40, currentPage === 1 ? 160 : 60, 40, 60 ],
};

Non dynamic page margins are still supported:

var docDefinition = {
  // [left, top, right, bottom] or [horizontal, vertical] or just a number for equal margins
  pageMargins: [ 40, 60, 40, 60 ],
};

Changes have been based on comments from Issue 368 with some additonal changes:

  • function return format is the same as non function format
  • use fixPageMargins to validate all return values from pageMargins function

@seahorsepip
Copy link
Author

^ I'll have a look at the tests.

@zubairmoolla
Copy link

zubairmoolla commented Jul 25, 2019

@seahorsepip
Would you know how to also parse the total page count. I'm struggling to define pageMargins according to the last page. Similar to how header and footer accepts a function which parses currentPage & pageCount values.

I would like to achieve the following;

pageMargins : function(currentPage, pageCount) {
	
	// Define pageMargins according to the last page.					
	if ( currentPage == pageCount ){							
		return [25, 120, 25, 240];
	} else {							
		return [25, 120, 25, 25];
	}						
}

@srallapalli
Copy link

Do you have solution for this issue , please provide the updates on this.

@rabraha3
Copy link

rabraha3 commented Oct 3, 2019

These merge conflicts seem pretty small.

@lieuzhenghong
Copy link

lieuzhenghong commented Nov 15, 2020

@seahorsepip It should but doesn't seem to work with horizontal margins, strangely enough.
See the following examples:

// left, top, right, bottom
pageMargins: currentPage => [100, ((currentPage % 2 === 1) ? 0 : 100), 100, 100], // OK
pageMargins: currentPage => [((currentPage % 2 === 1) ? 0 : 100), 100, 100, 100], // doesn't work

Ditto with

// horizontal, vertical
pageMargins: currentPage => [100, ((currentPage % 2 === 1) ? 0 : 100)], // works
pageMargins: currentPage => [((currentPage % 2 === 1) ? 0 : 100), 100], // doesn't

Would love your input as well @liborm85 .

@lieuzhenghong
Copy link

lieuzhenghong commented Nov 15, 2020

This is especially strange since we have already adjusted the availableWidth property in DocumentContext.prototype.initializePage:

this.pageSnapshot().availableWidth =
    this.getCurrentPage().pageSize.width -
    this.getCurrentPage().pageMargins.left -
    this.getCurrentPage().pageMargins.right;

@lieuzhenghong
Copy link

lieuzhenghong commented Dec 29, 2020

@liborm85 Have you taken a look at my examples? Thanks very much!

@seahorsepip
Copy link
Author

seahorsepip commented Dec 29, 2020

Sorry for the late reply, haven't looked at this MR (literally) for years.

I saw this comment about the horizontal margins: #368 (comment)

@lieuzhenghong
Copy link

@seahorsepip I believe I have tried that before

Sorry for the late reply, haven't looked at this MR (literally) for years.

I saw this comment about the horizontal margins: #368 (comment)

I have seen this comment as well but it does not work (see my second comment).

@seahorsepip
Copy link
Author

seahorsepip commented Dec 29, 2020

@lieuzhenghong
But pageMargins might be/is a function if I remember correctly?:

this.pageSnapshot().availableWidth =
    this.getCurrentPage().pageSize.width -
    this.getCurrentPage().pageMargins(* page nr *).left -
    this.getCurrentPage().pageMargins(* page nr *).right;

@albertoLGDev
Copy link

@seahorsepip Would you know how to also parse the total page count. I'm struggling to define pageMargins according to the last page. Similar to how header and footer accepts a function which parses currentPage & pageCount values.

I would like to achieve the following;

pageMargins : function(currentPage, pageCount) {
	
	// Define pageMargins according to the last page.					
	if ( currentPage == pageCount ){							
		return [25, 120, 25, 240];
	} else {							
		return [25, 120, 25, 25];
	}						
}

Has anyone found a solution for this?

Trim added a commit to Trim/pdfmake that referenced this pull request Jul 26, 2022
This function will receive the pageNumber as argument.

This commit is a port of original work of @seahorsepip in pull request bpampuch#1746

This rework is rebuild on 0.3 version, it adds some unit tests for
new helpers and it has integration tests following comments in original
pull request bpampuch#1746.
@Trim Trim mentioned this pull request Jul 26, 2022
Trim added a commit to Trim/pdfmake that referenced this pull request Jul 26, 2022
This function will receive the pageNumber as argument.

This commit is a port of original work of @seahorsepip in pull request bpampuch#1746

This rework is rebuild on 0.3 version, it adds some unit tests for
new helpers and it has integration tests following comments in original
pull request bpampuch#1746.
# for free to join this conversation on GitHub. Already have an account? # to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants