为有中文需求的客户提供多渠道中文技术支持.

Mon Dec 30, 2024 9:48 am

下面的代码可以将两个身份证大小的图片插入到A4页面中, 但是从生成的pdf中看到, 图片比实际大小要小, 打印出来的文件中图片也比实际大小要小,
怎样实现实际大小插入页面,然后实际大小打印出来? 图片是300dpi扫描的

另外发现, 在打印时, 选择如下图的选项后图片打出来会大一些(如何用代码静默打印时设置该项?), 但仍然不是扫描的图片的实际尺寸,

刚上手测试pdf组件还不太熟悉, 感谢帮助!

Code: Select all
string imagePaths = @"C:\Users\administrator\Desktop\a.png;C:\Users\administrator\Desktop\b.png";
string result = MergeImagesToPdf(imagePaths);
Console.WriteLine(result);

string MergeImagesToPdf(string imagePaths)
{
        // 获取图像路径数组
        string[] paths = imagePaths.Split(';');

        // 创建一个PDF文档
        PdfDocument document = new PdfDocument();

        // 添加一个A4页面
        PdfPageBase page = document.Pages.Add(PdfPageSize.A4, new PdfMargins(0));

        // 加载图片
        Image image1 = Image.FromFile(paths[0]);
        Image image2 = Image.FromFile(paths[1]);

        // 获取图片的真实尺寸(以点为单位,1英寸=72点)
        float image1Width = image1.Width * 72 / image1.HorizontalResolution;
        float image1Height = image1.Height * 72 / image1.VerticalResolution;
        float image2Width = image2.Width * 72 / image2.HorizontalResolution;
        float image2Height = image2.Height * 72 / image2.VerticalResolution;

        // 页面宽高
        float pageWidth = page.Canvas.ClientSize.Width;
        float pageHeight = page.Canvas.ClientSize.Height;

        // 图片之间的间隔
        float spacing = 100;

        // 计算图片位置,使其居中
        float image1X = (pageWidth - image1Width) / 2;
        float image1Y = (pageHeight - (image1Height + image2Height + spacing)) / 2;
        float image2X = (pageWidth - image2Width) / 2;
        float image2Y = image1Y + image1Height + spacing;

        // 插入图片
        page.Canvas.DrawImage(PdfImage.FromImage(image1), image1X, image1Y, image1Width, image1Height);
        page.Canvas.DrawImage(PdfImage.FromImage(image2), image2X, image2Y, image2Width, image2Height);

        // 保存PDF文档
        string outputPdfPath = @"C:\Users\administrator\Desktop\MergedImages.pdf";
        document.SaveToFile(outputPdfPath);
      
   //document.Print(); //打印文档
      
        document.Close();

        return outputPdfPath;
}

xyzxyzxyz
 
Posts: 22
Joined: Fri Dec 27, 2024 1:10 pm

Mon Dec 30, 2024 10:18 am

您好,

感谢您的咨询。

请参考下面的代码来做。
Code: Select all
PdfDocument doc = new PdfDocument();
PdfPageBase page = doc.Pages.Add();
Image image = Image.FromFile(path + "a.png");
PdfImage pdfImage = PdfImage.FromImage(image);
float widthFitRate = image.PhysicalDimension.Width / page.Canvas.ClientSize.Width;
float heightFitRate = image.PhysicalDimension.Height / page.Canvas.ClientSize.Height;
float fitRate = Math.Max(widthFitRate, heightFitRate);
float fitWidth = image.PhysicalDimension.Width / fitRate;
float fitHeight = image.PhysicalDimension.Height / fitRate;
page.Canvas.DrawImage(pdfImage, 0, 0, fitWidth, fitHeight);

image = Image.FromFile(path + "b.png");
pdfImage = PdfImage.FromImage(image);
widthFitRate = image.PhysicalDimension.Width / page.Canvas.ClientSize.Width;
heightFitRate = image.PhysicalDimension.Height / page.Canvas.ClientSize.Height;
fitRate = Math.Max(widthFitRate, heightFitRate);
float fitWidth2 = image.PhysicalDimension.Width / fitRate;
float fitHeight2 = image.PhysicalDimension.Height / fitRate;
page.Canvas.DrawImage(pdfImage, 0, fitHeight+100, fitWidth2, fitHeight2);

