【问题标题】:PDF Printing Transparent BackgroundsPDF打印透明背景
【发布时间】:2021-07-03 19:09:37
【问题描述】:

我的应用程序会创建 PDF。作为其中的一部分,我已成功允许用户添加图像,并将图像裁剪为圆形并添加。当您在屏幕或计算机屏幕上查看随后创建的 PDF 时,它看起来很棒。但是,当您将其打印出来时,它会打印出部分透明背景,如图所示与屏幕上的外观。这是 Xcode 中 PDFKit 的问题还是我可以做些什么来解决这个问题?

- (void) generatePdfWithFilePath2: (NSString *)thefilePath
{
    UIGraphicsBeginPDFContextToFile(thefilePath, CGRectZero, nil);
    
    BOOL done = NO;
    do
    {
        UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, pageSize.width, pageSize.height), nil);
        
        [self drawImage];
        [self drawImage2];
        [self drawText];
        [self drawText2];
        [self drawText4];
        [self drawText5];
        
        done = YES;
    }
    while (!done);
    
    // Close the PDF context and write the contents out.
    UIGraphicsEndPDFContext();
    
}

并绘制图像:

- (void) drawImage2
{
    UIImage * demoImage = self.imageCopy;
    NSData *pngData = UIImagePNGRepresentation(demoImage);
    CGDataProviderRef dp = CGDataProviderCreateWithCFData(( CFDataRef)pngData);
    CGImageRef cgImage = CGImageCreateWithPNGDataProvider(dp, NULL, true, kCGRenderingIntentDefault);
    [[UIImage imageWithCGImage:cgImage] drawInRect:CGRectMake(100, 371.82, 190, 190)];

}

【问题讨论】:

    标签: ios xcode pdf png


    【解决方案1】:

    几件事...

    1. 您是否有理由转换为 CGImage 并返回?
    2. 确定背景是完全透明的吗?
    3. 如果您确定,那么您可能想尝试使用剪切路径。

    这是我快速测试的结果...

    使用它作为“背景”图像:

    这两张图片与背景重叠,具有透明度 - 第一张图片一个 alpha/透明区域,第二张图片没有:

    使用此代码:

    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    - (IBAction)didTap:(id)sender {
    
        NSFileManager *fileManager = [NSFileManager defaultManager];
        
        //Get documents directory
        NSArray *directoryPaths = NSSearchPathForDirectoriesInDomains
        (NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectoryPath = [directoryPaths objectAtIndex:0];
        
        NSString *path = [documentsDirectoryPath stringByAppendingPathComponent:@"SomeFileName.pdf"];
        
        [self generatePdfWithFilePath2:path];
        
    }
    
    - (void) generatePdfWithFilePath2: (NSString *)thefilePath
    {
        UIGraphicsBeginPDFContextToFile(thefilePath, CGRectZero, nil);
        
        CGSize pageSize = CGSizeMake(612, 792);
        
        BOOL done = NO;
        do
        {
            UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, pageSize.width, pageSize.height), nil);
            
            [self drawImage1];
            [self drawImage2];
            [self drawImage3];
            [self drawImage4];
            
            done = YES;
        }
        while (!done);
        
        // Close the PDF context and write the contents out.
        UIGraphicsEndPDFContext();
        
    }
    
    - (void) drawImage1
    {
        UIImage * demoImage = [UIImage imageNamed:@"bkgGradient"];
        [demoImage drawInRect:CGRectMake(50, 50, 200, 200)];
    }
    
    - (void) drawImage2
    {
        UIImage * demoImage = [UIImage imageNamed:@"pro1"];
        [demoImage drawInRect:CGRectMake(150, 150, 200, 200)];
    }
    
    - (void) drawImage3
    {
        UIImage * demoImage = [UIImage imageNamed:@"bkgGradient"];
        [demoImage drawInRect:CGRectMake(50, 400, 200, 200)];
    }
    
    - (void) drawImage4
    {
        UIImage * demoImage = [UIImage imageNamed:@"pro2"];
        CGRect r = CGRectMake(150, 500, 200, 200);
        // create a bezier path defining rounded corners
        UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:r cornerRadius:r.size.height];
        // use this path for clipping in the implicit context
        [path addClip];
        [demoImage drawInRect:r];
    }
    

    这是它在屏幕上的预览效果:

    以及整个打印页面的扫描(按比例缩小):

    打印页面的非缩放 300-dpi 扫描:

    如您所见,“pro1”的 alpha 区域和“pro2”的剪切区域都是完全透明的,无论是在屏幕上还是打印出来的。

    【讨论】:

      猜你喜欢
      • 2017-01-19
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2019-02-07
      • 2020-10-15
      • 2017-06-22
      相关资源
      最近更新 更多