Objective c 在Ipad中直接从UiTextView创建多页PDF
我已经创建了具有特定布局的pdf。问题是,当文本视图的内容很长时,Pdf不会自动生成新页面,并且我无法预定义在运行时将创建多少页面。有人能帮我吗Objective c 在Ipad中直接从UiTextView创建多页PDF,objective-c,pdf-generation,Objective C,Pdf Generation,我已经创建了具有特定布局的pdf。问题是,当文本视图的内容很长时,Pdf不会自动生成新页面,并且我无法预定义在运行时将创建多少页面。有人能帮我吗 //StartNewPage UIGraphicsBeginPDFPageWithInfo(pageFrame, nil); 如果输入的文本超过页面框架设置,请在textview中查找文本的高度调用此方法 PageFrame是pdf的新页面框架您可以尝试使用此代码,这可能会对您有所帮助 在Interface build
//StartNewPage
UIGraphicsBeginPDFPageWithInfo(pageFrame, nil);
如果输入的文本超过页面框架设置,请在textview中查找文本的高度调用此方法
PageFrame是pdf的新页面框架您可以尝试使用此代码,这可能会对您有所帮助 在Interface builder中保留一个textview和一个按钮,并使用按钮操作方法生成pdf 导入这些框架
#import <QuartzCore/QuartzCore.h>
#import <CoreText/CoreText.h>
-(NSString*)getPDFFileName
{
NSString* fileName = @"sample.PDF";
NSArray *arrayPaths =
NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory,
NSUserDomainMask,
YES);
NSString *path = [arrayPaths objectAtIndex:0];
NSString* pdfFileName = [path stringByAppendingPathComponent:fileName];
return pdfFileName;
}
-(IBAction)PdfGeneration:(id)sender{
// Prepare the text using a Core Text Framesetter.
CFAttributedStringRef currentText = CFAttributedStringCreate(NULL, (__bridge CFStringRef)txtObj.text, NULL);
if (currentText) {
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(currentText);
if (framesetter) {
NSString *pdfFileName = [self getPDFFileName];
// Create the PDF context using the default page size of 612 x 792.
UIGraphicsBeginPDFContextToFile(pdfFileName, CGRectZero, nil);
CFRange currentRange = CFRangeMake(0, 0);
NSInteger currentPage = 0;
BOOL done = NO;
do {
UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 612, 792), nil);
currentPage++;
[self drawPageNumber:currentPage];
currentRange = [self renderPage:currentPage withTextRange:currentRange andFramesetter:framesetter];
if (currentRange.location == CFAttributedStringGetLength((CFAttributedStringRef)currentText))
done = YES;
} while (!done);
UIGraphicsEndPDFContext();
CFRelease(framesetter);
} else {
NSLog(@"Could not create the framesetter needed to lay out the atrributed string.");
}
// Release the attributed string.
CFRelease(currentText);
} else {
NSLog(@"Could not create the attributed string for the framesetter");
}
}
// Use Core Text to draw the text in a frame on the page.
- (CFRange)renderPage:(NSInteger)pageNum withTextRange:(CFRange)currentRange
andFramesetter:(CTFramesetterRef)framesetter
{
// Get the graphics context.
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextSetTextMatrix(currentContext, CGAffineTransformIdentity);
CGRect frameRect = CGRectMake(72, 72, 468, 648);
CGMutablePathRef framePath = CGPathCreateMutable();
CGPathAddRect(framePath, NULL, frameRect);
CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, currentRange, framePath, NULL);
CGPathRelease(framePath);
CGContextTranslateCTM(currentContext, 0, 792);
CGContextScaleCTM(currentContext, 1.0, -1.0);
CTFrameDraw(frameRef, currentContext);
currentRange = CTFrameGetVisibleStringRange(frameRef);
currentRange.location += currentRange.length;
currentRange.length = 0;
CFRelease(frameRef);
return currentRange;
}
- (void)drawPageNumber:(NSInteger)pageNum
{
NSString *pageString = [NSString stringWithFormat:@"Page %d", pageNum];
UIFont *theFont = [UIFont systemFontOfSize:12];
CGSize maxSize = CGSizeMake(612, 72);
CGSize pageStringSize = [pageString sizeWithFont:theFont constrainedToSize:maxSize lineBreakMode:UILineBreakModeClip];
CGRect stringRect = CGRectMake(((612.0 - pageStringSize.width) / 2.0),720.0 + ((72.0 - pageStringSize.height) / 2.0),pageStringSize.width,pageStringSize.height);
[pageString drawInRect:stringRect withFont:theFont];
}
#导入
#进口
-(NSString*)GetPdfileName
{
NSString*fileName=@“sample.PDF”;
NSArray*阵列路径=
NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory,
NSUserDomainMask,
是的);
NSString*path=[ArrayPath对象索引:0];
NSString*pdfFileName=[path stringByAppendingPathComponent:fileName];
返回pdfFileName;
}
-(iAction)PDF生成:(id)发送方{
//使用核心文本框架设置器准备文本。
CFAttributedStringRef currentText=CFAttributedStringCreate(NULL,(u桥CFStringRef)txtObj.text,NULL);
如果(当前文本){
CTFramesetterRef framesetter=CTFramesetterCreateWithAttributedString(currentText);
if(帧设置器){
NSString*pdfFileName=[self getPDFFileName];
//使用默认页面大小612 x 792创建PDF上下文。
UIGraphicsBeginPDFContextToFile(pdfFileName、CGRectZero、nil);
CFRange currentRange=CFRangeMake(0,0);
NSInteger currentPage=0;
BOOL done=否;
做{
UIGraphicsBeginPDFPageWithInfo(CGRectMake(0,0612792),无);
currentPage++;
[自动绘图页码:当前页];
currentRange=[self-renderPage:currentPage withTextRange:currentRange和framesetter:framesetter];
if(currentRange.location==CFAttributedStringGetLength((CFAttributedStringRef)currentText))
完成=是;
}而(!完成);
UIGraphicsSendPdfContext();
CFRelease(框架设置器);
}否则{
NSLog(@“无法创建布局已分发字符串所需的框架设置程序。”);
}
//释放属性化字符串。
CFRelease(当前文本);
}否则{
NSLog(@“无法为框架设置程序创建属性字符串”);
}
}
//使用核心文本在页面上的框架中绘制文本。
-(CFRange)renderPage:(NSInteger)pageNum withTextRange:(CFRange)currentRange
andFramesetter:(CTFramesetterRef)framesetter
{
//获取图形上下文。
CGContextRef currentContext=UIGraphicsGetCurrentContext();
CGContextSetTextMatrix(currentContext,CGAffineTransformity);
CGRect frameRect=CGRectMake(72,72468648);
CGMutablePathRef framePath=CGPathCreateMutable();
CGPathAddRect(framePath,NULL,frameRect);
CTFrameRef frameRef=CTFramesetterCreateFrame(framesetter,currentRange,framePath,NULL);
cgpathlease(framePath);
CgContextTranslateCm(currentContext,0792);
CGContextScaleCTM(currentContext,1.0,-1.0);
CTFrameDraw(frameRef,currentContext);
currentRange=CTFrameGetVisibleStringRange(frameRef);
currentRange.location+=currentRange.length;
currentRange.length=0;
CFRelease(frameRef);
返回电流范围;
}
-(无效)drawPageNumber:(NSInteger)pageNum
{
NSString*pageString=[NSString stringWithFormat:@“第%d页”,pageNum];
UIFont*字体=[UIFont systemFontOfSize:12];
cgsizemaxsize=CGSizeMake(612,72);
CGSize pageStringSize=[pageString sizeWithFont:theFont constrainedToSize:maxSize lineBreakMode:UILineBreakModeClip];
CGRect stringRect=CGRectMake((612.0-pageStringSize.width)/2.0),720.0+((72.0-pageStringSize.height)/2.0),pageStringSize.width,pageStringSize.height);
[pageString drawInRect:stringRect with Font:theFont];
}
许多用户正在搜索与SWIFT版本兼容的代码。这是swift 4和5的版本。
//PDF名称并在本地路径上生成:
func writeToPDF(filenameStr:String)
{
pageSize = CGSize.init(width: 768, height: 10000)
// let fileName: NSString = "test.pdf"
let fileName = String.init(format: "%@.pdf", filenameStr)
let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let pdfPathWithFileName = documentDirectory.appending("/" + fileName)// documentDirectory.appending(fileName as String)
self.PdfGeneration(filePath: pdfPathWithFileName)
//lines written to get the document directory path for the generated pdf file.
if let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.path {
print("documentsPath",documentsPath)
// “var/folder/…/documents ” copy the full path
}
}
//方法生成pdf文件以在pdf文件中显示文本和图像
func PdfGeneration(filePath: String)
{
// Prepare the text using a Core Text Framesetter.
//CFAttributedStringRef currentText = CFAttributedStringCreate(NULL, (__bridge CFStringRef)txtObj.text, NULL);
let currentText = CFAttributedStringCreate(nil, (self.textVW_file.text as? CFString?)!, nil)
if(currentText != nil)
{
let framesetter = CTFramesetterCreateWithAttributedString(currentText!)
if (framesetter != nil) {
UIGraphicsBeginPDFContextToFile(filePath, .zero, nil)
var currentRange = CFRangeMake(0, 0)
var currentPage = 0
var done = false
repeat {
repeat {
UIGraphicsBeginPDFPageWithInfo(CGRect.init(x:0, y:0, width:612, height:792), nil)
currentPage = currentPage + 1
self.drawPageNumber(currentPage)
currentRange = self.renderPage(currentPage, withTextRange: currentRange, andFramesetter: framesetter)
let aText:CFAttributedString = currentText!
print("currentText %@",currentText!)
print("currentRange.location %@ and %@",currentRange.location,CFAttributedStringGetLength(aText))
if (currentRange.location == CFAttributedStringGetLength(aText)) {
done = true
}
}while (!done)
UIGraphicsEndPDFContext()
}
else
{
print("Could not create the framesetter needed to lay out the atrributed string.")
}
}
else
{
print("Could not create the framesetter needed to lay out the atrributed string.")
}
}
//使用核心文本在页面上的框架中绘制文本
func renderPage(_ pageNum: Int, withTextRange currentRange: CFRange, andFramesetter framesetter: CTFramesetter?) -> CFRange {
var currentRangeIn:CFRange
let currentContext = UIGraphicsGetCurrentContext()
currentContext?.textMatrix = .identity
let frameRect = CGRect(x: 72, y: 72, width: 468, height: 648)
let framePath = CGMutablePath()
framePath.addRect(frameRect, transform: .identity)
let frameRef = CTFramesetterCreateFrame(framesetter!, currentRange, framePath, nil)
currentContext?.translateBy(x: 0, y: 792)
currentContext?.scaleBy(x: 1.0, y: -1.0)
CTFrameDraw(frameRef, currentContext!)
currentRangeIn = currentRange
currentRangeIn = CTFrameGetVisibleStringRange(frameRef)
currentRangeIn.location += currentRange2.length
currentRangeIn.length = 0
return currentRangeIn
}
//并在底部绘制页码
func drawPageNumber(_ pageNum: Int) {
let pageString = "Page \(pageNum)"
let theFont = UIFont.systemFont(ofSize: 12)
let maxSize = CGSize(width: 612, height: 72)
let pageStringSize: CGSize = pageString.size(withAttributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14.0)])
//let pageStringSize = pageString.size(with: theFont, constrainedTo: maxSize, lineBreakMode: [])
let stringRect = CGRect(x: (612.0 - pageStringSize.width) / 2.0, y: 720.0 + ((72.0 - pageStringSize.height) / 2.0), width: pageStringSize.width, height: pageStringSize.height)
pageString.draw(in: stringRect, withAttributes: [NSAttributedString.Key.font : theFont])
}
…第一次欢迎,,,您必须尝试吗?您是否尝试过这样做,您是否完成了回复。这是否会根据textView中字符串的长度生成多页PDF文件?