Author Topic: Displaying PDF Page Size in Windows Explorer  (Read 34241 times)

0 Members and 1 Guest are viewing this topic.

nightslayer23

  • Newbie
  • *
  • Posts: 94
Displaying PDF Page Size in Windows Explorer
« on: September 09, 2015, 08:42:21 AM »
Hi guys,

Would you happen to know a way to get windows explorer to display the PDF page size in Windows Explorer Details view?

nightslayer23

  • Newbie
  • *
  • Posts: 94
Re: Displaying PDF Page Size in Windows Explorer
« Reply #1 on: September 09, 2015, 08:43:14 AM »
Getting the number of page for a multipage PDF would also be ideal..

RTT

  • Administrator
  • *****
  • Posts: 907
Re: Displaying PDF Page Size in Windows Explorer
« Reply #2 on: September 10, 2015, 12:03:47 AM »
PDFs can be formed by pages with different sizes, in the same document, so I'm going to assume the PDFs in question are not in this situation and/or knowing the page size of the first page is sufficient to your needs.

First you need to create a custom field, that will hold the page size, in order to cache the value. Calculating this on the fly is, because of the time it takes, not suited to the Shell responsiveness requirements.
This a done using the PDF-ShellTools manager, custom fields editor, for the property handler extension. There is only the need to add a new custom field and name it with appropriated label (e.g. "page size") and name (e.g. PageSize). Check the first attached screenshot for details.
You may also click the advanced button and define this new metadata field as read only.
Click the "apply changes" button to register this new property in the system. It is now possible to set visible the "page size" column in the details view of the Windows Explorer, but it will show empty because we first need to fill it.

To fill this new metadata property we will use a My Scripts script.
Code: [Select]
var ProgressBar = pdfe.ProgressBar;
ProgressBar.max = pdfe.SelectedFiles.Count;

for (var i = 0; i < pdfe.SelectedFiles.Count; i++) {
    ProgressBar.position = i + 1;
    var file = pdfe.SelectedFiles(i);
    var Page = file.Pages(0);
    if (Page) {
        var w = Math.min(Page.Width, Page.Height);
        var h = Math.max(Page.Width, Page.Height);
        var PSizeStr = w.toFixed() + 'x' + h.toFixed();
        var FileMetadata = file.Metadata;
        if (FileMetadata.PageSize !== PSizeStr) {
            FileMetadata.PageSize = PSizeStr;
            if (FileMetadata.CommitChanges()) {
                pdfe.echo(file.Filename + ' : (' + PSizeStr + ') [OK]');

            } else {
                pdfe.echo(file.Filename + ' [commit changes failed]', 0xFF0000);
            }
        } else {
            pdfe.echo(file.Filename + ' : (' + PSizeStr + ') [already set]');
        }
    }
}
pdfe.echo("Done");

I've attached it bellow, so you just need to unzip and import it, from the manager, context menu extension, my scripts functionality.

Now you just need to run this script on all the PDFs you need to know the page size, to have these PDFs metadata to include a new PageSize named property that hold the document first page size in the Width x Height [millimeters] format (the script can be easily changed to use different units).

All these processed PDFs will now show in the Windows Explorer details view (if the "page size" column is set visible), the value that you can now use to easily sort/manage these PDFs.

For new/not yet process PDFs, you just need to run the script on these PDFs too.
Let me know if you are missing to understand any of the steps.

Regarding your second question, about showing the number of pages for PDF documents. After having the PDF-ShellTools installed, the Windows property system "pages" column will show the number of pages for PDFs too, as it is one of the PDF metadata properties ready available from the PDF-ShellTools PDF property handler shell extension. You just need to set visible that column in the Windows Explorer details view.

P. Allan

  • Newbie
  • *
  • Posts: 3
Re: Displaying PDF Page Size in Windows Explorer
« Reply #3 on: September 10, 2015, 08:14:52 PM »
Very nice example for a newbie like me with scripts.  :)

You describe, that it is easy to change units.

How is that done?

Regards
Peder

RTT

  • Administrator
  • *****
  • Posts: 907
