我有一张相机拍摄的照片,这张照片是720x720像素。 我需要生成包含此图片的PDF。 当我以600 dpi打印此PDF时,我需要将图片精确地设置为2x2英寸(如果图像必须放大一点,则没问题。)
我创建了PDF上下文并按如下方式写入:
CGFloat ratio = 600.0f/72.0f;
CGFloat contextWidth = floorf(imageWidth * ratio);
CGFloat contextHeight = floorf(imageHeight * ratio);
CGSize PDFContextSize = CGSizeMake(contextWidth, contextHeight);
CGRect mediaBox = CGRectZero;
mediaBox.size = PDFContextSize;
CGContextRef pdfContext = CGPDFContextCreate(dataConsumer, &mediaBox, auxillaryInformation);
CGImageRef imageRef = [image CGImage];
CGPDFContextBeginPage(pdfContext, NULL);
CGContextDrawImage(pdfContext, CGRectMake(0.0f, 0.0f, mediaBox.size.width, mediaBox.size.height), imageRef);
CGPDFContextEndPage(pdfContext);
CGPDFContextClose(pdfContext);
CGContextRelease(pdfContext);
当我以600 dpi打印此代码创建的PDF时,打印的图像为2.4 x 2.4英寸,而不是2 x 2英寸。
有什么想法吗?
编辑:这是我用于打印的代码。是的,我将比例因子设置为1,以防止图片缩放。
PDFDocument *pdfDoc = [[PDFDocument alloc] initWithData:pdfData];
NSPrintInfo *printInfo = [NSPrintInfo sharedPrintInfo];
NSRect printRect = [printInfo imageablePageBounds];
PDFPage *firstPage = [pdfDoc pageAtIndex:0];
NSRect bounds = [firstPage boundsForBox:kPDFDisplayBoxMediaBox];
NSSize pixelSize = bounds.size;
NSRect frame = NSMakeRect(0.0f, 0.0f, 0.0f, 0.0f);
frame.size = pixelSize;
PDFView *pdfView = [[PDFView alloc] initWithFrame:frame];
[pdfView setScaleFactor:1.0f];
[pdfView setDocument: pdfDoc];
[printInfo setTopMargin:verticalMargin];
[printInfo setBottomMargin:verticalMargin];
[printInfo setLeftMargin:horizontalMargin];
[printInfo setRightMargin:horizontalMargin];
[printInfo setHorizontalPagination:NSFitPagination];
[printInfo setVerticalPagination:NSFitPagination];
[printInfo setVerticallyCentered:YES];
[printInfo setHorizontallyCentered:YES];
[printInfo setScalingFactor:1.0f];
NSPrintOperation *myop = [NSPrintOperation printOperationWithView:pdfView printInfo:printInfo];
[myop runOperation];
此代码打印的图像为2.4x2.4英寸而不是2x2英寸。
答案 0 :(得分:2)
测量2 x 2英寸的PDF是一个PDF,用144个用户单位测量144(假设使用了UserUnit
条目的默认值。)
在数学中,720 x 720图像不是144 x 144用户单位:
720 * 600 / 72 = 6000
6000 / 72 = 83.333
您正在混合各种测量。默认情况下,用户单位相当于点数:1英寸= 72个用户单位= 72点。但是你还涉及像素和像素不是点Convert Pixels to Points
points = pixels * 72 / 96
另外,您提到您" print",但如果您忘记将缩放设置为无缩放,则打印通常会更改分辨率。请参阅How can I override PDF print dialog settings with iTextSharp以及Chrome: How to print PDF with original size (100%, no scaling/shrinking)
简而言之:您正在做出一些可能不正确的假设,例如假设像素与用户单位相同,以及打印机尊重PDF文档尺寸的假设。请仔细检查这些假设,如果问题仍然存在,请澄清您的问题。