将 PDFPage 添加到 PDFDocument 时 PDFView 不更新

Posted

技术标签:

【中文标题】将 PDFPage 添加到 PDFDocument 时 PDFView 不更新【英文标题】:PDFView doesn't update when adding PDFPage to the PDFDocument 【发布时间】:2014-02-02 23:27:55 【问题描述】:

我正在制作一个扫描多页 pdf 文件的应用程序。我有一个 PDFView 和一个 PDFThumbnailView 链接。第一次完成扫描时,我创建一个新的PDFDocument 并将其设置为PDFView。然后,每当完成另一次扫描时,我都会将 PDFPage 添加到 [pdfView document]

现在的问题是每当添加页面时,PDFViewPDFThumbnailView 都不会更新以显示带有额外页面的新文档。直到我放大或缩小,它们都会更新以显示带有新页面的文档。

我现在的临时解决方案(放大然后自动缩放)肯定不是最好的解决方案。例如,当您已经放大文档并扫描新页面时,视图将自动缩放。我之前尝试过[pdfView setNeedsDisplay:YES],但这似乎不起作用。

这是扫描到达NSData的方法:

- (void)scannerDevice:(ICScannerDevice *)scanner didScanToURL:(NSURL *)url data:(NSData *)data 
    //Hide the progress bar
    [progressIndicator stopAnimation:nil];

    //Create a pdf page from the data
    NSImage *image = [[NSImage alloc] initWithData:data];
    PDFPage *page = [[PDFPage alloc] initWithImage:image];

    //If the pdf view has a document
    if ([pdfView document]) 
        //Set the page number and add it to the document
        [page setValue:[NSString stringWithFormat:@"%d", [[pdfView document] pageCount] + 1] forKey:@"label"];
        [[pdfView document] insertPage:page atIndex:[[pdfView document] pageCount]];
     else 
        //Create a new document and add the page
        [page setValue:@"1" forKey:@"label"];
        PDFDocument *document = [[PDFDocument alloc] init];
        [document insertPage:page atIndex:0];
        [pdfView setDocument:document];
    

    //Force a redraw for the pdf view so the pages are shown properly
    [pdfView zoomIn:self];
    [pdfView setAutoScales:YES];

有谁知道我可以添加PDFPage 并更新PDFView 而不会弄乱PDFView 的缩放状态的方法吗?

【问题讨论】:

如果你只调用 [pdfView setNeedsDisplay:YES] 会发生什么? 【参考方案1】:

需要手动调用:

- (void)layoutDocumentView

我想不手动调用它的原因是允许将多个更改合并到一个更新中。

这是记录在案的:

PDFView 实际上包含几个子视图,比如文档 视图(实际绘制 PDF 的位置)和“蒙版视图”(可能 在 PDF 内容周围显示为灰色区域,具体取决于 缩放)。更改 PDF 内容可能需要更改这些 内部视图,因此如果您使用 PDF,则必须显式调用此方法 套件实用程序类以添加或删除页面、旋转页面或执行 影响可见布局的其他操作。

此方法从影响 PDFView 的方法中自动调用 可见布局(例如 setDocument:、setDisplayBox: 或 zoomIn:)。

【讨论】:

我投了赞成票,希望答案会奏效,在我的情况下购买(macOS 10.12)我无法显示我刚刚绘制的注释 您找到解决问题的方法了吗?这些问题似乎在最新版本的 PDFKit 中继续存在。【参考方案2】:

到目前为止,我使用注释手动刷新 PDFView 的最佳解决方案是将 PDFView 移动到另一个页面并返回到您需要刷新的页面,因为:

- (void)layoutDocumentView 在我的情况下对我不起作用。

然后:

[self.pdfView goToLastPage:nil];
[self.pdfView goToPage:destinationPage];

【讨论】:

感谢您的解决方法。但这不会设置确切的偏移量,您是如何管理的。

以上是关于将 PDFPage 添加到 PDFDocument 时 PDFView 不更新的主要内容,如果未能解决你的问题,请参考以下文章

如何将上下文菜单项添加到FlowDocumentScrollViewer内的textBox

PDFKit 和 PDFDocument 注释在 Adob​​e Acrobat 中不可见

如何将 List<PdfDocument> 合并为单个 PdfDocument

如何在 PDFView 中移动 PDFPage 上的 PDFAnnotation?

我们如何在 IOS swift 4 中编辑 PDFPage 文本?

从 macOS 应用程序打印 PDF - 将上下文定义为 PDFDocument