Re: Displaying PDF Page Size in Windows Explorer
« Reply #4 on: September 10, 2015, 10:52:30 PM »
You describe, that it is easy to change units.

How is that done?

There's just the need to add the relevant units conversion math to the script. In the script we have the page width and height in millimeters (the default units returned from the Page object, width and height properties).
From the above script, the relevant code lines are:
Code: [Select]
var w = Math.min(Page.Width, Page.Height);
var h = Math.max(Page.Width, Page.Height);
var PSizeStr = w.toFixed() + 'x' + h.toFixed();

So, let's say we want to have our "width x height" value in inches. The code becomes:
Code: [Select]
//1 inch = 25.4 mm
var w = Math.min(Page.Width, Page.Height) / 25.4;
var h = Math.max(Page.Width, Page.Height) / 25.4;
//Decimals now matter, so better specify the number of significant digits when converting to string
var PSizeStr = w.toPrecision(3) + 'x' + h.toPrecision(3);

And the script will now fill our custom page size property with values in inches. ;)

nightslayer23

  • Newbie
  • *
  • Posts: 94
Re: Displaying PDF Page Size in Windows Explorer
« Reply #5 on: May 23, 2017, 05:24:32 AM »
Sometimes the PDFs I'm needing to look at are actually mixed sizes..

Is there a way to look at each page and then list the page sizes it finds?

I've managed to get the output to display as their A1,A2,A4 etc.. but it doesn't alert or display a multi-sized file.

This would be ultra handy if possible..

nightslayer23

  • Newbie
  • *
  • Posts: 94
Re: Displaying PDF Page Size in Windows Explorer
« Reply #6 on: May 24, 2017, 03:38:32 AM »
How do we get it to display the dimensions in the correct orientation..?

I want say, A1's that are Portrait to display as: 594 x 841 and A1's that are Landscape to display as 841 x 594..

RTT

  • Administrator
  • *****
  • Posts: 907
Re: Displaying PDF Page Size in Windows Explorer
« Reply #7 on: May 24, 2017, 11:38:24 PM »
Sometimes the PDFs I'm needing to look at are actually mixed sizes..

Is there a way to look at each page and then list the page sizes it finds?

I've managed to get the output to display as their A1,A2,A4 etc.. but it doesn't alert or display a multi-sized file.

This would be ultra handy if possible..
And show this info in a Windows Explorer column? How to format such data?

RTT

  • Administrator
  • *****
  • Posts: 907
Re: Displaying PDF Page Size in Windows Explorer
« Reply #8 on: May 24, 2017, 11:40:40 PM »
How do we get it to display the dimensions in the correct orientation..?

I want say, A1's that are Portrait to display as: 594 x 841 and A1's that are Landscape to display as 841 x 594..
In the above script, change the lines
var w = Math.min(Page.Width, Page.Height);
var h = Math.max(Page.Width, Page.Height);

to
var w = Page.Width;
var h = Page.Height;


nightslayer23

  • Newbie
  • *
  • Posts: 94
Re: Displaying PDF Page Size in Windows Explorer
« Reply #9 on: May 25, 2017, 06:08:04 AM »
Quote
And show this info in a Windows Explorer column? How to format such data?
Commas?
A1,A4,A3 etc.

nightslayer23

  • Newbie
  • *
  • Posts: 94
Re: Displaying PDF Page Size in Windows Explorer
« Reply #10 on: May 25, 2017, 06:17:51 AM »
How do we get it to display the dimensions in the correct orientation..?

I want say, A1's that are Portrait to display as: 594 x 841 and A1's that are Landscape to display as 841 x 594..
In the above script, change the lines
var w = Math.min(Page.Width, Page.Height);
var h = Math.max(Page.Width, Page.Height);

to
var w = Page.Width;
var h = Page.Height;


thank you. I did do this already, kind of worked. Sometimes it works, sometimes not. Must be some glitch where if a pdf has been rotated to landscape, it takes on the original length and width and not the update rotation. I wanted to be able to differentiate Landscape and Portrait files from one another but it doesn't seem possible for some reason.

RTT

  • Administrator
  • *****
  • Posts: 907
