iOS - 如何在横向生成 PDF

Posted

技术标签:

【中文标题】iOS - 如何在横向生成 PDF【英文标题】:iOS - how to generate PDF in landscape 【发布时间】:2017-06-14 19:10:03 【问题描述】:

我很难确定如何正确地横向打印。这是我用作 UIPrintPageRenderer 子类的自定义打印页面渲染器:

  @implementation CustomPrintPageRenderer

- (instancetype)init
  self = [super init];
  if (self) 
    self.A4PageWidth = 595.2;
    self.A4PageHeight = 841.8;
    CGRect pageFrame = CGRectMake(0.0, 0.0, self.A4PageWidth, self.A4PageHeight);
    [self setValue:[NSValue valueWithCGRect:pageFrame] forKey:@"paperRect"];
    [self setValue:[NSValue valueWithCGRect:CGRectInset(pageFrame, 1.0, 1.0)] forKey:@"printableRect"];
  
  return self;


@end

下面是获取 html、生成 PDF 并返回文件路径的代码(这是一个 1024 像素宽的表单,对于客户来说必须是这个宽度):

`-(NSString *) exportHTMLContentToPDF 
  CustomPrintPageRenderer *cppr = [[CustomPrintPageRenderer alloc]init];
  UIMarkupTextPrintFormatter *printFormatter = [[UIMarkupTextPrintFormatter alloc]initWithMarkupText:self.finalHTML];
  [cppr addPrintFormatter:printFormatter startingAtPageAtIndex:0];
  NSData * pdfData = [self drawPDF:cppr];
  NSString *fileName = [NSString stringWithFormat:@"%@.pdf", self.ts.timesheetID];
  NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:fileName];
  [pdfData writeToFile:filePath atomically:YES];
  return filePath;

-(NSData *)drawPDF:(CustomPrintPageRenderer *)cppr 
  NSMutableData *data = [[NSMutableData alloc]init];
  UIGraphicsBeginPDFContextToData(data, CGRectZero, nil);
  UIGraphicsBeginPDFPage();
  [cppr drawPageAtIndex:0 inRect:UIGraphicsGetPDFContextBounds()];
  UIGraphicsEndPDFContext();
  return data;
`

目前,这可以很好地以纵向打印页面,但由于它的宽度,它会强制它适应纵向宽度并缩小内容。如果我交换 A4 高度/宽度尺寸,它不再缩小内容,而是从右侧切断大约 20%(这里是眼球)的内容。

编辑:这仅适用于单页文档。查看如何在绘制 PDF 上下文之前对其进行转换。

所以也许我想错了。调整宽度/高度以使其布局像横向没有任何作用。它仍然打印肖像。所以我需要确定如何保持纵向大小,但在生成 PDF 数据之前将整个 HTML 页面向左旋转 90 度......如果这可行或不可行,稍后会更新。否则任何其他建议将不胜感激!

【问题讨论】:

你有什么发现吗?? 【参考方案1】:

我有同样的问题,搜索后没有找到。所以我只是查看了我自己的代码进行一些修改。这是符合我期望的代码。

只需替换 UIGraphicsBeginPDFContextToData(data, CGRectZero, nil); 以下UIGraphicsBeginPDFContextToData(data, CGRectMake(0, 0, A4PageHeight, A4PageWidth), nil); 同时从上下文生成pdf。

也改变CustomPrintPageRendererpaperRect,如下所示。CGRect pageFrame = CGRectMake(0.0, 0.0, self.A4PageHeight, self.A4PageWidth);

【讨论】:

以上是关于iOS - 如何在横向生成 PDF的主要内容,如果未能解决你的问题,请参考以下文章

如何以横向模式打印 PDF

Reportlab:如何在纵向和横向之间切换?

iOS:如何在 pdf 生成中绘制文本时设置字体?

如何查找PDF是横向还是纵向

如何在 iPhone SDK 中检测 PDF 文档的方向

同一pdf中的横向和纵向