我按照以下示例在我的应用程序(Xamarin.iOS)中查看pdf.一切正常,直到最近我才开始注意到使用这种方法无法读取一些pdf文件.
我打开并获取了我的mac信息,我注意到以下内容:
我可以使用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.在测试并读取二进制数据之后,我注意到原始数据和导出数据都具有相同类型的压缩.(当我尝试解决这个问题时,会更新更多信息.)
我的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) 如何获取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,/被覆盖页面中的内容).
我想在iOS中合并两个PDF文件.我正在逐页合并.如果文件非常大,则需要花费大量时间.有什么办法,我们可以合并这两个文件,而不是逐页合并?
如果你愿意,我可以发布我的代码.
我的代码类似于SO上的那个
我正在努力使用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) 我正在查看Apple的ZoomingPDFViewer示例(来自链接的源代码).当它运行时,它会给出这个错误:
ZoomingPDFViewer[5751] <Error>: KSTFBB+Helvetica: FT_Load_Glyph failed: error 133.
Run Code Online (Sandbox Code Playgroud)
它发生在行100的ZoomingPDFViewer:
CGContextDrawPDFPage(context, page);
Run Code Online (Sandbox Code Playgroud)
有没有人知道为什么会这样,以及如何解决它?
我对这个问题很感兴趣.我在这里几乎阅读了关于它的每一篇文章,如果有人能在正确的方向上推动我,我将非常感激.
我有一个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代码.
任何帮助将不胜感激.
我正在开发一个应用程序,我想在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) 我试图用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)