Re: Displaying PDF Page Size in Windows Explorer
« Reply #11 on: May 26, 2017, 12:46:26 AM »
Quote
And show this info in a Windows Explorer column? How to format such data?
Commas?
A1,A4,A3 etc.
A quick modification of the included "List paper sizes used" sample script for you to play.
Code: [Select]
STDSizes=[
{'Size': 'A0','width':841,'height':1189},
{'Size': 'A1','width':594,'height':841},
{'Size': 'A2','width':420,'height':594},
{'Size': 'A3','width':297,'height':420},
{'Size': 'A4','width':210,'height':297},
{'Size': 'A5','width':148,'height':210},
{'Size': 'A6','width':105,'height':148},
{'Size': 'A7','width':74,'height':105},
{'Size': 'A8','width':52,'height':74},
{'Size': 'A9','width':37,'height':52},
{'Size': 'A10','width':26,'height':37},

{'Size': 'B0','width':1000,'height':1414},
{'Size': 'B1','width':707,'height':1000},
{'Size': 'B2','width':500,'height':707},
{'Size': 'B3','width':353,'height':500},
{'Size': 'B4','width':250,'height':353},
{'Size': 'B5','width':176,'height':250},
{'Size': 'B6','width':125,'height':176},
{'Size': 'B7','width':88,'height':125},
{'Size': 'B8','width':62,'height':88},
{'Size': 'B9','width':44,'height':62},
{'Size': 'B10','width':31,'height':44},

{'Size': 'C0','width':917,'height':1297},
{'Size': 'C1','width':648,'height':917},
{'Size': 'C2','width':458,'height':648},
{'Size': 'C3','width':324,'height':458},
{'Size': 'C4','width':229,'height':324},
{'Size': 'C5','width':162,'height':229},
{'Size': 'C6','width':114,'height':162},
{'Size': 'C7','width':81,'height':114},
{'Size': 'C8','width':57,'height':81},
{'Size': 'C9','width':40,'height':57},
{'Size': 'C10','width':28,'height':40},

{'Size': '4A0','width':1682,'height':2378},
{'Size': '2A0','width':1189,'height':1682},

{'Size': 'Letter','width':215.9,'height':279.4},
{'Size': 'Legal','width':215.9,'height':355.6},
{'Size': 'Junior Legal','width':203.2,'height':127},
//{'Size': 'Ledger','width':432,'height':279},
{'Size': 'Tabloid','width':279,'height':432},

{'Size': 'PA4','width':210,'height':280},

{'Size': 'Arch A','width':229,'height':305},
{'Size': 'Arch B','width':305,'height':457},
{'Size': 'Arch C','width':457,'height':610},                           
{'Size': 'Arch D','width':610,'height':914},
{'Size': 'Arch E','width':914,'height':1219},
{'Size': 'Arch E1','width':762,'height':1067},
{'Size': 'Arch E2','width':660,'height':965},
{'Size': 'Arch E3','width':686,'height':991},

{'Size': '2R','width':64,'height':89},
{'Size': 'LD,DSC','width':89,'height':119},
{'Size': '3R,L','width':89,'height':127},
{'Size': 'LW','width':89,'height':133},
{'Size': 'KGD','width':102,'height':136},
{'Size': '4R,KG','width':102,'height':152},
{'Size': '2LD,DSCW','width':127,'height':169},
{'Size': '5R,2L','width':127,'height':178},
{'Size': '2LW','width':127,'height':190},
{'Size': '6R','width':152,'height':203},
{'Size': '8R,6P','width':203,'height':254},
{'Size': 'S8R,6PW','width':203,'height':305},
{'Size': '11R','width':279,'height':356},
{'Size': 'A3+,Super B','width':330,'height':483}
];

STDSizes.sort(function(a, b) {
    return (a.height > b.height) ? -1 : ((b.height > a.height) ? 1 : 0);
});

var ProgressBar = pdfe.ProgressBar;
ProgressBar.max = pdfe.SelectedFiles.Count;

