有没有办法在iOs中从XML/HTML模板生成PDF文件

有没有办法在iOs中从XML/HTML模板生成PDF文件,ios,xml,ipad,pdf-generation,Ios,Xml,Ipad,Pdf Generation,我正在创建一个iPad应用程序,因为我必须使用不同的PDF格式。我得到了一些使用Quartz2D通过代码生成PDF文件的方法。但我必须通过代码编写整个表单。我可能需要在将来更新PDF表单,所以我必须再次编写代码。所以我听说有一个名为iTextSharp的组件用于.NETPDF创建-iOS有类似的组件吗?因此,我可以使用一些XML模板来创建PDF文件。 请帮助,谢谢我使用iOS打印子系统和UIMarkupTextPrintFormatter在我的应用程序中执行此操作。诀窍是编写您自己的自定义UIP

我正在创建一个iPad应用程序,因为我必须使用不同的PDF格式。我得到了一些使用Quartz2D通过代码生成PDF文件的方法。但我必须通过代码编写整个表单。我可能需要在将来更新PDF表单,所以我必须再次编写代码。所以我听说有一个名为iTextSharp的组件用于.NETPDF创建-iOS有类似的组件吗?因此,我可以使用一些XML模板来创建PDF文件。
请帮助,谢谢

我使用iOS打印子系统和UIMarkupTextPrintFormatter在我的应用程序中执行此操作。诀窍是编写您自己的自定义UIPrintPageRenderer,覆盖并返回paperRect和numberOfPages中的正确值。您将向自定义UIPrintPageRenderer添加UIMarkupTextPrintFormatter

然后,在自定义UIPrintPageRenderer的上下文中,需要与此类似的例程:

- (CGRect) paperRect
{
    if (!_generatingPdf)
        return [super paperRect];

    return UIGraphicsGetPDFContextBounds();
}

- (CGRect) printableRect
{
    if (!_generatingPdf)
        return [super printableRect];

    return CGRectInset( self.paperRect, 20, 20 );
}

- (NSData*) printToPDF
{
    _generatingPdf = YES;

    NSMutableData *pdfData = [NSMutableData data];

    UIGraphicsBeginPDFContextToData( pdfData, CGRectMake(0, 0, 792, 612), nil );  // letter-size, landscape

    [self prepareForDrawingPages: NSMakeRange(0, 1)];

    CGRect bounds = UIGraphicsGetPDFContextBounds();

    for ( int i = 0 ; i < self.numberOfPages ; i++ )
    {
        UIGraphicsBeginPDFPage();

        [self drawPageAtIndex: i inRect: bounds];
    }

    UIGraphicsEndPDFContext();

    _generatingPdf = NO;

//    NSString* filename = @"/Volumes/Macintosh HD 2/test.pdf";
//    [pdfData writeToFile: filename  atomically: YES];

    return pdfData;
}
-(CGRect)paperRect
{
如果(!\u生成PDF)
返回[超级纸质];
返回UIGraphicsGetPDFContextBounds();
}
-(CGRect)可打印RECT
{
如果(!\u生成PDF)
返回[super-printableRect];
返回CGRectInset(self.paperRect,20,20);
}
-(NSData*)printToPDF
{
_生成PDF=是;
NSMutableData*pdfData=[NSMutableData];
UIGraphicsBeginPDFContextToData(pdfData,CGRectMake(0,0792612),nil);//字母大小,横向
[self prepareForDrawingPages:nsMakerRange(0,1)];
CGRect bounds=UIGraphicsGetPDFContextBounds();
对于(int i=0;i汤姆斯威夫特:同意他的回答,但我想用更好的方式解释

要从
UIWebView
创建
PDF
,请将HTML加载到您的WebView,或者您的WebView可能也会隐藏以生成PDF,但过程保持不变 1) 添加了
UIPrintPageRenderer
类别
,用于在需要使用WebView.viewPrintFormatter时获取PDF数据 3) 处理如何创建PDF
您是从XML模板生成PDF文件的吗?谢谢,您救了我的命!顺便问一下,应用商店允许这种方法吗?@ChenXin;我有一个应用程序被批准使用这种技术。哇,非常感谢!这是一种创建PDF文件的好方法,比使用核心图形更好、更容易。@TomSwift使用这种技术渲染图像了吗?我尝试了几个选项(自定义NSURLProtocol、本地文件URL、base64图像嵌入),但似乎没有任何效果。。。有什么帮助吗?我用的是同样的方法。但若我将左填充和右填充设置为>0,那个么HTML中的图像是从右侧剪切的。有什么建议吗……?@san:以上这些话对我来说意义重大,而不是投票。你是welcome@PareshNavadiya我用了这个方法。一切都很好。但是文本在页面之间被打断了。有没有办法修复它。
@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
#define kPaperSizeA4 CGSizeMake(595.2,841.8)
//create print renderer
UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init];
[render addPrintFormatter:yourWebView.viewPrintFormatter startingAtPageAtIndex:0];

//provide padding ---- increase these values according to your requirement
float topPadding = 10.0f;
float bottomPadding = 10.0f;
float leftPadding = 10.0f;
float rightPadding = 10.0f;

//provide rect for printing and for actual PDF Rect of page
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"];

//category created above is used here 
NSData *pdfData = [render printToPDF];
//Save PDF to directory for usage
if (pdfData) {
  [pdfData writeToFile:[NSString stringWithFormat:@"%@/tmp.pdf",NSTemporaryDirectory()] atomically: YES];
}
else
{
  NSLog(@"PDF couldnot be created");
}