标签: cgpdf

CGPDFDocument无法读取pdf

我按照以下示例在我的应用程序(Xamarin.iOS)中查看pdf.一切正常,直到最近我才开始注意到使用这种方法无法读取一些pdf文件.

我打开并获取了我的mac信息,我注意到以下内容:

  • 如果我使用Mac查看器将文档导出为pdf,它可以很好地读取,但尺寸会增加.
  • 如果我尝试按原样打开文件,则无法查看任何内容,只能查看白页.
  • 这仅适用于我的iOS应用,我的Android上的查看器工作得很好.

我可以使用Mac的查看器将每个文件导出为pdf,但这比我需要的更多.我该怎么做才能解决这个问题?

原始编码:Adobe Acrobat 10.1.16中的PDFScanLib v1.2.2

导出编码:Mac OS X 10.10.5 Quartz PDFContext


我对该程序运行了额外的测试,我可以得出结论问题是在pdf文件上使用了压缩.CGPDFDocument有没有办法删除或忽略压缩,所以我可以查看pdf?我将pdf上传到我分割页面的移动后端.我正在使用Pdfsharp来实现这一目标,如果可能的话有没有办法在保存到服务器之前清理文件?(此问题仅影响我的应用程序的iOS版本).


经过额外的测试后,我遇到了以下错误:这里 看起来使用的JBIG2压缩有一个已知的错误,当在pdf中读取jpg时会导致错误.(我将继续进一步测试,直到找到解决方案.)


更正:pdf压缩不是JBIG2,而是FlateDecode.在测试并读取二进制数据之后,我注意到原始数据和导出数据都具有相同类型的压缩.(当我尝试解决这个问题时,会更新更多信息.)

c# xamarin.ios pdfrenderer ios cgpdf

11
推荐指数
1
解决办法
460
查看次数

调用CGPDFContextClose时的EXC_BAD_ACCESS

我的iPad应用程序EXC_BAD_ACCESS在调用中遇到CGPDFContextClose以下方法中的消息.它只发生在某些页面上,并且目前只针对一个文档(不幸的是,这恰好是我们的帮助文档).

- (CGPDFDocumentRef)newSinglePageDocumentFromDocument:(CGPDFDocumentRef)document page:(NSInteger)pageNumber
{
    CGPDFDocumentRef sourceDocument = CGPDFDocumentRetain(document);
    CGPDFDocumentRef newDocument = NULL;

    CFMutableDataRef consumerData = CFDataCreateMutable(kCFAllocatorDefault, 0);
    CGDataConsumerRef contextConsumer = CGDataConsumerCreateWithCFData(consumerData);

    CGPDFPageRef page = CGPDFDocumentGetPage(sourceDocument, pageNumber);
    const CGRect mediaBox = CGPDFPageGetBoxRect(page, kCGPDFCropBox);
    CGContextRef ctx = CGPDFContextCreate(contextConsumer, &mediaBox, NULL);

    if (ctx)
    {
        if (page)
        {
            CGPDFContextBeginPage(ctx, NULL);
            CGContextDrawPDFPage(ctx, page);
            CGPDFContextEndPage(ctx);
        }
        //EXC_BAD_ACCESS thrown here
        CGPDFContextClose(ctx);
        CGContextRelease(ctx);

        CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)consumerData);
        newDocument = CGPDFDocumentCreateWithProvider(provider);
        CGDataProviderRelease(provider);
    }
    CGDataConsumerRelease(contextConsumer);
    CFRelease(consumerData);
    CGPDFDocumentRelease(sourceDocument);

    return newDocument;
}
Run Code Online (Sandbox Code Playgroud)

失败的文档可以通过Mac上的预览打开.我无法直观地识别失败的页面和成功的页面之间的任何区别.

任何人都可以看到代码有什么问题,或者发现问题的建议?

编辑:EXC_BAD_ACCESS在CGPDFContextClose方法中引发,见下文:

0x00e93d0e  <+0000> …
Run Code Online (Sandbox Code Playgroud)

pdf exception objective-c ipad cgpdf

5
推荐指数
1
解决办法
1405
查看次数