var eps = 1; //size compare tolerance [mm]
for (var i = 0; i < pdfe.SelectedFiles.Count; i++) {
    ProgressBar.position = i + 1;
    pdfe.echo('Processing ' + pdfe.SelectedFiles(i).Filename);
    var PaperSizes = {};
    var Pages = pdfe.SelectedFiles(i).Pages;
    for (var ii = 0; ii < Pages.Count; ii++) {
        var Page = Pages(ii);
        if (Page) {
            var w = Math.min(Page.Width, Page.Height);
            var h = Math.max(Page.Width, Page.Height);
            for (var n = 0; n < STDSizes.length; n++) {
                hdif = h - STDSizes[n].height;
                if (Math.abs(hdif) < eps && Math.abs(w - STDSizes[n].width) < eps) {
                    SizeID = STDSizes[n].Size;
                    if (!PaperSizes[SizeID]) {
                        var PaperSize = clone(STDSizes[n]);
//                        PaperSize.Size += ' (' + PaperSize.width + 'x' + PaperSize.height + ')';
                        PaperSize['count'] = 1;
                        PaperSizes[SizeID] = PaperSize;
                    } else {
                        PaperSizes[SizeID].count += 1;
                    }
                    break;
                } else if (hdif > 0) { //stop search if page height>current stdSize height
                    var SizeID = w.toFixed() + 'x' + h.toFixed();
                    var PaperSize = {
                        'Size': SizeID,
                        'width': Math.floor(w * 10) / 10,
                        'height': Math.floor(h * 10) / 10,
                        'notStd': true
                    }

                    STDSizes.splice(n, 0, PaperSize);
                    PaperSize['count'] = 1;
                    PaperSizes[SizeID] = PaperSize;
                    break;
                }
            }
        }
    }

    //sort descending by page size count. Standard sizes and higher heights first
    PaperSizes = sortObj(PaperSizes, function(a, b) {
        if (a['notStd'] == b['notStd']) {
            return (a.count > b.count) ? -1 : ((b.count > a.count) ? 1 : (a.height > b.height) ? -1 : ((b.height > a.height) ? 1 : 0));
        } else if (!a['notStd']) return -1;
        return 1;
    });

    //output results
    pdfe.echo(pdfe.SelectedFiles(i).Filename, 0, 2);
    pdfe.echo(' Size details:');
    for (var n = 0; n < PaperSizes.length; n++) {
        pdfe.echo('   ' + PaperSizes[n].Size + ' = ' + PaperSizes[n].count);
    }

    var sizesStr='';
    for (var n = 0; n < PaperSizes.length; n++) {
    sizesStr=sizesStr+PaperSizes[n].Size+',';   
    }
    pdfe.echo(' Sizes list: ' + sizesStr.substr(0,sizesStr.length-1));   
   
}

pdfe.echo("Done");

//======================================================================
function clone(obj) {
    if (obj == null || typeof(obj) != 'object') return obj;
    var temp = new obj.constructor();
    for (var key in obj)
    temp[key] = clone(obj[key]);
    return temp;
}

function sortObj(object, sortFunc) {
    var rv = [];
    for (var k in object) {
        if (object.hasOwnProperty(k)) {
            rv.push(object[k]);
        }
    }
    rv.sort(sortFunc);
    return rv;
}

RTT

  • Administrator
  • *****
  • Posts: 907
Re: Displaying PDF Page Size in Windows Explorer
« Reply #12 on: May 26, 2017, 01:00:25 AM »
Sometimes it works, sometimes not. Must be some glitch where if a pdf has been rotated to landscape, it takes on the original length and width and not the update rotation. I wanted to be able to differentiate Landscape and Portrait files from one another but it doesn't seem possible for some reason.
Indeed, the page width/height properties are not taking into account the page rotation! I will have this fixed in the next release.
Meanwhile, you can also check the page rotation:

        if (Page.Rotation == 90 || Page.Rotation == 270) {
            var w = Page.Height;
            var h = Page.Width;
        } else {
            var w = Page.Width;
            var h = Page.Height;
        }

nightslayer23

  • Newbie
  • *
  • Posts: 94