doc.SaveToFile(path + "image.pdf");


Sincerely,
Amy
E-iceblue support team
User avatar

amy.zhao
 
Posts: 2912
Joined: Wed Jun 27, 2012 8:50 am

Mon Dec 30, 2024 11:06 am

amy.zhao wrote:您好,

感谢您的咨询。

请参考下面的代码来做。
Code: Select all
PdfDocument doc = new PdfDocument();
PdfPageBase page = doc.Pages.Add();
Image image = Image.FromFile(path + "a.png");
PdfImage pdfImage = PdfImage.FromImage(image);
float widthFitRate = image.PhysicalDimension.Width / page.Canvas.ClientSize.Width;
float heightFitRate = image.PhysicalDimension.Height / page.Canvas.ClientSize.Height;
float fitRate = Math.Max(widthFitRate, heightFitRate);
float fitWidth = image.PhysicalDimension.Width / fitRate;
float fitHeight = image.PhysicalDimension.Height / fitRate;
page.Canvas.DrawImage(pdfImage, 0, 0, fitWidth, fitHeight);

image = Image.FromFile(path + "b.png");
pdfImage = PdfImage.FromImage(image);
widthFitRate = image.PhysicalDimension.Width / page.Canvas.ClientSize.Width;
heightFitRate = image.PhysicalDimension.Height / page.Canvas.ClientSize.Height;
fitRate = Math.Max(widthFitRate, heightFitRate);
float fitWidth2 = image.PhysicalDimension.Width / fitRate;
float fitHeight2 = image.PhysicalDimension.Height / fitRate;
page.Canvas.DrawImage(pdfImage, 0, fitHeight+100, fitWidth2, fitHeight2);

doc.SaveToFile(path + "image.pdf");


Sincerely,
Amy
E-iceblue support team


感谢帮助, 打印出来, 还是小了一圈, 能再帮忙看一下吗?

Code: Select all
string imagePaths = @"C:\Users\administrator\Desktop\TEST\sfz\a.png;C:\Users\administrator\Desktop\TEST\sfz\b.png";
string result = img2Pdf(imagePaths);
Console.WriteLine(result);

string img2Pdf(string imagePaths)
{
   // 获取图像路径数组
   string[] paths = imagePaths.Split(';');

   PdfDocument doc = new PdfDocument();
   PdfPageBase page = doc.Pages.Add();

   // 处理第一张图片
   Image image = Image.FromFile(paths[0]);
   PdfImage pdfImage = PdfImage.FromImage(image);

   // 获取图片的实际宽度和高度(以点为单位,1英寸=72点)
   float imageWidth = image.PhysicalDimension.Width * 72 / image.HorizontalResolution;
   float imageHeight = image.PhysicalDimension.Height * 72 / image.VerticalResolution;

   // 在画布上绘制图片,使用实际的宽度和高度
   page.Canvas.DrawImage(pdfImage, 0, 0, imageWidth, imageHeight);

   // 处理第二张图片
   image = Image.FromFile(paths[1]);
   pdfImage = PdfImage.FromImage(image);

   // 获取图片的实际宽度和高度(以点为单位)
   imageWidth = image.PhysicalDimension.Width * 72 / image.HorizontalResolution;
   imageHeight = image.PhysicalDimension.Height * 72 / image.VerticalResolution;

   // 计算第二张图片的起始位置,这里放置在第一张图片下面,保持一定的间距
   float yPosition = imageHeight + 20;  // 留出 20 点的间距

   // 在画布上绘制第二张图片
   page.Canvas.DrawImage(pdfImage, 0, yPosition, imageWidth, imageHeight);

   // 保存PDF文档
   string outputPdfPath = @"C:\Users\administrator\Desktop\MergedImages.pdf";
   doc.SaveToFile(outputPdfPath);
   
   doc.Print();
   
   doc.Close();

   return outputPdfPath;
}


xyzxyzxyz
 
Posts: 22
Joined: Fri Dec 27, 2024 1:10 pm

Tue Dec 31, 2024 2:13 am

您好,

您当前用的代码和我提供的不一样。可以用我的代码试下看吗?
期待您的进一步反馈。