CGPDFObject获取ID

如何获取CGPDFObject的ID?

我的PDF中有这本字典:

3 0 obj
<< /Type /Pages /MediaBox [0 0 612 792] /Count 5 /Kids [ 2 0 R 9 0 R 15 0 R
21 0 R 27 0 R ] >>
endobj
Run Code Online (Sandbox Code Playgroud)

我用它来获得:

CGPDFDictionaryRef pdfPagesObjectRef;
CGPDFDictionaryGetDictionary(pdfCatalogueRef, "Pages", &pdfPagesObjectRef);
Run Code Online (Sandbox Code Playgroud)

现在我知道CGPDFDictionaryApplyFunction要在字典中获取键/值对.但是如何获得自己的对象ID和代数?(在这种情况下为3和0).

编辑:为什么我需要这些信息?我正在尝试向文件添加文本注释.根据我的理解,在iOS中没有"高级"方法.您必须手动附加新部分(外部参照表,重写对象,预告片等).因此,不可避免地要获取我想要覆盖的对象的ID和世代号,以及我覆盖的对象中引用的那些(例如,/ Resources,/被覆盖页面中的内容).

pdf ios cgpdf

5
推荐指数
0
解决办法
196
查看次数

在iOS中合并2个pdf文件

我想在iOS中合并两个PDF文件.我正在逐页合并.如果文件非常大,则需要花费大量时间.有什么办法,我们可以合并这两个文件,而不是逐页合并?

如果你愿意,我可以发布我的代码.

我的代码类似于SO上的那个

pdf objective-c ios cgpdf

5
推荐指数
2
解决办法
3841
查看次数

UIGraphicsBeginPDFPage()在64位设备上随机崩溃(CGPDFSecurityManagerCreateDecryptor())

我正在努力使用pdf导出方法,该方法运行得很好,直到我将应用程序移植到arm64架构.

在Bacisally,该方法打开一个现有的PDF,它创建一个新的pdf文件,并在添加更多内容页面之前将第一个pdf的内容绘制到新创建的pdf中.

当该方法尝试为文档创建新的pdf页面时(在第一个pdf集成到新的pdf之后),应用程序崩溃,并在UIGraphicsBeginPDFPage()上发出EXC_BAD_ACCESS警告; 打电话.

它只发生在一些PDF文件中,而不是全部,只发生在64位设备上.

这是显示CGPDFSecurityManagerCreateDecryptor()调用的堆栈跟踪,我无法找到它的作用.

Thread 14Queue : NSOperationQueue 0x14f6dd3a0 :: NSOperation 0x17504a470 (serial)
#0     0x00000001838aeee4 in CGPDFSecurityManagerCreateDecryptor ()
#1     0x00000001838d1004 in pdf_filter_chain_create ()
#2     0x0000000183831e00 in CGPDFStreamCreateFilterChain ()
#3     0x000000018383226c in chain_get_bytes ()
#4     0x0000000183b5e0ac in unpackImageRow ()
#5     0x0000000183b5dfd4 in PDFImageEmitData ()
#6     0x0000000183b5f684 in emit_image ()
#7     0x0000000183b5ef9c in PDFImageEmitDefinition ()
#8     0x0000000183464584 in __CFSetApplyFunction_block_invoke ()
#9     0x00000001834643bc in CFBasicHashApply ()
#10     0x00000001834642e4 in CFSetApplyFunction ()
#11     0x0000000183b5fa9c in PDFImageSetEmitDefinitions ()
#12     0x0000000183b590c0 in emit_page_resources(PDFDocument*) () …
Run Code Online (Sandbox Code Playgroud)

pdf uikit quartz-2d ios cgpdf

5
推荐指数
1
解决办法
634
查看次数

来自CGContextDrawPDFPage <错误>的Apple的"ZoomingPDFViewer"代码示例中出现此错误:KSTFBB + Helvetica:FT_Load_Glyph失败:错误133

我正在查看Apple的ZoomingPDFViewer示例(来自链接的源代码).当它运行时,它会给出这个错误:

 ZoomingPDFViewer[5751] <Error>: KSTFBB+Helvetica: FT_Load_Glyph failed: error 133.