Re: Displaying PDF Page Size in Windows Explorer
« Reply #13 on: May 29, 2017, 03:42:27 AM »
Quote
And show this info in a Windows Explorer column? How to format such data?
Commas?
A1,A4,A3 etc.
A quick modification of the included "List paper sizes used" sample script for you to play.
Code: [Select]
STDSizes=[
{'Size': 'A0','width':841,'height':1189},
{'Size': 'A1','width':594,'height':841},
{'Size': 'A2','width':420,'height':594},
{'Size': 'A3','width':297,'height':420},
{'Size': 'A4','width':210,'height':297},
{'Size': 'A5','width':148,'height':210},
{'Size': 'A6','width':105,'height':148},
{'Size': 'A7','width':74,'height':105},
{'Size': 'A8','width':52,'height':74},
{'Size': 'A9','width':37,'height':52},
{'Size': 'A10','width':26,'height':37},

{'Size': 'B0','width':1000,'height':1414},
{'Size': 'B1','width':707,'height':1000},
{'Size': 'B2','width':500,'height':707},
{'Size': 'B3','width':353,'height':500},
{'Size': 'B4','width':250,'height':353},
{'Size': 'B5','width':176,'height':250},
{'Size': 'B6','width':125,'height':176},
{'Size': 'B7','width':88,'height':125},
{'Size': 'B8','width':62,'height':88},
{'Size': 'B9','width':44,'height':62},
{'Size': 'B10','width':31,'height':44},

{'Size': 'C0','width':917,'height':1297},
{'Size': 'C1','width':648,'height':917},
{'Size': 'C2','width':458,'height':648},
{'Size': 'C3','width':324,'height':458},
{'Size': 'C4','width':229,'height':324},
{'Size': 'C5','width':162,'height':229},
{'Size': 'C6','width':114,'height':162},
{'Size': 'C7','width':81,'height':114},
{'Size': 'C8','width':57,'height':81},
{'Size': 'C9','width':40,'height':57},
{'Size': 'C10','width':28,'height':40},

{'Size': '4A0','width':1682,'height':2378},
{'Size': '2A0','width':1189,'height':1682},

{'Size': 'Letter','width':215.9,'height':279.4},
{'Size': 'Legal','width':215.9,'height':355.6},
{'Size': 'Junior Legal','width':203.2,'height':127},
//{'Size': 'Ledger','width':432,'height':279},
{'Size': 'Tabloid','width':279,'height':432},

{'Size': 'PA4','width':210,'height':280},

{'Size': 'Arch A','width':229,'height':305},
{'Size': 'Arch B','width':305,'height':457},
{'Size': 'Arch C','width':457,'height':610},                           
{'Size': 'Arch D','width':610,'height':914},
{'Size': 'Arch E','width':914,'height':1219},
{'Size': 'Arch E1','width':762,'height':1067},
{'Size': 'Arch E2','width':660,'height':965},
{'Size': 'Arch E3','width':686,'height':991},

{'Size': '2R','width':64,'height':89},
{'Size': 'LD,DSC','width':89,'height':119},
{'Size': '3R,L','width':89,'height':127},
{'Size': 'LW','width':89,'height':133},
{'Size': 'KGD','width':102,'height':136},
{'Size': '4R,KG','width':102,'height':152},
{'Size': '2LD,DSCW','width':127,'height':169},
{'Size': '5R,2L','width':127,'height':178},
{'Size': '2LW','width':127,'height':190},
{'Size': '6R','width':152,'height':203},
{'Size': '8R,6P','width':203,'height':254},
{'Size': 'S8R,6PW','width':203,'height':305},
{'Size': '11R','width':279,'height':356},
{'Size': 'A3+,Super B','width':330,'height':483}
];

STDSizes.sort(function(a, b) {
    return (a.height > b.height) ? -1 : ((b.height > a.height) ? 1 : 0);
});

var ProgressBar = pdfe.ProgressBar;
ProgressBar.max = pdfe.SelectedFiles.Count;