Sincerely,
Amy
E-iceblue support team
User avatar

amy.zhao
 
Posts: 2912
Joined: Wed Jun 27, 2012 8:50 am

Tue Dec 31, 2024 8:40 am

amy.zhao wrote:您好,

您当前用的代码和我提供的不一样。可以用我的代码试下看吗?
期待您的进一步反馈。

Sincerely,
Amy
E-iceblue support team

你好, 试过了, 两个图片的宽度被调到页面的宽度了

xyzxyzxyz
 
Posts: 22
Joined: Fri Dec 27, 2024 1:10 pm

Tue Dec 31, 2024 8:57 am

您好,

感谢进一步反馈。
您的原始图片的尺寸比较大超出了A4页面的尺寸,因此我给您的代码中按照高宽等比例进行缩放图片后再绘制到页面上的。
请问您期待想要的效果是怎样的?可以提供一个截图或示例文档吗?我将提供您实现代码。

Sincerely,
Amy
E-iceblue support team
User avatar

amy.zhao
 
Posts: 2912
Joined: Wed Jun 27, 2012 8:50 am

Wed Jan 01, 2025 9:49 am

amy.zhao wrote:您好,

感谢进一步反馈。
您的原始图片的尺寸比较大超出了A4页面的尺寸,因此我给您的代码中按照高宽等比例进行缩放图片后再绘制到页面上的。
请问您期待想要的效果是怎样的?可以提供一个截图或示例文档吗?我将提供您实现代码。

Sincerely,
Amy
E-iceblue support team


您好, 图片的尺寸没有超过A4页面的尺寸, 可以换算一下, 正好是身份证的长度和宽度, 最上面的图片可以手动插入到potoshop中, 然后打印出来就是实际的大小显示

xyzxyzxyz
 
Posts: 22
Joined: Fri Dec 27, 2024 1:10 pm

Thu Jan 02, 2025 2:53 am

您好,

根据您的描述,似乎我提供的代码实现的效果是您预期的。您看下这个结果是您想要的吗?如果不是麻烦您提供一个预期的截图或打印出的pdf文档供我们参考。
打印结果.png


Code: Select all
PdfDocument doc = new PdfDocument();
PdfPageBase page = doc.Pages.Add();
Image imageA = Image.FromFile(path + "a.png");
PdfImage pdfImageA = PdfImage.FromImage(imageA);
float widthFitRate = pdfImageA.PhysicalDimension.Width / page.Canvas.ClientSize.Width;
float heightFitRate = pdfImageA.PhysicalDimension.Height / page.Canvas.ClientSize.Height;
float fitRate = Math.Max(widthFitRate, heightFitRate);
float fitWidthA = pdfImageA.PhysicalDimension.Width / fitRate;
float fitHeightA = pdfImageA.PhysicalDimension.Height / fitRate;
page.Canvas.DrawImage(pdfImageA, 0, 0, fitWidthA, fitHeightA);


Image imageB = Image.FromFile(path + "b.png");
PdfImage pdfImageB = PdfImage.FromImage(imageB);
widthFitRate = pdfImageB.PhysicalDimension.Width / page.Canvas.ClientSize.Width;
heightFitRate = pdfImageB.PhysicalDimension.Height / page.Canvas.ClientSize.Height;
fitRate = Math.Max(widthFitRate, heightFitRate);
float fitWidthB = pdfImageB.PhysicalDimension.Width / fitRate;
float fitHeightB = pdfImageB.PhysicalDimension.Height / fitRate;
page.Canvas.DrawImage(pdfImageB, 0, fitHeightA + 20, fitWidthB, fitHeightB);

doc.SaveToFile(path + "image0102.pdf");
doc.Print();


Sincerely,
Amy
E-iceblue support team
User avatar

amy.zhao
 
Posts: 2912
Joined: Wed Jun 27, 2012 8:50 am

Thu Jan 02, 2025 5:08 am

amy.zhao wrote:您好,

根据您的描述,似乎我提供的代码实现的效果是您预期的。您看下这个结果是您想要的吗?如果不是麻烦您提供一个预期的截图或打印出的pdf文档供我们参考。
打印结果.png


