patterncsharpMinor
Count PDF pages in constructor
Viewed 0 times
countpagesconstructorpdf
Problem
I have an object that represents a PDF file. In the constructor, I pull out various information about the file name and make it available via properties:
One of the attributes I would like to get is the number of pages in the PDF.
I am using
This works fine, except now I need to get the count of pages at several times during the object lifetime. I do not want to keep opening the PDF each time to get the count so these are my ideas:
-
Rename method
-
Count the pages in the construct
public class Invoice
{
//public properties
public string FullPath {get { return this.fullPath;} }
public string FileNameWithoutExtension { get { return this.fileNameWithoutExtension;} }
public string FileName { get { return this.fileName; } }
public string BatchSequenceNumber { get { return this.batchSequenceNumber; } }
//private fields
private string fullPath;
private string fileNameWithoutExtension;
private string fileName;
private string batchSequenceNumber;
//Default construtor
public Invoice(string filePath)
{
this.fullPath = filePath;
this.fileName = Path.GetFileName(filePath);
this.fileNameWithoutExtension = Path.GetFileNameWithoutExtension(filePath);
this.batchSequenceNumber = Path.GetFileNameWithoutExtension(filePath).Split('_').LastOrDefault();
}
}One of the attributes I would like to get is the number of pages in the PDF.
I am using
iTextSharp and I have a PageCount method in the above Invoice class that looks like this:public int PageCount()
{
PdfReader reader = null;
int pageCount;
try
{
reader = new PdfReader(this.FullPath);
pageCount = reader.NumberOfPages;
}
catch (Exception ex)
{
throw new Exception("Error reading pdf! " + ex.Message);
}
finally
{
if (reader != null) { reader.Close(); }
}
return pageCount;
}This works fine, except now I need to get the count of pages at several times during the object lifetime. I do not want to keep opening the PDF each time to get the count so these are my ideas:
-
Rename method
PageCount to CountPages and store the result in field/property PageCount.-
Count the pages in the construct
Solution
Assuming you want to avoid opening the file unless necessary (ie until someone requests the PageCount), I would use a nullable private field, as follows:
The first time the property is accessed, the private member will be null, so the code to update the value will be run. Subsequent accesses will use the cached value.
private int? _pageCount;
public int PageCount
{
get
{
if (!_pageCount.HasValue) {
//existing code to determine page count
_pageCount = /* result */
}
return _pageCount;
}
}The first time the property is accessed, the private member will be null, so the code to update the value will be run. Subsequent accesses will use the cached value.
Code Snippets
private int? _pageCount;
public int PageCount
{
get
{
if (!_pageCount.HasValue) {
//existing code to determine page count
_pageCount = /* result */
}
return _pageCount;
}
}Context
StackExchange Code Review Q#62526, answer score: 8
Revisions (0)
No revisions yet.