var eps = 1; //size compare tolerance [mm]
for (var i = 0; i < pdfe.SelectedFiles.Count; i++) {
    ProgressBar.position = i + 1;
    pdfe.echo('Processing ' + pdfe.SelectedFiles(i).Filename);
    var PaperSizes = {};
    var Pages = pdfe.SelectedFiles(i).Pages;
    for (var ii = 0; ii < Pages.Count; ii++) {
        var Page = Pages(ii);
        if (Page) {
            var w = Math.min(Page.Width, Page.Height);
            var h = Math.max(Page.Width, Page.Height);
            for (var n = 0; n < STDSizes.length; n++) {
                hdif = h - STDSizes[n].height;
                if (Math.abs(hdif) < eps && Math.abs(w - STDSizes[n].width) < eps) {
                    SizeID = STDSizes[n].Size;
                    if (!PaperSizes[SizeID]) {
                        var PaperSize = clone(STDSizes[n]);
//                        PaperSize.Size += ' (' + PaperSize.width + 'x' + PaperSize.height + ')';
                        PaperSize['count'] = 1;
                        PaperSizes[SizeID] = PaperSize;
                    } else {
                        PaperSizes[SizeID].count += 1;
                    }
                    break;
                } else if (hdif > 0) { //stop search if page height>current stdSize height
                    var SizeID = w.toFixed() + 'x' + h.toFixed();
                    var PaperSize = {
                        'Size': SizeID,
                        'width': Math.floor(w * 10) / 10,
                        'height': Math.floor(h * 10) / 10,
                        'notStd': true
                    }

                    STDSizes.splice(n, 0, PaperSize);
                    PaperSize['count'] = 1;
                    PaperSizes[SizeID] = PaperSize;
                    break;
                }
            }
        }
    }

    //sort descending by page size count. Standard sizes and higher heights first
    PaperSizes = sortObj(PaperSizes, function(a, b) {
        if (a['notStd'] == b['notStd']) {
            return (a.count > b.count) ? -1 : ((b.count > a.count) ? 1 : (a.height > b.height) ? -1 : ((b.height > a.height) ? 1 : 0));
        } else if (!a['notStd']) return -1;
        return 1;
    });

    //output results
    pdfe.echo(pdfe.SelectedFiles(i).Filename, 0, 2);
    pdfe.echo(' Size details:');
    for (var n = 0; n < PaperSizes.length; n++) {
        pdfe.echo('   ' + PaperSizes[n].Size + ' = ' + PaperSizes[n].count);
    }

    var sizesStr='';
    for (var n = 0; n < PaperSizes.length; n++) {
    sizesStr=sizesStr+PaperSizes[n].Size+',';   
    }
    pdfe.echo(' Sizes list: ' + sizesStr.substr(0,sizesStr.length-1));   
   
}

pdfe.echo("Done");

//======================================================================
function clone(obj) {
    if (obj == null || typeof(obj) != 'object') return obj;
    var temp = new obj.constructor();
    for (var key in obj)
    temp[key] = clone(obj[key]);
    return temp;
}

function sortObj(object, sortFunc) {
    var rv = [];
    for (var k in object) {
        if (object.hasOwnProperty(k)) {
            rv.push(object[k]);
        }
    }
    rv.sort(sortFunc);
    return rv;
}

At what point do I modify this sorry to add the information to the metadata? I am trying but struggling  :S

RTT

  • Administrator
  • *****
  • Posts: 907
Re: Displaying PDF Page Size in Windows Explorer
« Reply #14 on: May 29, 2017, 11:52:33 PM »
At what point do I modify this sorry to add the information to the metadata? I am trying but struggling  :S

You may replace the line
  pdfe.echo(' Sizes list: ' + sizesStr.substr(0,sizesStr.length-1));
by:
Code: [Select]
    sizesStr = sizesStr.substr(0, sizesStr.length - 1);
    var FileMetadata = pdfe.SelectedFiles(i).Metadata;
    if (FileMetadata.PageSize !== sizesStr) {
        FileMetadata.PageSize = sizesStr;
        if (FileMetadata.CommitChanges()) {
            pdfe.echo('(' + sizesStr + ') [OK]');
        } else {
            pdfe.echo('Set metadata property failed', 0xFF0000);
        }
    } else {
        pdfe.echo('(' + sizesStr + ') [already set]');
    }