diff --git a/EmbeddingPDFs/EmbeddingPDFs.cpp b/EmbeddingPDFs/EmbeddingPDFs.cpp new file mode 100644 index 0000000..86d00ff --- /dev/null +++ b/EmbeddingPDFs/EmbeddingPDFs.cpp @@ -0,0 +1,304 @@ +// standard library includes +#include +#include +using namespace std; +// end standard library includes + +// pdfwriter library includes +#include "PDFWriter.h" +#include "PDFEmbedParameterTypes.h" +#include "PageContentContext.h" +#include "PDFPage.h" +#include "PDFDocumentCopyingContext.h" + +// end pdfwriter library includes + +static const wstring scBasePath = L"..\\EmbeddingPDFs\\Materials\\"; + +EStatusCode EmbedAsPages() +{ + PDFWriter pdfWriter; + EStatusCode status; + + do + { + status = pdfWriter.StartPDF(scBasePath + L"EmbedAsPages.PDF",ePDFVersion13); + if(status != eSuccess) + break; + + // appending all pages of XObjectContent.pdf + status = pdfWriter.AppendPDFPagesFromPDF(scBasePath + L"XObjectContent.PDF",PDFPageRange()).first; + if(status != eSuccess) + break; + + // appending pages 0,1,2,3,5,6,7,8,9,10 of BasicTIFFImagesTest.PDF + PDFPageRange selectivePageRange; + selectivePageRange.mType = PDFPageRange::eRangeTypeSpecific; + selectivePageRange.mSpecificRanges.push_back(ULongAndULong(0,3)); + selectivePageRange.mSpecificRanges.push_back(ULongAndULong(5,10)); + + status = pdfWriter.AppendPDFPagesFromPDF(scBasePath + L"BasicTIFFImagesTest.PDF",selectivePageRange).first; + if(status != eSuccess) + break; + + status = pdfWriter.EndPDF(); + if(status != eSuccess) + break; + + }while(false); + + + if(eSuccess == status) + cout<<"Succeeded in creating EmbedAsPages.PDF file\n"; + else + cout<<"Failed in creating EmbedAsPages.PDF file\n"; + + return status; + +} + +EStatusCode UseAsXObjects() +{ + PDFWriter pdfWriter; + EStatusCode status; + + do + { + status = pdfWriter.StartPDF(scBasePath + L"UseAsXObjects.PDF",ePDFVersion13); + if(status != eSuccess) + break; + + // creating XObjects for all pages of XObjectContent.pdf (2 pages) + EStatusCodeAndObjectIDTypeList result = pdfWriter.CreateFormXObjectsFromPDF(scBasePath + L"XObjectContent.PDF",PDFPageRange(),ePDFPageBoxMediaBox); + if(result.first != eSuccess) + { + status = eFailure; + break; + } + + // determine page IDs + ObjectIDTypeList::iterator it = result.second.begin(); + ObjectIDType firstPageID = *it; + ++it; + ObjectIDType secondPageID = *it; + + // create a page using both xobjects + PDFPage* page = new PDFPage(); + page->SetMediaBox(PDFRectangle(0,0,595,842)); + + PageContentContext* contentContext = pdfWriter.StartPageContentContext(page); + + // place the first page in the top left corner of the document + contentContext->q(); + contentContext->cm(0.5,0,0,0.5,0,421); + contentContext->Do(page->GetResourcesDictionary().AddFormXObjectMapping(firstPageID)); + contentContext->Q(); + + // draw a rectangle around the page bounds + contentContext->G(0); + contentContext->w(1); + contentContext->re(0,421,297.5,421); + contentContext->S(); + + + // place the second page in the bottom right corner of the document + contentContext->q(); + contentContext->cm(0.5,0,0,0.5,297.5,0); + contentContext->Do(page->GetResourcesDictionary().AddFormXObjectMapping(secondPageID)); + contentContext->Q(); + + // draw a rectangle around the page bounds + contentContext->G(0); + contentContext->w(1); + contentContext->re(297.5,0,297.5,421); + contentContext->S(); + + + status = pdfWriter.EndPageContentContext(contentContext); + if(status != eSuccess) + break; + + status = pdfWriter.WritePageAndRelease(page); + if(status != eSuccess) + break; + + + // appending pages 0,1,2,3 of BasicTIFFImagesTest.PDF + PDFPageRange selectivePageRange; + selectivePageRange.mType = PDFPageRange::eRangeTypeSpecific; + selectivePageRange.mSpecificRanges.push_back(ULongAndULong(0,3)); + + result = pdfWriter.CreateFormXObjectsFromPDF(scBasePath + L"BasicTIFFImagesTest.PDF",selectivePageRange,ePDFPageBoxMediaBox); + if(result.first != eSuccess) + { + status = eFailure; + break; + } + + page = new PDFPage(); + page->SetMediaBox(PDFRectangle(0,0,595,842)); + + contentContext = pdfWriter.StartPageContentContext(page); + + // placing them in all 4 corners of the 2nd page [going left right, top bottom] + it = result.second.begin(); + contentContext->q(); + contentContext->cm(0.5,0,0,0.5,0,421); + contentContext->Do(page->GetResourcesDictionary().AddFormXObjectMapping(*it)); + contentContext->Q(); + + ++it; + contentContext->q(); + contentContext->cm(0.5,0,0,0.5,297.5,421); + contentContext->Do(page->GetResourcesDictionary().AddFormXObjectMapping(*it)); + contentContext->Q(); + + ++it; + contentContext->q(); + contentContext->cm(0.5,0,0,0.5,0,0); + contentContext->Do(page->GetResourcesDictionary().AddFormXObjectMapping(*it)); + contentContext->Q(); + + ++it; + contentContext->q(); + contentContext->cm(0.5,0,0,0.5,297.5,0); + contentContext->Do(page->GetResourcesDictionary().AddFormXObjectMapping(*it)); + contentContext->Q(); + + + status = pdfWriter.EndPageContentContext(contentContext); + if(status != eSuccess) + break; + + status = pdfWriter.WritePageAndRelease(page); + if(status != eSuccess) + break; + + status = pdfWriter.EndPDF(); + if(status != eSuccess) + break; + + }while(false); + + + if(eSuccess == status) + cout<<"Succeeded in creating UseAsXObjects.PDF file\n"; + else + cout<<"Failed in creating UseAsXObjects.PDF file\n"; + + return status; +} + +EStatusCode UseCopyingContext() +{ + PDFWriter pdfWriter; + EStatusCode status; + + PDFDocumentCopyingContext* firstContext = NULL; + PDFDocumentCopyingContext* secondContext = NULL; + + do + { + status = pdfWriter.StartPDF(scBasePath + L"UseCopyingContext.PDF",ePDFVersion13); + if(status != eSuccess) + break; + + firstContext = pdfWriter.CreatePDFCopyingContext(scBasePath + L"XObjectContent.PDF"); + if(!firstContext) + { + status = eFailure; + break; + } + + secondContext = pdfWriter.CreatePDFCopyingContext(scBasePath + L"BasicTIFFImagesTest.PDF"); + if(!firstContext) + { + status = eFailure; + break; + } + + // appending pages, first from XObjectContent, then from BasicTIFFImageTest, and then again from XObjectContent + status = firstContext->AppendPDFPageFromPDF(0).first; + if(status != eSuccess) + break; + + status = secondContext->AppendPDFPageFromPDF(0).first; + if(status != eSuccess) + break; + + status = firstContext->AppendPDFPageFromPDF(1).first; + if(status != eSuccess) + break; + + // placing pages as xobjects, from multiple PDFs + EStatusCodeAndObjectIDType resultFirst = firstContext->CreateFormXObjectFromPDFPage(0,ePDFPageBoxMediaBox); + if(resultFirst.first != eSuccess) + { + status = eFailure; + break; + } + + EStatusCodeAndObjectIDType resultSecond = secondContext->CreateFormXObjectFromPDFPage(0,ePDFPageBoxMediaBox); + if(resultSecond.first != eSuccess) + { + status = eFailure; + break; + } + + PDFPage* page = new PDFPage(); + page->SetMediaBox(PDFRectangle(0,0,595,842)); + + PageContentContext* contentContext = pdfWriter.StartPageContentContext(page); + + // placing the pages in a result page + contentContext->q(); + contentContext->cm(0.5,0,0,0.5,0,421); + contentContext->Do(page->GetResourcesDictionary().AddFormXObjectMapping(resultFirst.second)); + contentContext->Q(); + + contentContext->q(); + contentContext->cm(0.5,0,0,0.5,297.5,0); + contentContext->Do(page->GetResourcesDictionary().AddFormXObjectMapping(resultSecond.second)); + contentContext->Q(); + + status = pdfWriter.EndPageContentContext(contentContext); + if(status != eSuccess) + break; + + status = pdfWriter.WritePageAndRelease(page); + if(status != eSuccess) + break; + + status = pdfWriter.EndPDF(); + if(status != eSuccess) + break; + + }while(false); + + delete firstContext; + delete secondContext; + return status; +} + +int main(int argc, wchar_t* argv[]) +{ + EStatusCode status; + + do + { + status = EmbedAsPages(); + if(status != eSuccess) + break; + + status = UseAsXObjects(); + if(status != eSuccess) + break; + + status = UseCopyingContext(); + if(status != eSuccess) + break; + + }while(false); + return 0; +} + diff --git a/EmbeddingPDFs/EmbeddingPDFs.vcproj b/EmbeddingPDFs/EmbeddingPDFs.vcproj new file mode 100644 index 0000000..887342a --- /dev/null +++ b/EmbeddingPDFs/EmbeddingPDFs.vcproj @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/EmbeddingPDFs/Materials/BasicTIFFImagesTest.PDF b/EmbeddingPDFs/Materials/BasicTIFFImagesTest.PDF new file mode 100644 index 0000000..6baa351 Binary files /dev/null and b/EmbeddingPDFs/Materials/BasicTIFFImagesTest.PDF differ diff --git a/EmbeddingPDFs/Materials/EmbedAsPages.PDF b/EmbeddingPDFs/Materials/EmbedAsPages.PDF new file mode 100644 index 0000000..39b5d2b Binary files /dev/null and b/EmbeddingPDFs/Materials/EmbedAsPages.PDF differ diff --git a/EmbeddingPDFs/Materials/UseAsXObjects.PDF b/EmbeddingPDFs/Materials/UseAsXObjects.PDF new file mode 100644 index 0000000..25cf90d Binary files /dev/null and b/EmbeddingPDFs/Materials/UseAsXObjects.PDF differ diff --git a/EmbeddingPDFs/Materials/UseCopyingContext.PDF b/EmbeddingPDFs/Materials/UseCopyingContext.PDF new file mode 100644 index 0000000..7783d86 Binary files /dev/null and b/EmbeddingPDFs/Materials/UseCopyingContext.PDF differ diff --git a/EmbeddingPDFs/Materials/XObjectContent.PDF b/EmbeddingPDFs/Materials/XObjectContent.PDF new file mode 100644 index 0000000..4e7f3f9 Binary files /dev/null and b/EmbeddingPDFs/Materials/XObjectContent.PDF differ diff --git a/MakingComments/PDFCommentWriter.cpp b/MakingComments/PDFCommentWriter.cpp index 8db9ea8..ed55e19 100644 --- a/MakingComments/PDFCommentWriter.cpp +++ b/MakingComments/PDFCommentWriter.cpp @@ -14,7 +14,7 @@ PDFCommentWriter::PDFCommentWriter(PDFWriter* inPDFWriter) void PDFCommentWriter::ListenOnPageWrites() { - mPDFWriter->GetDocumentContext().SetDocumentContextExtender(this); + mPDFWriter->GetDocumentContext().AddDocumentContextExtender(this); } PDFCommentWriter::~PDFCommentWriter(void) diff --git a/PDFWriterSamples.sln b/PDFWriterSamples.sln index 61ce635..eaf0a2c 100644 --- a/PDFWriterSamples.sln +++ b/PDFWriterSamples.sln @@ -13,6 +13,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UsingText", "UsingText\Usin EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MakingComments", "MakingComments\MakingComments.vcproj", "{7532D080-D42C-49DD-9CE1-2D30A81A898C}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EmbeddingPDFs", "EmbeddingPDFs\EmbeddingPDFs.vcproj", "{78EB980D-8EAC-472B-89D4-E643A80B45C9}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -43,6 +45,10 @@ Global {7532D080-D42C-49DD-9CE1-2D30A81A898C}.Debug|Win32.Build.0 = Debug|Win32 {7532D080-D42C-49DD-9CE1-2D30A81A898C}.Release|Win32.ActiveCfg = Release|Win32 {7532D080-D42C-49DD-9CE1-2D30A81A898C}.Release|Win32.Build.0 = Release|Win32 + {78EB980D-8EAC-472B-89D4-E643A80B45C9}.Debug|Win32.ActiveCfg = Debug|Win32 + {78EB980D-8EAC-472B-89D4-E643A80B45C9}.Debug|Win32.Build.0 = Debug|Win32 + {78EB980D-8EAC-472B-89D4-E643A80B45C9}.Release|Win32.ActiveCfg = Release|Win32 + {78EB980D-8EAC-472B-89D4-E643A80B45C9}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/UsingText/Materials/UsingText.pdf b/UsingText/Materials/UsingText.pdf index 4319b08..9aa5ff0 100644 Binary files a/UsingText/Materials/UsingText.pdf and b/UsingText/Materials/UsingText.pdf differ