0

有没有办法使用 LEADTOOLS C API 将多个(2、3 或 4)图像添加到 PDF 文件的同一页面?

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

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

这些L_PdfComp..()功能似乎根本无法处理页面。

这些MRC功能是否支持页面处理,即指定每个图像将存储在哪个页面中?此外,生成的文件是标准 PDF 格式,还是特定于 LEAD?

任何帮助将不胜感激。

4

1 回答 1

0

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

要处理更通用的 PDF 类型,可以使用其他 LEADTOOLS 函数,例如 .NET PDFFile 类PDFDocument 类

下面的 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, &page1, FILE_RAS_PDF_LZW, 24, 0, NULL);
L_FreeBitmap(&page1);

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

// Append second page
BITMAPHANDLE page2 = { 0 };
L_LoadBitmap(page2_file, &page2, sizeof BITMAPHANDLE, 24, ORDER_BGR, NULL, 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, &page2, FILE_RAS_PDF_LZW, 24, 0, &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, sizeof BITMAPHANDLE, 24, ORDER_BGR, NULL, NULL);
L_LoadBitmap(page2_2_file, &page2_2, sizeof BITMAPHANDLE, 24, ORDER_BGR, NULL, 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, sizeof BITMAPHANDLE, TYPE_CONV, w, h, 24, ORDER_BGR, NULL, BOTTOM_LEFT, NULL, 0);
// Copy the first image into the empty bitmap
L_CombineBitmap(&combinedPage, 0, 0, BITMAPWIDTH(&page2_1), BITMAPHEIGHT(&page2_1), &page2_1, 0, 0, CB_DST_0 | CB_OP_ADD | CB_RAWCOMBINE, 0);
L_FreeBitmap(&page2_1);
// Copy the second image below the first image
L_CombineBitmap(&combinedPage, 0, BITMAPHEIGHT(&page2_1), BITMAPWIDTH(&page2_2), BITMAPHEIGHT(&page2_2), &page2_2, 0, 0, CB_DST_0 | CB_OP_ADD | CB_RAWCOMBINE, 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, FILE_RAS_PDF_LZW, 24, 0, &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, sizeof BITMAPHANDLE, 24, ORDER_BGR, NULL, NULL);
L_LoadBitmap(image2_file, &image2, sizeof BITMAPHANDLE, 24, ORDER_BGR, NULL, 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, NULL, NULL);
Rectangle(hdcEmf, 0, 0, w, h);

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

RECT rc2 = { 0, BITMAPHEIGHT(&image1), BITMAPWIDTH(&image2), BITMAPHEIGHT(&image1) + BITMAPHEIGHT(&image2) };
L_PaintDC(hdcEmf, &image2, NULL, NULL, &rc2, NULL, 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, NULL);
Page.hEmf = hemf;
Page.pdwTextScale = &dTextScale;
L_DocWriterAddPage(hDocument, DOCWRTPAGETYPE_EMF, (L_VOID*)&Page);
L_DocWriterFinish(hDocument);

DeleteEnhMetaFile(hemf);
于 2021-06-07T19:37:34.660 回答