gpt4 book ai didi

swift - 创建分页 PDF—Mac OS X

转载 作者:IT王子 更新时间:2023-10-29 05:36:51 25 4
gpt4 key购买 nike

我正在制作一个 Mac 应用程序(在 Swift 3 中使用 Xcode 8,Beta 5),用户可以使用它做一个长笔记并将其导出为 PDF。

要创建此 PDF,我使用 Cocoa 的 dataWithPDF:使用以下代码的方法:

do {
// define bounds of PDF as the note text view
let rect: NSRect = self.noteTextView.bounds
// create the file path for the PDF
if let dir = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.allDomainsMask, true).first {
// add the note title to path
let path = NSURL(fileURLWithPath: dir).appendingPathComponent("ExportedNote.pdf")
// Create a PDF of the noteTextView and write it to the created filepath
try self.noteTextView.dataWithPDF(inside: rect).write(to: path!)
} else {
print("Path format incorrect.") // never happens to me
}

} catch _ {
print("something went wrong.") // never happens to me
}

这完全有效,但有一个问题:PDF 只在一页上显示,这意味着当笔记中有很多文本时,页面会变得很长。在我的应用程序正在导出 PDF 时或之后,我如何强制将 PDF 放到尽可能多的信纸大小的页面上?

最佳答案

经过数周的挫折,我想出了在 Swift 应用程序中创建分页 PDF 的 final方法。而且它并不像看起来那么复杂(以下内容基于 Swift 2 ):

备注 :在您阅读更多内容之前,您应该知道我在 Github 上制作了一个简单的工具,因此您可以通过更少的步骤完成此操作(并且在 Swift 3 中不再需要任何 Objective-C)。 Check that out here .

第一步:正确设置您的应用沙盒。每个提交的 Mac 应用程序都需要正确的应用沙箱,所以最好现在只需要 30 秒来设置它。如果它尚未打开,请转到目标的设置,然后转到功能标题。打开应用沙盒,在顶部。您应该会看到许多子功能,启用您的应用程序需要的任何一项,并确保拥有 User Selected File设置为 Read/Write .

第 2 步:将此函数添加到您的代码中,这将创建一个不可见的 web View 并将您的文本添加到其中。

func createPDF(fromHTMLString: String) {
self.webView.mainFrame.loadHTMLString(htmlString, baseURL: nil)
self.delay(1) {
MyCreatePDFFile(self.webView)
}
}

第 3 步:创建 delay()允许 Xcode 等待一秒钟以将 HTML 加载到 Web View 中的函数。
 func delay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}

(注意:对于此函数的 Swift 3 版本, go here 。)

第 4 步:在您在步骤 2 中添加的函数上方添加我们的 WebView 的声明。
var webView = WebView()

第 5 步:您可能会注意到我们还没有创建 MyCreatePDFFile()功能呢。事实证明,无法使用 Swift 将此 WebView 转换为 PDF,因此我们将不得不转向 Objective-C(呻吟)。是的,您将不得不在 Swift 应用程序中运行一些 Objective-C。

第 6 步:创建一个 .m文件通过转到 File -> New -> File (或按 CMD + N)然后双击 Objective-C File .命名 CreatePDF.m并将其保留为空文件。

第七步:添加您的 .m 时文件,您应该会收到添加桥接头的提示:

enter image description here

点击 Yes .

如果你没有看到提示,或者不小心删除了你的桥接头,添加一个新的 .h文件到您的项目并将其命名 <#YourProjectName#>-Bridging-Header.h
在某些情况下,尤其是在使用 ObjC 框架时,您不会显式添加 Objective-C 类,并且 Xcode 找不到链接器。在这种情况下,创建您的桥接头 .h如上所述命名的文件,然后确保将其路径链接到目标的项目设置中,如下所示:

enter image description here

第 8 步:创建一个 .h文件通过转到 File -> New -> File (或按 CMD + N)然后双击 Header File .命名 CreatePDF.h .

第 9 步:在您的 CreatePDF.h文件,添加以下代码,导入 Cocoa 和 WebKit 并设置您的 PDF 创建功能:
#ifndef CreatePDF_h
#define CreatePDF_h

#import <Cocoa/Cocoa.h>
#import <WebKit/WebKit.h>

@interface Thing : NSObject

void MyCreatePDFFile(WebView *thewebview);

@end


#endif /* CreatePDF_h */

第 10 步:是时候设置 .m用于 PDF 创建功能的文件。首先将其添加到空 .m文件:
#import "CreatePDF.h"
#import <Cocoa/Cocoa.h>
#import <WebKit/WebKit.h>

@implementation Thing

void MyCreatePDFFile(WebView *thewebview) {

}
@end

第 11 步:现在您可以将代码添加到 MyCreatePDFFile(..)功能。这是函数本身(它位于当前为空的 void 函数中):
NSDictionary *printOpts = @{
NSPrintJobDisposition: NSPrintSaveJob // sets the print job to save the PDF instead of print it.
};
NSPrintInfo *printInfo = [[NSPrintInfo alloc] initWithDictionary:printOpts];
[printInfo setPaperSize:NSMakeSize(595.22, 841.85)]; // sets the paper size to a nice size that works, you can mess around with it
[printInfo setTopMargin:10.0];
[printInfo setLeftMargin:10.0];
[printInfo setRightMargin:10.0];
[printInfo setBottomMargin:10.0];
NSPrintOperation *printOp = [NSPrintOperation printOperationWithView:[[[thewebview mainFrame] frameView] documentView] printInfo:printInfo]; // sets the print operation to printing the WebView as a document with the print info set above
printOp.showsPrintPanel = NO; // skip the print question and go straight to saving pdf
printOp.showsProgressPanel = NO;
[printOp runOperation];

第 12 步:现在将其添加到您的桥接头中,以允许您的 Swift 文件查看您刚刚创建的 Objective-C 函数。
#import "CreatePDF.h"

第 13 步:这段代码不应该有任何错误,但如果有,请在下面评论它们。

第 14 步:拨打 createPDF从 Swift 文件的任何位置调用函数,请执行以下操作:
createPDF("<h1>Title!</h1><p>\(textview.text!)</p>")

你在里面看到的字符串 createPDF是 HTML,可以编辑为任何 HTML。如果您不懂 HTML,可以查看一些非常基础的内容 right here .

应该是这样! 您现在应该能够在 Cocoa/Mac 应用程序上直接从 Swift 创建分页 PDF。

学分
  • How to run Objective-C code in a Swift project ,感谢马特。
  • How to write a PDF from a WebView in Obj-C ,感谢一些随机的网络论坛。
  • How to create a bridging header manually ,感谢洛根。
  • Delay function in Swift ,感谢马特。
  • Images ,感谢洛根。

  • 注意:此答案经过测试可与 Xcode 7、Swift 2 和 OS X El Captian 一起使用。如果您在 Xcode 8/Swift 3/macOS Sierra 上使用它时遇到任何问题,请告诉我。

    关于swift - 创建分页 PDF—Mac OS X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39135233/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com