Code: Select all
PdfDocument doc = new PdfDocument();
PdfPageBase page = doc.Pages.Add();
Image imageA = Image.FromFile(path + "a.png");
PdfImage pdfImageA = PdfImage.FromImage(imageA);
float widthFitRate = pdfImageA.PhysicalDimension.Width / page.Canvas.ClientSize.Width;
float heightFitRate = pdfImageA.PhysicalDimension.Height / page.Canvas.ClientSize.Height;
float fitRate = Math.Max(widthFitRate, heightFitRate);
float fitWidthA = pdfImageA.PhysicalDimension.Width / fitRate;
float fitHeightA = pdfImageA.PhysicalDimension.Height / fitRate;
page.Canvas.DrawImage(pdfImageA, 0, 0, fitWidthA, fitHeightA);


Image imageB = Image.FromFile(path + "b.png");
PdfImage pdfImageB = PdfImage.FromImage(imageB);
widthFitRate = pdfImageB.PhysicalDimension.Width / page.Canvas.ClientSize.Width;
heightFitRate = pdfImageB.PhysicalDimension.Height / page.Canvas.ClientSize.Height;
fitRate = Math.Max(widthFitRate, heightFitRate);
float fitWidthB = pdfImageB.PhysicalDimension.Width / fitRate;
float fitHeightB = pdfImageB.PhysicalDimension.Height / fitRate;
page.Canvas.DrawImage(pdfImageB, 0, fitHeightA + 20, fitWidthB, fitHeightB);

doc.SaveToFile(path + "image0102.pdf");
doc.Print();


Sincerely,
Amy
E-iceblue support team


您好, 我测试后图片还是被调为了页面的宽度,
下图是图片的实际尺寸信息,
3.34 × 2.12 英寸的尺寸为 8.48 厘米 × 5.38 厘米。
而A4的大小是21.0*29.7厘米

xyzxyzxyz
 
Posts: 22
Joined: Fri Dec 27, 2024 1:10 pm

Thu Jan 02, 2025 6:34 am

您好,

感谢您的耐心解释,很抱歉之前误解了您的需求。
我通过下面的代码添加图片到PDF后图片保留了原有的尺寸,我和用Adobe Acrobat手动添加图片进行对比,图片尺寸是一样的。请尝试看是否达到您预期的一样。
Code: Select all
PdfDocument doc = new PdfDocument();
PdfPageBase page = doc.Pages.Add(PdfPageSize.A4);
Image imageA = Image.FromFile(path + "a.png");
PdfImage pdfImageA = PdfImage.FromImage(imageA);
float widthFitRate = pdfImageA.PhysicalDimension.Width / page.Canvas.ClientSize.Width;
float heightFitRate = pdfImageA.PhysicalDimension.Height / page.Canvas.ClientSize.Height;
float fitRate = Math.Max(widthFitRate, heightFitRate);
if (fitRate < 1)
{
    float x = (page.Canvas.ClientSize.Width - pdfImageA.PhysicalDimension.Width) / 2;
    page.Canvas.DrawImage(pdfImageA, x, 0);
}
else
{
    float fitWidthA = pdfImageA.PhysicalDimension.Width / fitRate;
    float fitHeightA = pdfImageA.PhysicalDimension.Height / fitRate;
    page.Canvas.DrawImage(pdfImageA, 0, 0, fitWidthA, fitHeightA);
}

Image imageB = Image.FromFile(path + "b.png");
PdfImage pdfImageB = PdfImage.FromImage(imageB);
widthFitRate = pdfImageB.PhysicalDimension.Width / page.Canvas.ClientSize.Width;
heightFitRate = pdfImageB.PhysicalDimension.Height / page.Canvas.ClientSize.Height;
fitRate = Math.Max(widthFitRate, heightFitRate);

if (fitRate < 1)
{
    float x = (page.Canvas.ClientSize.Width - pdfImageB.PhysicalDimension.Width) / 2;
    page.Canvas.DrawImage(pdfImageB, x, pdfImageA.PhysicalDimension.Height + 20);
}
else
{
    float x = (page.Canvas.ClientSize.Width - pdfImageB.PhysicalDimension.Width) / 2;
    float fitWidthB = pdfImageB.PhysicalDimension.Width / fitRate;
    float fitHeightB = pdfImageB.PhysicalDimension.Height / fitRate;
    page.Canvas.DrawImage(pdfImageB, x, fitHeightB + 20, fitWidthB, fitHeightB);
}