Run Code Online (Sandbox Code Playgroud)

它发生在行100ZoomingPDFViewer:

CGContextDrawPDFPage(context, page);
Run Code Online (Sandbox Code Playgroud)

有没有人知道为什么会这样,以及如何解决它?

ios cgpdf

4
推荐指数
1
解决办法
1193
查看次数

iOS PDF到纯文本解析器

我对这个问题很感兴趣.我在这里几乎阅读了关于它的每一篇文章,如果有人能在正确的方向上推动我,我将非常感激.

我有一个PDF,我想提取它的文本,我只对文字和空格感兴趣.我已经设置了CGPDFScanner和它的回调方法.我所读到的是,就提取文本而言,我只需要考虑4个运算符TJ,Tj,qout(')和doubleqout(").

我想我还需要跟踪文本空间,以便能够确定字母是组合在一起形成一个单词还是应该用空格分隔.但我不知道如何做到这一点.

在PDF中,所有文本都采用格式

[(X)-24.2524(X)-24.2524(X)-24.2524(Y)-24.2524(Y)-24.2524]TJ
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚(使用PDF规范)这些数字的含义.SO上有人说你不应该害怕PDF规范,但坦率地说,我发现它们不容易阅读/理解.

我研究过有用的PDFKitten代码.

任何帮助将不胜感激.

pdf text extract ios cgpdf

2
推荐指数
1
解决办法
794
查看次数

导致内存问题的CGPDFPage绘图(Swift 3)

我正在开发一个应用程序,我想在UICollectionView上实现PDF阅读器.

我在每个单元格上使用自定义UIView,呈现相应的PDF页面:

weak var page: CGPDFPage! {

    didSet { setNeedsDisplay() }

}

override func draw(_ rect: CGRect) {

    if page == nil {
        print("page is nil")
        return }

    let context = UIGraphicsGetCurrentContext()

    context?.clear(bounds)

    context?.setFillColor(red: 1, green: 1, blue: 1, alpha: 1)
    context?.fill(bounds)

    context?.translateBy(x: 0.0, y: bounds.size.height);
    context?.scaleBy(x: 1.0, y: -1.0);

    var cropBox = page.getBoxRect(.cropBox)
    cropBox = CGRect(x: cropBox.origin.x, y: cropBox.origin.y, width: ceil(cropBox.width), height: ceil(cropBox.height))

    let scaleFactor = min(bounds.size.width/cropBox.size.width, bounds.size.height/cropBox.size.height)
    let scale = CGAffineTransform(scaleX: scaleFactor, y: scaleFactor)
    let scaledInnerRect = cropBox.applying(scale) …
Run Code Online (Sandbox Code Playgroud)

core-graphics uiview ios cgpdf swift

2
推荐指数
1
解决办法
642
查看次数

如何更改CGPDFPageRef的背景颜色,以及如何删除页面的阴影

我试图用a UIWebView而不是a 来绘制内容UIView,因为我喜欢UIWebView通过捏合放大和缩小的能力.这是我的代码:

// setup environment
CGRect outputRect = myWebView.bounds;
CFMutableDataRef data = CFDataCreateMutable(NULL, 0); // init with default allocator and unlimited size
CGDataConsumerRef dataConsumer = CGDataConsumerCreateWithCFData(data);
CGContextRef pdfContext = CGPDFContextCreate(dataConsumer, &outputRect, NULL);

CGPDFContextBeginPage(pdfContext, NULL);

// draw something
CGContextSetRGBFillColor (pdfContext, 1, 0, 0, 1);
CGContextFillRect (pdfContext, CGRectMake (0, 0, 200, 100 ));
CGContextSetRGBFillColor (pdfContext, 0, 0, 1, .5);
CGContextFillRect (pdfContext, CGRectMake (0, 0, 100, 200 ));

CGPDFContextEndPage(pdfContext);

// load drawing in webView
[myWebView loadData:(NSData *)data …
Run Code Online (Sandbox Code Playgroud)

pdf-generation uiwebview cgpdfdocument ios cgpdf

0
推荐指数
1
解决办法
1298
查看次数