Page 1 of 1

wxPdfDocument joining 2 PDF files. Is it possible?

Posted: Mon Jun 17, 2019 12:06 pm
by cutecode
hello

Can I import one PDF file at the end of the other using wxPdfDocument?


Thnk you

Re: wxPdfDocument joining 2 PDF files. Is it possible?

Posted: Mon Jun 17, 2019 12:55 pm
by Kvaz1r
No. From conversation in this issue:
wxPdfDocument is a component for generating PDF documents. It is not a component for parsing, displaying or printing PDF documents.

Re: wxPdfDocument joining 2 PDF files. Is it possible?

Posted: Mon Jun 17, 2019 3:56 pm
by utelle
Kvaz1r wrote:
Mon Jun 17, 2019 12:55 pm
No.
This is not completely true.
Kvaz1r wrote:
Mon Jun 17, 2019 12:55 pm
From conversation in this issue:
wxPdfDocument is a component for generating PDF documents. It is not a component for parsing, displaying or printing PDF documents.
The mentioned issue is related to printing and previewing a PDF file. This is indeed not possible to do with wxPdfDocument.

However, wxPdfDocument allows to extract complete pages from existing PDF files and to insert them into new PDF documents. One of the samples coming with wxPdfDocument shows how to do it (see external templates).

Regards,

Ulrich

Re: wxPdfDocument joining 2 PDF files. Is it possible?

Posted: Mon Jun 17, 2019 4:10 pm
by Kvaz1r
utelle wrote:
Mon Jun 17, 2019 3:56 pm
However, wxPdfDocument allows to extract complete pages from existing PDF files and to insert them into new PDF documents. One of the samples coming with wxPdfDocument shows how to do it (see external templates).
Oh, great, I didn't know about that.
@cutecode ,sorry for inaccuracy, I should've taken a look on samples more carefully ;-)

Re: wxPdfDocument joining 2 PDF files. Is it possible?

Posted: Mon Jun 17, 2019 4:12 pm
by cutecode
hello, I looked at templates.cpp file before posting.
There are only 2 example functions templates1() and templates2()
and both functions only open PDF file, add new page and then draw some image/text on new page.

Could you, please, give some hint?

Re: wxPdfDocument joining 2 PDF files. Is it possible?

Posted: Mon Jun 17, 2019 8:22 pm
by utelle
cutecode wrote:
Mon Jun 17, 2019 4:12 pm
hello, I looked at templates.cpp file before posting.
There are only 2 example functions templates1() and templates2()
and both functions only open PDF file, add new page and then draw some image/text on new page.

Could you, please, give some hint?
Function templates2() extracts a page from an existing PDF file and places it on a page of the new PDF document.

Method SetSourceFile selects the existing PDF file from which pages will be extracted later on. You can extract pages from more than one PDF file, but only one such PDF file is the current one. Method SetSourceFile returns the number of pages the associated PDF file has.

Method ImportPage extracts a page from the current PDF source and returns the number of the template created from the imported page.

Method GetTemplateBBox allows to determine the bounding box the imported page. This information can then be used to place the template on a new page using method UseTemplate.

Whether these methods are suited to fulfill the task you have in mind, depends on the actual demands of your application. The template mechanism of wxPdfDocument works well for small to medium numbers of imported pages, but it is certainly not the best option for mass import of hundredths of pages.

If you only want to take several existing PDF files and use certain pages from each of them, combining them in a new order, there exist dedicated tools which are better suited for this kind of job.

Re: wxPdfDocument joining 2 PDF files. Is it possible?

Posted: Mon Jun 17, 2019 9:33 pm
by cutecode
thank you, I skoped to join 2 PDF files

Code: Select all

bool join_pdfs(LPCTSTR lpsz1, LPCTSTR lpszOut)
{
	int tpl;

	wxPdfDocument pdf1;

	pdf1.SetCreationDate(wxDateTime(1, wxDateTime::Jan, 2017));
	pdf1.SetCompression(true);

	int pages1 = pdf1.SetSourceFile(lpszOut);
	for (int i = 1; i <= pages1; i++)
	{
		double width = 0, height = 0;

		tpl = pdf1.ImportPage(i, wxPDF_PAGEBOX_MEDIABOX);

		pdf1.GetTemplateSize(tpl, width, height);

		if (height > width)
			pdf1.AddPage(wxPORTRAIT, width, height);
		else
			pdf1.AddPage(wxLANDSCAPE, height, width);

		pdf1.UseTemplate(tpl, 0, 0);
	}
	pdf1.Close();

	int pages2 = pdf1.SetSourceFile(lpsz1);
	for (int i = 1; i <= pages2; i++)
	{
		double width = 0, height = 0;

		tpl = pdf1.ImportPage(i, wxPDF_PAGEBOX_MEDIABOX);

		pdf1.GetTemplateSize(tpl, width, height);

		if (height > width)
			pdf1.AddPage(wxPORTRAIT, width, height);
		else
			pdf1.AddPage(wxLANDSCAPE, height, width);

		pdf1.UseTemplate(tpl, 0, 0);
	}

	pdf1.SaveAsFile(lpszOut);

	return true;
}