doc.SaveToFile(path + "image0102.pdf");
doc.Print();


用Spire.PDF添加图片的效果:
用Spire.PDF添加图片.png


用Adobe Acrobat添加图片的效果:
用Adobe Acrobat添加图片.png




Sincerely,
Amy
E-iceblue support team
User avatar

amy.zhao
 
Posts: 2912
Joined: Wed Jun 27, 2012 8:50 am

Thu Jan 02, 2025 7:17 am

amy.zhao wrote:您好,

感谢您的耐心解释,很抱歉之前误解了您的需求。
我通过下面的代码添加图片到PDF后图片保留了原有的尺寸,我和用Adobe Acrobat手动添加图片进行对比,图片尺寸是一样的。请尝试看是否达到您预期的一样。
Code: Select all
PdfDocument doc = new PdfDocument();
PdfPageBase page = doc.Pages.Add(PdfPageSize.A4);
Image imageA = Image.FromFile(path + "a.png");
PdfImage pdfImageA = PdfImage.FromImage(imageA);
float widthFitRate = pdfImageA.PhysicalDimension.Width / page.Canvas.ClientSize.Width;
float heightFitRate = pdfImageA.PhysicalDimension.Height / page.Canvas.ClientSize.Height;
float fitRate = Math.Max(widthFitRate, heightFitRate);
if (fitRate < 1)
{
    float x = (page.Canvas.ClientSize.Width - pdfImageA.PhysicalDimension.Width) / 2;
    page.Canvas.DrawImage(pdfImageA, x, 0);
}
else
{
    float fitWidthA = pdfImageA.PhysicalDimension.Width / fitRate;
    float fitHeightA = pdfImageA.PhysicalDimension.Height / fitRate;
    page.Canvas.DrawImage(pdfImageA, 0, 0, fitWidthA, fitHeightA);
}

Image imageB = Image.FromFile(path + "b.png");
PdfImage pdfImageB = PdfImage.FromImage(imageB);
widthFitRate = pdfImageB.PhysicalDimension.Width / page.Canvas.ClientSize.Width;
heightFitRate = pdfImageB.PhysicalDimension.Height / page.Canvas.ClientSize.Height;
fitRate = Math.Max(widthFitRate, heightFitRate);

if (fitRate < 1)
{
    float x = (page.Canvas.ClientSize.Width - pdfImageB.PhysicalDimension.Width) / 2;
    page.Canvas.DrawImage(pdfImageB, x, pdfImageA.PhysicalDimension.Height + 20);
}
else
{
    float x = (page.Canvas.ClientSize.Width - pdfImageB.PhysicalDimension.Width) / 2;
    float fitWidthB = pdfImageB.PhysicalDimension.Width / fitRate;
    float fitHeightB = pdfImageB.PhysicalDimension.Height / fitRate;
    page.Canvas.DrawImage(pdfImageB, x, fitHeightB + 20, fitWidthB, fitHeightB);
}

doc.SaveToFile(path + "image0102.pdf");
doc.Print();


用Spire.PDF添加图片的效果:
用Spire.PDF添加图片.png


用Adobe Acrobat添加图片的效果:
用Adobe Acrobat添加图片.png




Sincerely,
Amy
E-iceblue support team


感谢你的帮助, 现在插入到A4中的图像已经实际大小显示了, 但是直接使用.Print()打印后, 还是缩小了, 我在打印时, 要选择下面演示的选项才能实际大小打印, 有这个实际打印的选项吗? 我没有找到

xyzxyzxyz
 
Posts: 22
Joined: Fri Dec 27, 2024 1:10 pm

Thu Jan 02, 2025 7:45 am

您好,

打印时可以设置的。请参考:
Code: Select all
doc.PrintSettings.SelectSinglePageLayout(Spire.Pdf.Print.PdfSinglePageScalingMode.ActualSize);
doc.Print();



Sincerely,
Amy
E-iceblue support team
User avatar

amy.zhao
 
Posts: 2912
Joined: Wed Jun 27, 2012 8:50 am

Return to 中文技术支持

cron