【问题标题】:Create pdf from Html [duplicate]从 Html 创建 pdf [重复]
【发布时间】:2012-05-22 16:23:19
【问题描述】:

如何从 html 创建 pdf 而无需在 iPhone 应用程序的目标 c 中截取 uiwebview 的屏幕截图或图像?

当我创建 pdf 以捕获 UIwebView 的屏幕截图时,pdf 分辨率看起来不太好。放大或缩小其文本的像素被破坏。

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    UIWebView中加载html

    UIWebView 使用UIPrintPageRenderer 按照以下步骤操作:

    添加Category of UIPrintPageRenderer 以获取PDF数据

    @interface UIPrintPageRenderer (PDF)
    - (NSData*) printToPDF;
    @end
    
    @implementation UIPrintPageRenderer (PDF)
    - (NSData*) printToPDF
    {
      NSMutableData *pdfData = [NSMutableData data];
      UIGraphicsBeginPDFContextToData( pdfData, self.paperRect, nil );
      [self prepareForDrawingPages: NSMakeRange(0, self.numberOfPages)];
      CGRect bounds = UIGraphicsGetPDFContextBounds();
      for ( int i = 0 ; i < self.numberOfPages ; i++ )
      {
        UIGraphicsBeginPDFPage();
        [self drawPageAtIndex: i inRect: bounds];
      }
      UIGraphicsEndPDFContext();
      return pdfData;
    }
    @end
    

    为 A4 尺寸添加这些定义

    #define kPaperSizeA4 CGSizeMake(595.2,841.8)
    

    现在在UIWebView's webViewDidFinishLoad delegate 使用UIPrintPageRenderer propertyUIWebView

    - (void)webViewDidFinishLoad:(UIWebView *)awebView
    {
      if (awebView.isLoading)
        return;
    
      UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init];
      [render addPrintFormatter:awebView.viewPrintFormatter startingAtPageAtIndex:0];
      //increase these values according to your requirement
      float topPadding = 10.0f;
      float bottomPadding = 10.0f;
      float leftPadding = 10.0f;
      float rightPadding = 10.0f;
      CGRect printableRect = CGRectMake(leftPadding,
                                      topPadding,
                                      kPaperSizeA4.width-leftPadding-rightPadding,
                                      kPaperSizeA4.height-topPadding-bottomPadding);
      CGRect paperRect = CGRectMake(0, 0, kPaperSizeA4.width, kPaperSizeA4.height);
      [render setValue:[NSValue valueWithCGRect:paperRect] forKey:@"paperRect"];
      [render setValue:[NSValue valueWithCGRect:printableRect] forKey:@"printableRect"];
      NSData *pdfData = [render printToPDF];
      if (pdfData) {
        [pdfData writeToFile:[NSString stringWithFormat:@"%@/tmp.pdf",NSTemporaryDirectory()] atomically: YES];
      }
      else
      {
        NSLog(@"PDF couldnot be created");
      }
    }
    

    【讨论】:

    • 这对我也有用。但是您如何定义 CGSizeMake(595.2,841.8) ?我正在使用 iPad Pro 9.7 和 12.9,那么它们的尺寸是多少?任何想法 ?因为即使底部有很多空间,这种尺寸也会将 pdf 分成 2 页
    • 将其 A4 大小转换为像素
    • 那么 DPI 呢?
    • 我的意思是我们需要根据 DPI 计算像素吗?
    【解决方案2】:

    您可以使用quartz core 在PDF 上下文中绘制UIwebview,而不是将其作为屏幕截图。 Here 是代码。

    【讨论】:

    • 感谢您的回复。但是当我放大或缩小 pdf 时,它看起来很模糊。
    • 您将在缩放后再次绘制您的 pdf 以消除模糊效果。
    • @SauravSinha。很高兴它有帮助!。
    【解决方案3】:

    Generate PDF from Html Page. 我希望这会对你有所帮助。

    【讨论】:

    • 感谢您的回复。我已经使用了这种方法,但是在这种技术中,当我放大或缩小时,pdf 看起来很模糊。如果您有其他技术,请回复我。
    • @SauravSinha 你可能想检查我的链接以及像 Vignesh 所说的带有石英 2d 链接的绘图
    • 感谢 Rohan 对我的支持。
    • 链接失效
    【解决方案4】:

    Get a PDF/PNG as output from a UIWebView or UIView

    这是一个很好的 SO 问题,具有相同的方法..

    但是要以编程方式创建 pdf,您可以从这里开始 在 iPhone 上生成 PDF:

    http://iphonesdksnippets.com/post/2009/02/13/Generate-PDF-on-iPhone.aspx

    还有:

    使用 Quartz2d 绘图:

    http://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/drawingwithquartz2d.pdf

    【讨论】:

      猜你喜欢
      • 2012-10-25
      • 2011-10-18
      • 2011-05-25
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 2017-05-28
      • 2012-07-10
      相关资源
      最近更新 更多