微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 LEADTOOLS 将多个图像附加到 PDF 页面

如何解决使用 LEADTOOLS 将多个图像附加到 PDF 页面

是否可以使用 LEADTOOLS C API 将多个(2、3 或 4 个)图像添加到 PDF 文件的同一页面

L_SaveBitmap() 函数采用 SAVEFILEOPTION 参数,其中可以设置 PageNumber,但将其设置为大于 1 的值会导致附加新页面。相反,值为 1 或 0 会导致文件被覆盖。

L_SaveFile() 函数执行类似;设置 SAVEFILE_MULTIPAGE 标志会导致始终附加新页面

L_PdfComp..() 函数似乎根本无法处理页面

MRC 函数是否支持页面处理,即指定每个图像将存储在哪个页面?另外,生成文件是标准的PDF格式,还是LEAD特定的?

任何帮助将不胜感激。

解决方法

为了解决“是标准PDF格式生成的文件,还是LEAD特有的”部分,任何和所有LEADTOOLS函数保存的任何PDF文件都是标准PDF文件,应该可以打开它使用任何标准的 PDF 查看器。
但是,如果您希望使用 L_SaveBitmap() 附加或替换页面,则现有 PDF 文件必须是基于光栅的 PDF,类似于 L_SaveBitmap() 本身的输出。

要处理更一般类型的 PDF,可以使用其他 LEADTOOLS 函数,例如 .NET PDFFile classPDFDocument class

下面的 C/C++ 代码执行覆盖(创建新文件)、附加和替换特定页面。它还展示了如何在单个 PDF 页面中放置 2 个图像。
可以将代码段组合成一个函数,以使用任意 4 个输入图像文件对其进行测试。

首先,创建一个只有一页的文件,如果存在就覆盖它:

// Create file with first page
BITMAPHANDLE page1 = { 0 };
L_LoadBitmap(page1_file,&page1,sizeof BITMAPHANDLE,24,ORDER_BGR,NULL,NULL);
page1.XResolution = page1.YResolution = BITMAPHEIGHT(&page1) / 11; //set the DPI to cause 11 inch height.
L_SaveBitmap(outputPdf_file,FILE_RAS_PDF_LZW,NULL);
L_FreeBitmap(&page1);

接下来,加载图像并将其作为第二页附加到同一个 PDF 文件中:

// Append second page
BITMAPHANDLE page2 = { 0 };
L_LoadBitmap(page2_file,&page2,NULL);
SAVEFILEOPTION SaveOptions = { 0 };
L_GetDefaultSaveFileOption(&SaveOptions,sizeof SAVEFILEOPTION);
SaveOptions.PageNumber = 2;
page2.XResolution = page2.YResolution = BITMAPHEIGHT(&page2) / 11; //set the DPI to cause 11 inch height.
L_SaveBitmap(outputPdf_file,&SaveOptions);
L_FreeBitmap(&page2);

最后,加载 2 张图片,将它们组合成一张图片,然后用新加载的 2 张图片组合的图片替换第一页:

BITMAPHANDLE page2_1 = { 0 },page2_2 = { 0 };
// Load 2 iamges for one page
L_LoadBitmap(page2_1_file,&page2_1,NULL);
L_LoadBitmap(page2_2_file,&page2_2,NULL);

L_UINT w = max(BITMAPWIDTH(&page2_1),BITMAPWIDTH(&page2_2));
L_UINT h = BITMAPHEIGHT(&page2_1) + BITMAPHEIGHT(&page2_2);
BITMAPHANDLE combinedPage = { 0 };
// Create empty bitmap
L_CreateBitmap(&combinedPage,TYPE_CONV,w,h,BOTTOM_LEFT,0);
// Copy the first image into the empty bitmap
L_CombineBitmap(&combinedPage,BITMAPWIDTH(&page2_1),BITMAPHEIGHT(&page2_1),CB_DST_0 | CB_OP_ADD | CB_RAWCOMBINE,0);
L_FreeBitmap(&page2_1);
// Copy the second image below the first image
L_CombineBitmap(&combinedPage,BITMAPWIDTH(&page2_2),BITMAPHEIGHT(&page2_2),0);
L_FreeBitmap(&page2_2);
SaveOptions.PageNumber = 1;
SaveOptions.Flags |= ESO_REPLACEPAGE; // add the replace flag to put the combined image instead of the old page1
combinedPage.XResolution = combinedPage.YResolution = BITMAPHEIGHT(&combinedPage) / 11; //set the DPI to cause 11 inch height.
L_SaveBitmap(outputPdf_file,&combinedPage,&SaveOptions);
L_FreeBitmap(&combinedPage);

回答被接受后添加了以下部分,以解决评论:

可以将多个图像插入到单个 PDF 页面中,而无需先合并它们,但不能使用 L_SaveBitmap() 函数。相反,需要使用 Document Writer 函数,如以下代码示例所示。

下面的代码加载 2 个图像并将它们放入一个 EMF 内存文件中。然后在它们上面绘制一个椭圆,以表明可以添加任何 Windows GDI 图形对象(例如,您可以使用 TextOut() 或其他 GDI 函数添加文本)。之后,使用 LEADTOOLS Document Writer 将 EMF 页面保存为 PDF。

BITMAPHANDLE image1 = { 0 },image2 = { 0 };
// Load 2 iamges for one page
L_LoadBitmap(image1_file,&image1,NULL);
L_LoadBitmap(image2_file,&image2,NULL);
L_UINT w = max(BITMAPWIDTH(&image1),BITMAPWIDTH(&image2));
L_UINT h = BITMAPHEIGHT(&image1) + BITMAPHEIGHT(&image2);

// Create a memory metafile and paint both bitmaps in it
HDC hdcEmf = CreateEnhMetaFile(NULL,NULL);
Rectangle(hdcEmf,h);

RECT rc1 = { 0,BITMAPWIDTH(&image1),BITMAPHEIGHT(&image1) };
L_PaintDC(hdcEmf,&rc1,SRCCOPY);
L_FreeBitmap(&image1);

RECT rc2 = { 0,BITMAPHEIGHT(&image1),BITMAPWIDTH(&image2),BITMAPHEIGHT(&image1) + BITMAPHEIGHT(&image2) };
L_PaintDC(hdcEmf,&rc2,SRCCOPY);
L_FreeBitmap(&image2);

Ellipse(hdcEmf,w / 4,h / 4,w * 3 / 4,h * 3 / 4);

HENHMETAFILE hemf = CloseEnhMetaFile(hdcEmf);

DOCWRTPDFOPTIONS pdf = { 0 };
L_DOUBLE dTextScale = 0.5;
DOCUMENTWRITER_HANDLE hDocument = 0;
DOCWRTEMFPAGE Page = { 0 };
pdf.PdfProfile = DOCWRTPDFPROFILE_PDF;
pdf.Options.uStructSize = sizeof(pdf);
pdf.Options.nDocumentResolution = 300;
// Setup empty page size based on images size
pdf.Options.dEmptyPageWidth = w / 300.0;
pdf.Options.dEmptyPageHeight = h / 300.0;
pdf.Options.nEmptyPageResolution = 300;

L_DocWriterInit(&hDocument,outputPdf_file,DOCUMENTFORMAT_PDF,&pdf,NULL);
Page.hEmf = hemf;
Page.pdwTextScale = &dTextScale;
L_DocWriterAddPage(hDocument,DOCWRTPAGETYPE_EMF,(L_VOID*)&Page);
L_DocWriterFinish(hDocument);

DeleteEnhMetaFile(hemf);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。