pdfrb 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rspec +2 -0
- data/.rubocop.yml +22 -0
- data/.rubocop_todo.yml +819 -0
- data/.yardopts +4 -0
- data/CHANGELOG.md +226 -0
- data/CLAUDE.md +110 -0
- data/Gemfile +13 -0
- data/LICENSE +25 -0
- data/README.adoc +88 -0
- data/Rakefile +45 -0
- data/benchmarks/bench.rb +49 -0
- data/data/pdfrb/afm/Courier-Bold.afm +342 -0
- data/data/pdfrb/afm/Courier-BoldOblique.afm +342 -0
- data/data/pdfrb/afm/Courier-Oblique.afm +342 -0
- data/data/pdfrb/afm/Courier.afm +342 -0
- data/data/pdfrb/afm/Helvetica-Bold.afm +2827 -0
- data/data/pdfrb/afm/Helvetica-BoldOblique.afm +2827 -0
- data/data/pdfrb/afm/Helvetica-Oblique.afm +3051 -0
- data/data/pdfrb/afm/Helvetica.afm +3051 -0
- data/data/pdfrb/afm/Symbol.afm +213 -0
- data/data/pdfrb/afm/Times-Bold.afm +2588 -0
- data/data/pdfrb/afm/Times-BoldItalic.afm +2384 -0
- data/data/pdfrb/afm/Times-Italic.afm +2667 -0
- data/data/pdfrb/afm/Times-Roman.afm +2419 -0
- data/data/pdfrb/afm/ZapfDingbats.afm +225 -0
- data/data/pdfrb/arlington/latest/3DActivation.tsv +10 -0
- data/data/pdfrb/arlington/latest/3DAnimationStyle.tsv +5 -0
- data/data/pdfrb/arlington/latest/3DBackground.tsv +6 -0
- data/data/pdfrb/arlington/latest/3DCrossSection.tsv +11 -0
- data/data/pdfrb/arlington/latest/3DLightingScheme.tsv +3 -0
- data/data/pdfrb/arlington/latest/3DMeasure3DC.tsv +12 -0
- data/data/pdfrb/arlington/latest/3DMeasureAD3.tsv +21 -0
- data/data/pdfrb/arlington/latest/3DMeasureLD3.tsv +18 -0
- data/data/pdfrb/arlington/latest/3DMeasurePD3.tsv +19 -0
- data/data/pdfrb/arlington/latest/3DMeasureRD3.tsv +23 -0
- data/data/pdfrb/arlington/latest/3DNode.tsv +9 -0
- data/data/pdfrb/arlington/latest/3DReference.tsv +3 -0
- data/data/pdfrb/arlington/latest/3DRenderMode.tsv +7 -0
- data/data/pdfrb/arlington/latest/3DStream.tsv +16 -0
- data/data/pdfrb/arlington/latest/3DUnits.tsv +10 -0
- data/data/pdfrb/arlington/latest/3DView.tsv +17 -0
- data/data/pdfrb/arlington/latest/3DViewAddEntries.tsv +19 -0
- data/data/pdfrb/arlington/latest/AAPL_ST.tsv +7 -0
- data/data/pdfrb/arlington/latest/AFEmbeddedFileParameter.tsv +6 -0
- data/data/pdfrb/arlington/latest/AFEmbeddedFileStream.tsv +12 -0
- data/data/pdfrb/arlington/latest/AFFileSpecEF.tsv +3 -0
- data/data/pdfrb/arlington/latest/AFFileSpecification.tsv +17 -0
- data/data/pdfrb/arlington/latest/ActionECMAScript.tsv +5 -0
- data/data/pdfrb/arlington/latest/ActionGoTo.tsv +6 -0
- data/data/pdfrb/arlington/latest/ActionGoTo3DView.tsv +6 -0
- data/data/pdfrb/arlington/latest/ActionGoToDp.tsv +5 -0
- data/data/pdfrb/arlington/latest/ActionGoToE.tsv +8 -0
- data/data/pdfrb/arlington/latest/ActionGoToR.tsv +8 -0
- data/data/pdfrb/arlington/latest/ActionHide.tsv +6 -0
- data/data/pdfrb/arlington/latest/ActionImportData.tsv +5 -0
- data/data/pdfrb/arlington/latest/ActionLaunch.tsv +9 -0
- data/data/pdfrb/arlington/latest/ActionMovie.tsv +7 -0
- data/data/pdfrb/arlington/latest/ActionNOP.tsv +4 -0
- data/data/pdfrb/arlington/latest/ActionNamed.tsv +5 -0
- data/data/pdfrb/arlington/latest/ActionRendition.tsv +8 -0
- data/data/pdfrb/arlington/latest/ActionResetForm.tsv +6 -0
- data/data/pdfrb/arlington/latest/ActionRichMediaExecute.tsv +7 -0
- data/data/pdfrb/arlington/latest/ActionSetOCGState.tsv +6 -0
- data/data/pdfrb/arlington/latest/ActionSetState.tsv +6 -0
- data/data/pdfrb/arlington/latest/ActionSound.tsv +9 -0
- data/data/pdfrb/arlington/latest/ActionSubmitForm.tsv +8 -0
- data/data/pdfrb/arlington/latest/ActionThread.tsv +7 -0
- data/data/pdfrb/arlington/latest/ActionTransition.tsv +5 -0
- data/data/pdfrb/arlington/latest/ActionURI.tsv +6 -0
- data/data/pdfrb/arlington/latest/AddActionCatalog.tsv +6 -0
- data/data/pdfrb/arlington/latest/AddActionFormField.tsv +5 -0
- data/data/pdfrb/arlington/latest/AddActionPageObject.tsv +3 -0
- data/data/pdfrb/arlington/latest/AddActionScreenAnnotation.tsv +9 -0
- data/data/pdfrb/arlington/latest/AddActionWidgetAnnotation.tsv +11 -0
- data/data/pdfrb/arlington/latest/AlternateImage.tsv +4 -0
- data/data/pdfrb/arlington/latest/Annot3D.tsv +27 -0
- data/data/pdfrb/arlington/latest/AnnotCaret.tsv +31 -0
- data/data/pdfrb/arlington/latest/AnnotCircle.tsv +33 -0
- data/data/pdfrb/arlington/latest/AnnotFileAttachment.tsv +31 -0
- data/data/pdfrb/arlington/latest/AnnotFreeText.tsv +37 -0
- data/data/pdfrb/arlington/latest/AnnotHighlight.tsv +30 -0
- data/data/pdfrb/arlington/latest/AnnotInk.tsv +32 -0
- data/data/pdfrb/arlington/latest/AnnotLine.tsv +40 -0
- data/data/pdfrb/arlington/latest/AnnotLink.tsv +27 -0
- data/data/pdfrb/arlington/latest/AnnotMovie.tsv +23 -0
- data/data/pdfrb/arlington/latest/AnnotPolyLine.tsv +36 -0
- data/data/pdfrb/arlington/latest/AnnotPolygon.tsv +36 -0
- data/data/pdfrb/arlington/latest/AnnotPopup.tsv +22 -0
- data/data/pdfrb/arlington/latest/AnnotPrinterMark.tsv +21 -0
- data/data/pdfrb/arlington/latest/AnnotProjection.tsv +29 -0
- data/data/pdfrb/arlington/latest/AnnotRedact.tsv +36 -0
- data/data/pdfrb/arlington/latest/AnnotRichMedia.tsv +22 -0
- data/data/pdfrb/arlington/latest/AnnotScreen.tsv +24 -0
- data/data/pdfrb/arlington/latest/AnnotSound.tsv +31 -0
- data/data/pdfrb/arlington/latest/AnnotSquare.tsv +33 -0
- data/data/pdfrb/arlington/latest/AnnotSquiggly.tsv +30 -0
- data/data/pdfrb/arlington/latest/AnnotStamp.tsv +30 -0
- data/data/pdfrb/arlington/latest/AnnotStrikeOut.tsv +30 -0
- data/data/pdfrb/arlington/latest/AnnotText.tsv +33 -0
- data/data/pdfrb/arlington/latest/AnnotTrapNetwork.tsv +24 -0
- data/data/pdfrb/arlington/latest/AnnotUnderline.tsv +30 -0
- data/data/pdfrb/arlington/latest/AnnotWatermark.tsv +21 -0
- data/data/pdfrb/arlington/latest/AnnotWidget.tsv +32 -0
- data/data/pdfrb/arlington/latest/Appearance.tsv +4 -0
- data/data/pdfrb/arlington/latest/AppearanceCharacteristics.tsv +12 -0
- data/data/pdfrb/arlington/latest/AppearancePrinterMark.tsv +4 -0
- data/data/pdfrb/arlington/latest/AppearancePrinterMarkSubDict.tsv +2 -0
- data/data/pdfrb/arlington/latest/AppearanceSubDict.tsv +2 -0
- data/data/pdfrb/arlington/latest/AppearanceTrapNet.tsv +4 -0
- data/data/pdfrb/arlington/latest/AppearanceTrapNetSubDict.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOf3DCrossSection.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOf3DMeasure.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOf3DNode.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOf3DTransMatrix.tsv +13 -0
- data/data/pdfrb/arlington/latest/ArrayOf3DView.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOf3DViewAddEntries.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOf3PDUNames.tsv +4 -0
- data/data/pdfrb/arlington/latest/ArrayOf4Functions.tsv +5 -0
- data/data/pdfrb/arlington/latest/ArrayOfAFFileSpecifications.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOfActionHideAnnots.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfActions.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfAnnotStates.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfAnnots.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfArraysInkList.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfArraysPaths.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOfArraysRBGroups.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfArraysURLStrings.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfArraysXPTSValues.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfAttributeObjects.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfAttributeRevisions.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOfBeads.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfBlendModes.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfBooleansGeneral.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIDGlyphMetricsW.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIDGlyphMetricsW2.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_AssemblingIntent.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_AssemblyItem.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_BindIn.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_BindingIntent.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_BlowIn.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_ChannelUsage.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_Coatings.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_ColorIntent.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_ComChannel.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_ContactTypes.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_FinishedDimensions.tsv +4 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_FoldingIntent.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_HoleMakingIntent.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_HolePattern.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_LABColorValue.tsv +4 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_LayoutIntent.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_MediaIntent.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_PrintProcess.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_ProductionIntent.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_Resource.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfCIP4_StickOn.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfClassNamesRevisions.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOfCompressionFilterNames.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfDPartArrays.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfDParts.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfDashPatterns.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfDecodeParams.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfDescendantFonts.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfDevExtensions.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfDifferences.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfDigestMethod.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfDuration.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOfFieldChoiceOpt.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfFieldID.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfFields.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfFileSpecifications.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOfFilterNames.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfFontAndSize.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOfFonts.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfFunctions.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfGSPDashPatterns.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOfImageAlternates.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfIndirectFileSpecifications.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfIntegersGeneral.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfIntegersGreaterThanZero.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfMediaPlayerInfo.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfNamesForEnforce.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfNamesForPrintingOrder.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfNamesForProcSet.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfNamesGeneral.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfNamesInPtData.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfNamespace.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfNavigatorLayoutNames.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfNonNegativeIntegersGeneral.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfNumberFormats.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfNumbersGeneral.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfOCConfig.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfOCG.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfOCGState.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfOCGindirect.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfOCUsage.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfOPI13Color.tsv +6 -0
- data/data/pdfrb/arlington/latest/ArrayOfOPI2Inks.tsv +4 -0
- data/data/pdfrb/arlington/latest/ArrayOfOptContentGroups.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfOptContentOrderElements.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfOptContentOrders.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOfOutputIntents.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfPageTreeNodeKids.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfPages.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfPaths.tsv +7 -0
- data/data/pdfrb/arlington/latest/ArrayOfQuadPoints.tsv +9 -0
- data/data/pdfrb/arlington/latest/ArrayOfRenditions.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfRequirements.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfRequirementsHandlers.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfRichMediaConfiguration.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfRichMediaCuePoints.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfRichMediaInstances.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfSignatureReferences.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfSignatureSubFilterNames.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfSoftwareIdentifiers.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfSoftwareVersions.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfSourceInformation.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfStreamsGeneral.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfStringsASCII.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfStringsByte.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfStringsText.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfStringsTextOrNames.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfStructElem.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfStructElemKids.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfStructElemParentTree.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfSubjectDN.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfTags.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOfThreads.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfTrapNetVersionObjects.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfTrapRegions.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfURLStrings.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfURLs.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfUserProperty.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfViewParams.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfViewports.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfWebCaptureCommands.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfWebCaptureImages.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfWebCapturePages.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfXFA.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOfXPTSValues.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOfXRefIndexIntegers.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOfXRefWIntegers.tsv +4 -0
- data/data/pdfrb/arlington/latest/ArrayOf_2Booleans.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOf_2DashNumbers.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOf_2Integers.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOf_2LineEndingsNames.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOf_2NonNegativeIntegers.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOf_2Numbers.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOf_2StringsByte.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOf_2StringsText.tsv +3 -0
- data/data/pdfrb/arlington/latest/ArrayOf_3CenterOfRotationNumbers.tsv +4 -0
- data/data/pdfrb/arlington/latest/ArrayOf_3NonNegativeIntegers.tsv +4 -0
- data/data/pdfrb/arlington/latest/ArrayOf_3Numbers.tsv +4 -0
- data/data/pdfrb/arlington/latest/ArrayOf_3OrientationNumbers.tsv +4 -0
- data/data/pdfrb/arlington/latest/ArrayOf_3RGBNumbers.tsv +4 -0
- data/data/pdfrb/arlington/latest/ArrayOf_3or4CalloutLineNumbers.tsv +7 -0
- data/data/pdfrb/arlington/latest/ArrayOf_4AnnotBorderCharacteristics.tsv +5 -0
- data/data/pdfrb/arlington/latest/ArrayOf_4BorderColorArrays.tsv +5 -0
- data/data/pdfrb/arlington/latest/ArrayOf_4BorderStyleNames.tsv +5 -0
- data/data/pdfrb/arlington/latest/ArrayOf_4BorderThicknessNumbers.tsv +5 -0
- data/data/pdfrb/arlington/latest/ArrayOf_4ColourSpaceEntries.tsv +5 -0
- data/data/pdfrb/arlington/latest/ArrayOf_4Integers.tsv +5 -0
- data/data/pdfrb/arlington/latest/ArrayOf_4Numbers.tsv +5 -0
- data/data/pdfrb/arlington/latest/ArrayOf_4NumbersColorAnnotation.tsv +5 -0
- data/data/pdfrb/arlington/latest/ArrayOf_6Numbers.tsv +7 -0
- data/data/pdfrb/arlington/latest/ArrayOf_8Numbers.tsv +9 -0
- data/data/pdfrb/arlington/latest/ArrayOf_9Numbers.tsv +10 -0
- data/data/pdfrb/arlington/latest/ArrayOf_ArrayOfNumbers.tsv +2 -0
- data/data/pdfrb/arlington/latest/ArrayOf_RoleMapNS.tsv +3 -0
- data/data/pdfrb/arlington/latest/AuthCode.tsv +5 -0
- data/data/pdfrb/arlington/latest/Bead.tsv +7 -0
- data/data/pdfrb/arlington/latest/BeadFirst.tsv +7 -0
- data/data/pdfrb/arlington/latest/BlackpointArray.tsv +4 -0
- data/data/pdfrb/arlington/latest/BorderEffect.tsv +3 -0
- data/data/pdfrb/arlington/latest/BorderStyle.tsv +5 -0
- data/data/pdfrb/arlington/latest/BoxColorInfo.tsv +5 -0
- data/data/pdfrb/arlington/latest/BoxStyle.tsv +5 -0
- data/data/pdfrb/arlington/latest/CIDFontDescriptorMetrics.tsv +17 -0
- data/data/pdfrb/arlington/latest/CIDSystemInfo.tsv +4 -0
- data/data/pdfrb/arlington/latest/CIP4_Address.tsv +13 -0
- data/data/pdfrb/arlington/latest/CIP4_AssemblingIntent.tsv +7 -0
- data/data/pdfrb/arlington/latest/CIP4_AssemblyItem.tsv +3 -0
- data/data/pdfrb/arlington/latest/CIP4_BindIn.tsv +3 -0
- data/data/pdfrb/arlington/latest/CIP4_BindingIntent.tsv +6 -0
- data/data/pdfrb/arlington/latest/CIP4_BlowIn.tsv +3 -0
- data/data/pdfrb/arlington/latest/CIP4_ColorIntent.tsv +3 -0
- data/data/pdfrb/arlington/latest/CIP4_ComChannel.tsv +6 -0
- data/data/pdfrb/arlington/latest/CIP4_Company.tsv +5 -0
- data/data/pdfrb/arlington/latest/CIP4_Contact.tsv +8 -0
- data/data/pdfrb/arlington/latest/CIP4_FoldingIntent.tsv +4 -0
- data/data/pdfrb/arlington/latest/CIP4_HoleMakingIntent.tsv +3 -0
- data/data/pdfrb/arlington/latest/CIP4_HolePattern.tsv +4 -0
- data/data/pdfrb/arlington/latest/CIP4_Intent.tsv +11 -0
- data/data/pdfrb/arlington/latest/CIP4_IntentSummary.tsv +10 -0
- data/data/pdfrb/arlington/latest/CIP4_LayoutIntent.tsv +5 -0
- data/data/pdfrb/arlington/latest/CIP4_MediaIntent.tsv +11 -0
- data/data/pdfrb/arlington/latest/CIP4_Metadata.tsv +11 -0
- data/data/pdfrb/arlington/latest/CIP4_Person.tsv +10 -0
- data/data/pdfrb/arlington/latest/CIP4_Production.tsv +5 -0
- data/data/pdfrb/arlington/latest/CIP4_ProductionIntent.tsv +4 -0
- data/data/pdfrb/arlington/latest/CIP4_Recipient.tsv +3 -0
- data/data/pdfrb/arlington/latest/CIP4_Root.tsv +9 -0
- data/data/pdfrb/arlington/latest/CIP4_SaddleStitching.tsv +3 -0
- data/data/pdfrb/arlington/latest/CIP4_SideStitching.tsv +3 -0
- data/data/pdfrb/arlington/latest/CIP4_StickOn.tsv +3 -0
- data/data/pdfrb/arlington/latest/CMapStream.tsv +13 -0
- data/data/pdfrb/arlington/latest/CalGrayColorSpace.tsv +3 -0
- data/data/pdfrb/arlington/latest/CalGrayDict.tsv +4 -0
- data/data/pdfrb/arlington/latest/CalRGBColorSpace.tsv +3 -0
- data/data/pdfrb/arlington/latest/CalRGBDict.tsv +5 -0
- data/data/pdfrb/arlington/latest/Catalog.tsv +33 -0
- data/data/pdfrb/arlington/latest/CertSeedValue.tsv +14 -0
- data/data/pdfrb/arlington/latest/CharProcMap.tsv +2 -0
- data/data/pdfrb/arlington/latest/ClassMap.tsv +2 -0
- data/data/pdfrb/arlington/latest/Collection.tsv +11 -0
- data/data/pdfrb/arlington/latest/CollectionColors.tsv +7 -0
- data/data/pdfrb/arlington/latest/CollectionField.tsv +7 -0
- data/data/pdfrb/arlington/latest/CollectionFolder.tsv +13 -0
- data/data/pdfrb/arlington/latest/CollectionItem.tsv +3 -0
- data/data/pdfrb/arlington/latest/CollectionSchema.tsv +3 -0
- data/data/pdfrb/arlington/latest/CollectionSort.tsv +4 -0
- data/data/pdfrb/arlington/latest/CollectionSplit.tsv +4 -0
- data/data/pdfrb/arlington/latest/CollectionSubitem.tsv +4 -0
- data/data/pdfrb/arlington/latest/ColorSpaceMap.tsv +5 -0
- data/data/pdfrb/arlington/latest/ColorantsDict.tsv +2 -0
- data/data/pdfrb/arlington/latest/CryptFilter.tsv +5 -0
- data/data/pdfrb/arlington/latest/CryptFilterMap.tsv +4 -0
- data/data/pdfrb/arlington/latest/CryptFilterPublicKey.tsv +7 -0
- data/data/pdfrb/arlington/latest/CryptFilterPublicKeyMap.tsv +4 -0
- data/data/pdfrb/arlington/latest/DPM.tsv +5 -0
- data/data/pdfrb/arlington/latest/DPart.tsv +8 -0
- data/data/pdfrb/arlington/latest/DPartRoot.tsv +5 -0
- data/data/pdfrb/arlington/latest/DSS.tsv +6 -0
- data/data/pdfrb/arlington/latest/Data.tsv +4 -0
- data/data/pdfrb/arlington/latest/Dest0Array.tsv +3 -0
- data/data/pdfrb/arlington/latest/Dest0StructArray.tsv +3 -0
- data/data/pdfrb/arlington/latest/Dest1Array.tsv +4 -0
- data/data/pdfrb/arlington/latest/Dest1StructArray.tsv +4 -0
- data/data/pdfrb/arlington/latest/Dest4Array.tsv +7 -0
- data/data/pdfrb/arlington/latest/Dest4StructArray.tsv +7 -0
- data/data/pdfrb/arlington/latest/DestDict.tsv +3 -0
- data/data/pdfrb/arlington/latest/DestOutputProfileRef.tsv +7 -0
- data/data/pdfrb/arlington/latest/DestXYZArray.tsv +6 -0
- data/data/pdfrb/arlington/latest/DestXYZStructArray.tsv +6 -0
- data/data/pdfrb/arlington/latest/DestsMap.tsv +2 -0
- data/data/pdfrb/arlington/latest/DevExtensions.tsv +6 -0
- data/data/pdfrb/arlington/latest/DeviceCMYKColorSpace.tsv +2 -0
- data/data/pdfrb/arlington/latest/DeviceGrayColorSpace.tsv +2 -0
- data/data/pdfrb/arlington/latest/DeviceNColorSpace.tsv +6 -0
- data/data/pdfrb/arlington/latest/DeviceNDict.tsv +5 -0
- data/data/pdfrb/arlington/latest/DeviceNMixingHints.tsv +4 -0
- data/data/pdfrb/arlington/latest/DeviceNProcess.tsv +3 -0
- data/data/pdfrb/arlington/latest/DeviceRGBColorSpace.tsv +2 -0
- data/data/pdfrb/arlington/latest/DictionaryOfDictionaries.tsv +2 -0
- data/data/pdfrb/arlington/latest/DictionaryOfFunctions.tsv +3 -0
- data/data/pdfrb/arlington/latest/DocInfo.tsv +13 -0
- data/data/pdfrb/arlington/latest/DocMDPTransformParameters.tsv +4 -0
- data/data/pdfrb/arlington/latest/DocTimeStamp.tsv +19 -0
- data/data/pdfrb/arlington/latest/EmbeddedFileParameter.tsv +6 -0
- data/data/pdfrb/arlington/latest/EmbeddedFileStream.tsv +12 -0
- data/data/pdfrb/arlington/latest/Encoding.tsv +4 -0
- data/data/pdfrb/arlington/latest/EncryptedPayload.tsv +4 -0
- data/data/pdfrb/arlington/latest/EncryptionPublicKey.tsv +13 -0
- data/data/pdfrb/arlington/latest/EncryptionStandard.tsv +18 -0
- data/data/pdfrb/arlington/latest/ExData3DMarkup.tsv +6 -0
- data/data/pdfrb/arlington/latest/ExDataMarkupGeo.tsv +3 -0
- data/data/pdfrb/arlington/latest/ExDataProjection.tsv +4 -0
- data/data/pdfrb/arlington/latest/Extensions.tsv +5 -0
- data/data/pdfrb/arlington/latest/FDDict.tsv +2 -0
- data/data/pdfrb/arlington/latest/Field.tsv +8 -0
- data/data/pdfrb/arlington/latest/FieldBtnCheckbox.tsv +16 -0
- data/data/pdfrb/arlington/latest/FieldBtnPush.tsv +15 -0
- data/data/pdfrb/arlington/latest/FieldBtnRadio.tsv +16 -0
- data/data/pdfrb/arlington/latest/FieldChoice.tsv +18 -0
- data/data/pdfrb/arlington/latest/FieldMDPTransformParameters.tsv +5 -0
- data/data/pdfrb/arlington/latest/FieldSig.tsv +17 -0
- data/data/pdfrb/arlington/latest/FieldTx.tsv +16 -0
- data/data/pdfrb/arlington/latest/FileSpecEF.tsv +3 -0
- data/data/pdfrb/arlington/latest/FileSpecRF.tsv +3 -0
- data/data/pdfrb/arlington/latest/FileSpecification.tsv +17 -0
- data/data/pdfrb/arlington/latest/FileTrailer.tsv +11 -0
- data/data/pdfrb/arlington/latest/FilterCCITTFaxDecode.tsv +10 -0
- data/data/pdfrb/arlington/latest/FilterCrypt.tsv +3 -0
- data/data/pdfrb/arlington/latest/FilterDCTDecode.tsv +2 -0
- data/data/pdfrb/arlington/latest/FilterFlateDecode.tsv +5 -0
- data/data/pdfrb/arlington/latest/FilterJBIG2Decode.tsv +2 -0
- data/data/pdfrb/arlington/latest/FilterLZWDecode.tsv +6 -0
- data/data/pdfrb/arlington/latest/FixedPrint.tsv +5 -0
- data/data/pdfrb/arlington/latest/FloatingWindowParameters.tsv +10 -0
- data/data/pdfrb/arlington/latest/FontCIDType0.tsv +12 -0
- data/data/pdfrb/arlington/latest/FontCIDType2.tsv +12 -0
- data/data/pdfrb/arlington/latest/FontDescriptorCIDType0.tsv +25 -0
- data/data/pdfrb/arlington/latest/FontDescriptorCIDType2.tsv +26 -0
- data/data/pdfrb/arlington/latest/FontDescriptorTrueType.tsv +22 -0
- data/data/pdfrb/arlington/latest/FontDescriptorType1.tsv +22 -0
- data/data/pdfrb/arlington/latest/FontDescriptorType3.tsv +19 -0
- data/data/pdfrb/arlington/latest/FontFile.tsv +13 -0
- data/data/pdfrb/arlington/latest/FontFile2.tsv +13 -0
- data/data/pdfrb/arlington/latest/FontFile3CIDType0.tsv +13 -0
- data/data/pdfrb/arlington/latest/FontFile3OpenType.tsv +13 -0
- data/data/pdfrb/arlington/latest/FontFile3Type1.tsv +13 -0
- data/data/pdfrb/arlington/latest/FontFileType1.tsv +13 -0
- data/data/pdfrb/arlington/latest/FontMap.tsv +2 -0
- data/data/pdfrb/arlington/latest/FontMultipleMaster.tsv +11 -0
- data/data/pdfrb/arlington/latest/FontTrueType.tsv +11 -0
- data/data/pdfrb/arlington/latest/FontType0.tsv +7 -0
- data/data/pdfrb/arlington/latest/FontType1.tsv +11 -0
- data/data/pdfrb/arlington/latest/FontType3.tsv +14 -0
- data/data/pdfrb/arlington/latest/FunctionType0.tsv +16 -0
- data/data/pdfrb/arlington/latest/FunctionType2.tsv +7 -0
- data/data/pdfrb/arlington/latest/FunctionType3.tsv +7 -0
- data/data/pdfrb/arlington/latest/FunctionType4.tsv +11 -0
- data/data/pdfrb/arlington/latest/GTS_ProcStepsGroup.tsv +4 -0
- data/data/pdfrb/arlington/latest/GTSm_DevExtensions.tsv +6 -0
- data/data/pdfrb/arlington/latest/GammaArray.tsv +4 -0
- data/data/pdfrb/arlington/latest/GeographicCoordinateSystem.tsv +4 -0
- data/data/pdfrb/arlington/latest/GraphicsStateParameter.tsv +33 -0
- data/data/pdfrb/arlington/latest/GraphicsStateParameterMap.tsv +2 -0
- data/data/pdfrb/arlington/latest/GroupAttributes.tsv +6 -0
- data/data/pdfrb/arlington/latest/HalftoneType1.tsv +9 -0
- data/data/pdfrb/arlington/latest/HalftoneType10.tsv +14 -0
- data/data/pdfrb/arlington/latest/HalftoneType16.tsv +16 -0
- data/data/pdfrb/arlington/latest/HalftoneType5.tsv +6 -0
- data/data/pdfrb/arlington/latest/HalftoneType6.tsv +14 -0
- data/data/pdfrb/arlington/latest/ICCBasedColorSpace.tsv +3 -0
- data/data/pdfrb/arlington/latest/ICCProfileStream.tsv +12 -0
- data/data/pdfrb/arlington/latest/ISO_DevExtensions.tsv +6 -0
- data/data/pdfrb/arlington/latest/IconFit.tsv +5 -0
- data/data/pdfrb/arlington/latest/IndexedColorSpace.tsv +5 -0
- data/data/pdfrb/arlington/latest/InteractiveForm.tsv +9 -0
- data/data/pdfrb/arlington/latest/LabColorSpace.tsv +3 -0
- data/data/pdfrb/arlington/latest/LabDict.tsv +4 -0
- data/data/pdfrb/arlington/latest/LabRangeArray.tsv +5 -0
- data/data/pdfrb/arlington/latest/LegalAttestation.tsv +23 -0
- data/data/pdfrb/arlington/latest/LinearizationParameterDict.tsv +9 -0
- data/data/pdfrb/arlington/latest/MDPDict.tsv +2 -0
- data/data/pdfrb/arlington/latest/Mac.tsv +4 -0
- data/data/pdfrb/arlington/latest/MarkInfo.tsv +4 -0
- data/data/pdfrb/arlington/latest/MarkedContentReference.tsv +6 -0
- data/data/pdfrb/arlington/latest/MeasureGEO.tsv +10 -0
- data/data/pdfrb/arlington/latest/MeasureRL.tsv +12 -0
- data/data/pdfrb/arlington/latest/MediaClipData.tsv +11 -0
- data/data/pdfrb/arlington/latest/MediaClipDataMHBE.tsv +2 -0
- data/data/pdfrb/arlington/latest/MediaClipSection.tsv +8 -0
- data/data/pdfrb/arlington/latest/MediaClipSectionMHBE.tsv +3 -0
- data/data/pdfrb/arlington/latest/MediaCriteria.tsv +12 -0
- data/data/pdfrb/arlington/latest/MediaDuration.tsv +4 -0
- data/data/pdfrb/arlington/latest/MediaOffsetFrame.tsv +4 -0
- data/data/pdfrb/arlington/latest/MediaOffsetMarker.tsv +4 -0
- data/data/pdfrb/arlington/latest/MediaOffsetTime.tsv +4 -0
- data/data/pdfrb/arlington/latest/MediaPermissions.tsv +3 -0
- data/data/pdfrb/arlington/latest/MediaPlayParameters.tsv +5 -0
- data/data/pdfrb/arlington/latest/MediaPlayParametersBE.tsv +7 -0
- data/data/pdfrb/arlington/latest/MediaPlayParametersMH.tsv +7 -0
- data/data/pdfrb/arlington/latest/MediaPlayerInfo.tsv +5 -0
- data/data/pdfrb/arlington/latest/MediaPlayers.tsv +5 -0
- data/data/pdfrb/arlington/latest/MediaScreenParameters.tsv +4 -0
- data/data/pdfrb/arlington/latest/MediaScreenParametersMHBE.tsv +6 -0
- data/data/pdfrb/arlington/latest/Metadata.tsv +10 -0
- data/data/pdfrb/arlington/latest/MicrosoftWindowsLaunchParam.tsv +5 -0
- data/data/pdfrb/arlington/latest/MinimumBitDepth.tsv +4 -0
- data/data/pdfrb/arlington/latest/MinimumScreenSize.tsv +4 -0
- data/data/pdfrb/arlington/latest/Movie.tsv +5 -0
- data/data/pdfrb/arlington/latest/MovieActivation.tsv +10 -0
- data/data/pdfrb/arlington/latest/Name.tsv +12 -0
- data/data/pdfrb/arlington/latest/Namespace.tsv +5 -0
- data/data/pdfrb/arlington/latest/NavNode.tsv +7 -0
- data/data/pdfrb/arlington/latest/Navigator.tsv +16 -0
- data/data/pdfrb/arlington/latest/NumberFormat.tsv +12 -0
- data/data/pdfrb/arlington/latest/OOAdditionalStmsArray.tsv +3 -0
- data/data/pdfrb/arlington/latest/OPIVersion13.tsv +2 -0
- data/data/pdfrb/arlington/latest/OPIVersion13Dict.tsv +19 -0
- data/data/pdfrb/arlington/latest/OPIVersion20.tsv +2 -0
- data/data/pdfrb/arlington/latest/OPIVersion20Dict.tsv +12 -0
- data/data/pdfrb/arlington/latest/ObjectReference.tsv +4 -0
- data/data/pdfrb/arlington/latest/ObjectStream.tsv +12 -0
- data/data/pdfrb/arlington/latest/OptContentConfig.tsv +12 -0
- data/data/pdfrb/arlington/latest/OptContentCreatorInfo.tsv +4 -0
- data/data/pdfrb/arlington/latest/OptContentExport.tsv +2 -0
- data/data/pdfrb/arlington/latest/OptContentGroup.tsv +6 -0
- data/data/pdfrb/arlington/latest/OptContentLanguage.tsv +3 -0
- data/data/pdfrb/arlington/latest/OptContentMembership.tsv +5 -0
- data/data/pdfrb/arlington/latest/OptContentPageElement.tsv +2 -0
- data/data/pdfrb/arlington/latest/OptContentPrint.tsv +3 -0
- data/data/pdfrb/arlington/latest/OptContentProperties.tsv +4 -0
- data/data/pdfrb/arlington/latest/OptContentUsage.tsv +9 -0
- data/data/pdfrb/arlington/latest/OptContentUsageApplication.tsv +4 -0
- data/data/pdfrb/arlington/latest/OptContentUser.tsv +3 -0
- data/data/pdfrb/arlington/latest/OptContentView.tsv +2 -0
- data/data/pdfrb/arlington/latest/OptContentZoom.tsv +3 -0
- data/data/pdfrb/arlington/latest/Outline.tsv +5 -0
- data/data/pdfrb/arlington/latest/OutlineItem.tsv +13 -0
- data/data/pdfrb/arlington/latest/OutputIntents.tsv +11 -0
- data/data/pdfrb/arlington/latest/PageLabel.tsv +5 -0
- data/data/pdfrb/arlington/latest/PageObject.tsv +35 -0
- data/data/pdfrb/arlington/latest/PagePiece.tsv +2 -0
- data/data/pdfrb/arlington/latest/PageTreeNode.tsv +9 -0
- data/data/pdfrb/arlington/latest/PageTreeNodeRoot.tsv +8 -0
- data/data/pdfrb/arlington/latest/PaperMetaData.tsv +13 -0
- data/data/pdfrb/arlington/latest/PatternColorSpace.tsv +3 -0
- data/data/pdfrb/arlington/latest/PatternMap.tsv +2 -0
- data/data/pdfrb/arlington/latest/PatternType1.tsv +18 -0
- data/data/pdfrb/arlington/latest/PatternType2.tsv +6 -0
- data/data/pdfrb/arlington/latest/Permissions.tsv +3 -0
- data/data/pdfrb/arlington/latest/PointData.tsv +5 -0
- data/data/pdfrb/arlington/latest/ProjectedCoordinateSystem.tsv +4 -0
- data/data/pdfrb/arlington/latest/Projection.tsv +9 -0
- data/data/pdfrb/arlington/latest/Reference.tsv +4 -0
- data/data/pdfrb/arlington/latest/RelatedFilesArray.tsv +3 -0
- data/data/pdfrb/arlington/latest/RenditionBE.tsv +2 -0
- data/data/pdfrb/arlington/latest/RenditionMH.tsv +2 -0
- data/data/pdfrb/arlington/latest/RenditionMedia.tsv +9 -0
- data/data/pdfrb/arlington/latest/RenditionSelector.tsv +7 -0
- data/data/pdfrb/arlington/latest/Requirements3DMarkup.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsAcroFormInteract.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsAction.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsAttachment.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsAttachmentEditing.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsCollection.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsCollectionEditing.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsDPartInteract.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsDigSig.tsv +7 -0
- data/data/pdfrb/arlington/latest/RequirementsDigSigMDP.tsv +7 -0
- data/data/pdfrb/arlington/latest/RequirementsDigSigValidation.tsv +7 -0
- data/data/pdfrb/arlington/latest/RequirementsEnableJavaScripts.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsEncryption.tsv +7 -0
- data/data/pdfrb/arlington/latest/RequirementsGeospatial2D.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsGeospatial3D.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsHandler.tsv +4 -0
- data/data/pdfrb/arlington/latest/RequirementsMarkup.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsMultimedia.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsNavigation.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsOCAutoStates.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsOCInteract.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsPRC.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsRichMedia.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsSTEP.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsSeparationSimulation.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsTransitions.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsU3D.tsv +6 -0
- data/data/pdfrb/arlington/latest/RequirementsglTF.tsv +6 -0
- data/data/pdfrb/arlington/latest/Resource.tsv +10 -0
- data/data/pdfrb/arlington/latest/RichMediaActivation.tsv +8 -0
- data/data/pdfrb/arlington/latest/RichMediaAnimation.tsv +6 -0
- data/data/pdfrb/arlington/latest/RichMediaCommand.tsv +4 -0
- data/data/pdfrb/arlington/latest/RichMediaCommandArray.tsv +2 -0
- data/data/pdfrb/arlington/latest/RichMediaConfiguration.tsv +5 -0
- data/data/pdfrb/arlington/latest/RichMediaContent.tsv +5 -0
- data/data/pdfrb/arlington/latest/RichMediaCuePoint.tsv +6 -0
- data/data/pdfrb/arlington/latest/RichMediaDeactivation.tsv +3 -0
- data/data/pdfrb/arlington/latest/RichMediaHeight.tsv +4 -0
- data/data/pdfrb/arlington/latest/RichMediaInstance.tsv +6 -0
- data/data/pdfrb/arlington/latest/RichMediaParams.tsv +7 -0
- data/data/pdfrb/arlington/latest/RichMediaPosition.tsv +6 -0
- data/data/pdfrb/arlington/latest/RichMediaPresentation.tsv +8 -0
- data/data/pdfrb/arlington/latest/RichMediaSettings.tsv +4 -0
- data/data/pdfrb/arlington/latest/RichMediaWidth.tsv +4 -0
- data/data/pdfrb/arlington/latest/RichMediaWindow.tsv +5 -0
- data/data/pdfrb/arlington/latest/RoleMap.tsv +2 -0
- data/data/pdfrb/arlington/latest/RoleMapNS.tsv +2 -0
- data/data/pdfrb/arlington/latest/Separation.tsv +4 -0
- data/data/pdfrb/arlington/latest/SeparationColorSpace.tsv +5 -0
- data/data/pdfrb/arlington/latest/ShadingMap.tsv +2 -0
- data/data/pdfrb/arlington/latest/ShadingType1.tsv +9 -0
- data/data/pdfrb/arlington/latest/ShadingType2.tsv +10 -0
- data/data/pdfrb/arlington/latest/ShadingType3.tsv +10 -0
- data/data/pdfrb/arlington/latest/ShadingType4.tsv +18 -0
- data/data/pdfrb/arlington/latest/ShadingType5.tsv +18 -0
- data/data/pdfrb/arlington/latest/ShadingType6.tsv +18 -0
- data/data/pdfrb/arlington/latest/ShadingType7.tsv +18 -0
- data/data/pdfrb/arlington/latest/SigFieldLock.tsv +5 -0
- data/data/pdfrb/arlington/latest/SigFieldSeedValue.tsv +15 -0
- data/data/pdfrb/arlington/latest/Signature.tsv +20 -0
- data/data/pdfrb/arlington/latest/SignatureBuildDataAppDict.tsv +10 -0
- data/data/pdfrb/arlington/latest/SignatureBuildDataDict.tsv +9 -0
- data/data/pdfrb/arlington/latest/SignatureBuildDataSigQDict.tsv +10 -0
- data/data/pdfrb/arlington/latest/SignatureBuildPropDict.tsv +5 -0
- data/data/pdfrb/arlington/latest/SignatureReferenceDocMDP.tsv +8 -0
- data/data/pdfrb/arlington/latest/SignatureReferenceFieldMDP.tsv +8 -0
- data/data/pdfrb/arlington/latest/SignatureReferenceIdentity.tsv +7 -0
- data/data/pdfrb/arlington/latest/SignatureReferenceUR.tsv +8 -0
- data/data/pdfrb/arlington/latest/SlideShow.tsv +5 -0
- data/data/pdfrb/arlington/latest/SoftMaskAlpha.tsv +6 -0
- data/data/pdfrb/arlington/latest/SoftMaskLuminosity.tsv +6 -0
- data/data/pdfrb/arlington/latest/SoftwareIdentifier.tsv +8 -0
- data/data/pdfrb/arlington/latest/Solidities.tsv +3 -0
- data/data/pdfrb/arlington/latest/SoundObject.tsv +15 -0
- data/data/pdfrb/arlington/latest/SourceInformation.tsv +6 -0
- data/data/pdfrb/arlington/latest/SpectralData.tsv +2 -0
- data/data/pdfrb/arlington/latest/Stream.tsv +8 -0
- data/data/pdfrb/arlington/latest/StructElem.tsv +20 -0
- data/data/pdfrb/arlington/latest/StructTreeRoot.tsv +11 -0
- data/data/pdfrb/arlington/latest/StructureAttributesDict.tsv +54 -0
- data/data/pdfrb/arlington/latest/StyleDict.tsv +2 -0
- data/data/pdfrb/arlington/latest/SubjectDN.tsv +2 -0
- data/data/pdfrb/arlington/latest/Target.tsv +6 -0
- data/data/pdfrb/arlington/latest/TargetEmbedded.tsv +6 -0
- data/data/pdfrb/arlington/latest/Thread.tsv +5 -0
- data/data/pdfrb/arlington/latest/Thumbnail.tsv +15 -0
- data/data/pdfrb/arlington/latest/TimeStampDict.tsv +3 -0
- data/data/pdfrb/arlington/latest/Timespan.tsv +4 -0
- data/data/pdfrb/arlington/latest/ToUnicodeCMapStream.tsv +13 -0
- data/data/pdfrb/arlington/latest/TrailerIDArray.tsv +3 -0
- data/data/pdfrb/arlington/latest/Transition.tsv +9 -0
- data/data/pdfrb/arlington/latest/TrapRegion.tsv +3 -0
- data/data/pdfrb/arlington/latest/URI.tsv +2 -0
- data/data/pdfrb/arlington/latest/URLAlias.tsv +3 -0
- data/data/pdfrb/arlington/latest/URTransformParamAnnotsArray.tsv +2 -0
- data/data/pdfrb/arlington/latest/URTransformParamDocumentArray.tsv +2 -0
- data/data/pdfrb/arlington/latest/URTransformParamEFArray.tsv +2 -0
- data/data/pdfrb/arlington/latest/URTransformParamFormArray.tsv +2 -0
- data/data/pdfrb/arlington/latest/URTransformParamSignatureArray.tsv +2 -0
- data/data/pdfrb/arlington/latest/URTransformParameters.tsv +10 -0
- data/data/pdfrb/arlington/latest/UserProperty.tsv +5 -0
- data/data/pdfrb/arlington/latest/VRI.tsv +7 -0
- data/data/pdfrb/arlington/latest/VRIMap.tsv +2 -0
- data/data/pdfrb/arlington/latest/ViewParams.tsv +3 -0
- data/data/pdfrb/arlington/latest/ViewerPreferences.tsv +19 -0
- data/data/pdfrb/arlington/latest/Viewport.tsv +6 -0
- data/data/pdfrb/arlington/latest/VisibilityExpressionArray.tsv +4 -0
- data/data/pdfrb/arlington/latest/WebCaptureCommand.tsv +8 -0
- data/data/pdfrb/arlington/latest/WebCaptureCommandSettings.tsv +3 -0
- data/data/pdfrb/arlington/latest/WebCaptureImageSet.tsv +9 -0
- data/data/pdfrb/arlington/latest/WebCaptureInfo.tsv +3 -0
- data/data/pdfrb/arlington/latest/WebCapturePageSet.tsv +10 -0
- data/data/pdfrb/arlington/latest/WhitepointArray.tsv +4 -0
- data/data/pdfrb/arlington/latest/XObjectFormPS.tsv +10 -0
- data/data/pdfrb/arlington/latest/XObjectFormPSpassthrough.tsv +15 -0
- data/data/pdfrb/arlington/latest/XObjectFormPrinterMark.tsv +29 -0
- data/data/pdfrb/arlington/latest/XObjectFormTrapNet.tsv +31 -0
- data/data/pdfrb/arlington/latest/XObjectFormType1.tsv +32 -0
- data/data/pdfrb/arlington/latest/XObjectImage.tsv +35 -0
- data/data/pdfrb/arlington/latest/XObjectImageMask.tsv +29 -0
- data/data/pdfrb/arlington/latest/XObjectImageSoftMask.tsv +22 -0
- data/data/pdfrb/arlington/latest/XObjectMap.tsv +2 -0
- data/data/pdfrb/arlington/latest/XRefStream.tsv +20 -0
- data/data/pdfrb/arlington/latest/_UniversalArray.tsv +2 -0
- data/data/pdfrb/arlington/latest/_UniversalDictionary.tsv +2 -0
- data/data/pdfrb/glyphlist.txt +4306 -0
- data/data/pdfrb/zapfdingbats.txt +226 -0
- data/exe/pdfrb +10 -0
- data/lib/pdfrb/arlington/field_definition.rb +128 -0
- data/lib/pdfrb/arlington/loader.rb +84 -0
- data/lib/pdfrb/arlington/object_definition.rb +45 -0
- data/lib/pdfrb/arlington/pdf_version.rb +121 -0
- data/lib/pdfrb/arlington/predicate/ast.rb +21 -0
- data/lib/pdfrb/arlington/predicate/context.rb +24 -0
- data/lib/pdfrb/arlington/predicate/evaluator.rb +113 -0
- data/lib/pdfrb/arlington/predicate/functions/arithmetic.rb +67 -0
- data/lib/pdfrb/arlington/predicate/functions/file.rb +22 -0
- data/lib/pdfrb/arlington/predicate/functions/logical.rb +38 -0
- data/lib/pdfrb/arlington/predicate/functions/presence.rb +39 -0
- data/lib/pdfrb/arlington/predicate/functions/reference.rb +28 -0
- data/lib/pdfrb/arlington/predicate/functions/version.rb +53 -0
- data/lib/pdfrb/arlington/predicate/functions.rb +34 -0
- data/lib/pdfrb/arlington/predicate/lexer.rb +177 -0
- data/lib/pdfrb/arlington/predicate/parser.rb +185 -0
- data/lib/pdfrb/arlington/predicate.rb +22 -0
- data/lib/pdfrb/arlington/type.rb +41 -0
- data/lib/pdfrb/arlington.rb +19 -0
- data/lib/pdfrb/cli.rb +135 -0
- data/lib/pdfrb/configuration.rb +64 -0
- data/lib/pdfrb/conformance/pdf_a.rb +74 -0
- data/lib/pdfrb/conformance/pdf_ua.rb +46 -0
- data/lib/pdfrb/conformance.rb +11 -0
- data/lib/pdfrb/content/canvas.rb +248 -0
- data/lib/pdfrb/content/graphic_object/arc.rb +85 -0
- data/lib/pdfrb/content/graphic_object/curve.rb +28 -0
- data/lib/pdfrb/content/graphic_object/polyline.rb +27 -0
- data/lib/pdfrb/content/graphic_object/rectangle.rb +53 -0
- data/lib/pdfrb/content/graphic_object.rb +16 -0
- data/lib/pdfrb/content/graphics_state.rb +104 -0
- data/lib/pdfrb/content/operator.rb +72 -0
- data/lib/pdfrb/content/operators/color.rb +106 -0
- data/lib/pdfrb/content/operators/general.rb +50 -0
- data/lib/pdfrb/content/operators/graphics_state_params.rb +78 -0
- data/lib/pdfrb/content/operators/marked_content.rb +51 -0
- data/lib/pdfrb/content/operators/painting.rb +82 -0
- data/lib/pdfrb/content/operators/path.rb +69 -0
- data/lib/pdfrb/content/operators/text_positioning.rb +44 -0
- data/lib/pdfrb/content/operators/text_showing.rb +48 -0
- data/lib/pdfrb/content/operators/text_state.rb +66 -0
- data/lib/pdfrb/content/parser.rb +103 -0
- data/lib/pdfrb/content/processor.rb +81 -0
- data/lib/pdfrb/content.rb +38 -0
- data/lib/pdfrb/data_dir.rb +35 -0
- data/lib/pdfrb/digital_signature/handler.rb +21 -0
- data/lib/pdfrb/digital_signature/signing.rb +29 -0
- data/lib/pdfrb/digital_signature/verification.rb +22 -0
- data/lib/pdfrb/digital_signature.rb +11 -0
- data/lib/pdfrb/document/annotations.rb +44 -0
- data/lib/pdfrb/document/destinations.rb +22 -0
- data/lib/pdfrb/document/files.rb +28 -0
- data/lib/pdfrb/document/fonts.rb +121 -0
- data/lib/pdfrb/document/images.rb +57 -0
- data/lib/pdfrb/document/metadata.rb +64 -0
- data/lib/pdfrb/document/pages.rb +134 -0
- data/lib/pdfrb/document.rb +343 -0
- data/lib/pdfrb/encryption/aes.rb +68 -0
- data/lib/pdfrb/encryption/password_verification.rb +112 -0
- data/lib/pdfrb/encryption/rc4.rb +45 -0
- data/lib/pdfrb/encryption/security_handler.rb +65 -0
- data/lib/pdfrb/encryption/standard_security_handler.rb +117 -0
- data/lib/pdfrb/encryption.rb +20 -0
- data/lib/pdfrb/error.rb +92 -0
- data/lib/pdfrb/filter/ascii_85_decode.rb +79 -0
- data/lib/pdfrb/filter/ascii_hex_decode.rb +37 -0
- data/lib/pdfrb/filter/base.rb +32 -0
- data/lib/pdfrb/filter/crypt.rb +36 -0
- data/lib/pdfrb/filter/flate_decode.rb +137 -0
- data/lib/pdfrb/filter/lzw_decode.rb +124 -0
- data/lib/pdfrb/filter/passthrough_filters.rb +55 -0
- data/lib/pdfrb/filter/run_length_decode.rb +72 -0
- data/lib/pdfrb/filter.rb +64 -0
- data/lib/pdfrb/font/afm_parser.rb +84 -0
- data/lib/pdfrb/font/cmap/parser.rb +96 -0
- data/lib/pdfrb/font/cmap/writer.rb +46 -0
- data/lib/pdfrb/font/cmap.rb +10 -0
- data/lib/pdfrb/font/encoding/mac_roman_encoding.rb +25 -0
- data/lib/pdfrb/font/encoding/pdf_doc_encoding.rb +16 -0
- data/lib/pdfrb/font/encoding/standard_encoding.rb +24 -0
- data/lib/pdfrb/font/encoding/win_ansi_encoding.rb +25 -0
- data/lib/pdfrb/font/encoding/zapf_dingbats_encoding.rb +13 -0
- data/lib/pdfrb/font/encoding.rb +36 -0
- data/lib/pdfrb/font/glyph_list.rb +56 -0
- data/lib/pdfrb/font/true_type/cmap.rb +240 -0
- data/lib/pdfrb/font/true_type/file.rb +85 -0
- data/lib/pdfrb/font/true_type/head.rb +43 -0
- data/lib/pdfrb/font/true_type/hhea.rb +36 -0
- data/lib/pdfrb/font/true_type/hmtx.rb +58 -0
- data/lib/pdfrb/font/true_type/os2.rb +51 -0
- data/lib/pdfrb/font/true_type/subsetter.rb +28 -0
- data/lib/pdfrb/font/true_type.rb +14 -0
- data/lib/pdfrb/font/type1/font_metrics.rb +46 -0
- data/lib/pdfrb/font/type1.rb +9 -0
- data/lib/pdfrb/font.rb +18 -0
- data/lib/pdfrb/font_loader/true_type.rb +62 -0
- data/lib/pdfrb/font_loader/type1.rb +27 -0
- data/lib/pdfrb/font_loader.rb +10 -0
- data/lib/pdfrb/image_loader/jpeg.rb +90 -0
- data/lib/pdfrb/image_loader/pdf.rb +28 -0
- data/lib/pdfrb/image_loader/png.rb +282 -0
- data/lib/pdfrb/image_loader.rb +64 -0
- data/lib/pdfrb/importer.rb +78 -0
- data/lib/pdfrb/model/cos/dictionary.rb +310 -0
- data/lib/pdfrb/model/cos/fields.rb +215 -0
- data/lib/pdfrb/model/cos/name_encoding.rb +64 -0
- data/lib/pdfrb/model/cos/stream.rb +96 -0
- data/lib/pdfrb/model/cos/string_encoding.rb +135 -0
- data/lib/pdfrb/model/cos.rb +20 -0
- data/lib/pdfrb/model/date.rb +82 -0
- data/lib/pdfrb/model/matrix.rb +85 -0
- data/lib/pdfrb/model/object.rb +76 -0
- data/lib/pdfrb/model/pdf_array.rb +63 -0
- data/lib/pdfrb/model/rectangle.rb +54 -0
- data/lib/pdfrb/model/reference.rb +49 -0
- data/lib/pdfrb/model/type/action.rb +33 -0
- data/lib/pdfrb/model/type/af_embedded_file.rb +12 -0
- data/lib/pdfrb/model/type/af_file_specification.rb +13 -0
- data/lib/pdfrb/model/type/annotation.rb +50 -0
- data/lib/pdfrb/model/type/catalog.rb +50 -0
- data/lib/pdfrb/model/type/cid_font.rb +13 -0
- data/lib/pdfrb/model/type/embedded_file.rb +13 -0
- data/lib/pdfrb/model/type/encryption_public_key.rb +12 -0
- data/lib/pdfrb/model/type/encryption_standard.rb +12 -0
- data/lib/pdfrb/model/type/file_specification.rb +12 -0
- data/lib/pdfrb/model/type/file_trailer.rb +14 -0
- data/lib/pdfrb/model/type/font.rb +13 -0
- data/lib/pdfrb/model/type/font_descriptor.rb +12 -0
- data/lib/pdfrb/model/type/font_true_type.rb +12 -0
- data/lib/pdfrb/model/type/font_type0.rb +12 -0
- data/lib/pdfrb/model/type/font_type1.rb +12 -0
- data/lib/pdfrb/model/type/font_type3.rb +13 -0
- data/lib/pdfrb/model/type/graphics_state_parameter.rb +17 -0
- data/lib/pdfrb/model/type/info.rb +15 -0
- data/lib/pdfrb/model/type/interactive_form.rb +12 -0
- data/lib/pdfrb/model/type/metadata.rb +18 -0
- data/lib/pdfrb/model/type/names.rb +14 -0
- data/lib/pdfrb/model/type/object_stream.rb +14 -0
- data/lib/pdfrb/model/type/optional_content_group.rb +25 -0
- data/lib/pdfrb/model/type/optional_content_membership.rb +13 -0
- data/lib/pdfrb/model/type/optional_content_properties.rb +12 -0
- data/lib/pdfrb/model/type/outline.rb +20 -0
- data/lib/pdfrb/model/type/outline_item.rb +13 -0
- data/lib/pdfrb/model/type/output_intent.rb +12 -0
- data/lib/pdfrb/model/type/page.rb +86 -0
- data/lib/pdfrb/model/type/page_tree_node.rb +46 -0
- data/lib/pdfrb/model/type/resources.rb +53 -0
- data/lib/pdfrb/model/type/struct_elem.rb +15 -0
- data/lib/pdfrb/model/type/struct_tree_root.rb +15 -0
- data/lib/pdfrb/model/type/xobject_form.rb +13 -0
- data/lib/pdfrb/model/type/xobject_image.rb +13 -0
- data/lib/pdfrb/model/type/xref_stream.rb +14 -0
- data/lib/pdfrb/model/type.rb +78 -0
- data/lib/pdfrb/model.rb +27 -0
- data/lib/pdfrb/pdf_constants.rb +42 -0
- data/lib/pdfrb/serializer.rb +174 -0
- data/lib/pdfrb/source/header_reader.rb +34 -0
- data/lib/pdfrb/source/helpers.rb +25 -0
- data/lib/pdfrb/source/linearization_detection.rb +34 -0
- data/lib/pdfrb/source/object_reader.rb +132 -0
- data/lib/pdfrb/source/object_stream_reader.rb +32 -0
- data/lib/pdfrb/source/parser.rb +281 -0
- data/lib/pdfrb/source/recovery.rb +35 -0
- data/lib/pdfrb/source/token.rb +15 -0
- data/lib/pdfrb/source/tokenizer.rb +320 -0
- data/lib/pdfrb/source/tokenizer.rb.bak +320 -0
- data/lib/pdfrb/source/trailer_reader.rb +32 -0
- data/lib/pdfrb/source/xref_stream_reader.rb +52 -0
- data/lib/pdfrb/source/xref_table_reader.rb +72 -0
- data/lib/pdfrb/source.rb +24 -0
- data/lib/pdfrb/task/extract_images.rb +53 -0
- data/lib/pdfrb/task/extract_text.rb +232 -0
- data/lib/pdfrb/task/merge.rb +47 -0
- data/lib/pdfrb/task/optimize.rb +18 -0
- data/lib/pdfrb/task.rb +13 -0
- data/lib/pdfrb/version.rb +5 -0
- data/lib/pdfrb/writer.rb +144 -0
- data/lib/pdfrb/xref_section.rb +51 -0
- data/lib/pdfrb.rb +97 -0
- metadata +890 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
class Document
|
|
5
|
+
# Page-tree facade. Exposes +add+, +[]+, +each+, +count+,
|
|
6
|
+
# +delete+ against the Catalog's /Pages tree.
|
|
7
|
+
class Pages
|
|
8
|
+
include Enumerable
|
|
9
|
+
|
|
10
|
+
attr_reader :document
|
|
11
|
+
|
|
12
|
+
def initialize(document)
|
|
13
|
+
@document = document
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Add a new page at the end of the page tree.
|
|
17
|
+
#
|
|
18
|
+
# Options:
|
|
19
|
+
# media_box: [0, 0, 612, 792] # default US Letter
|
|
20
|
+
# rotate: 0 # degrees
|
|
21
|
+
#
|
|
22
|
+
# Returns the new +Model::Type::Page+.
|
|
23
|
+
def add(media_box: [0, 0, 612, 792], rotate: 0)
|
|
24
|
+
root = pages_root
|
|
25
|
+
contents = document.add({}, type: Pdfrb::Model::Cos::Stream)
|
|
26
|
+
page = document.add(
|
|
27
|
+
{
|
|
28
|
+
Type: :Page,
|
|
29
|
+
Parent: Pdfrb::Model::Reference.new(root.oid, root.gen),
|
|
30
|
+
MediaBox: media_box,
|
|
31
|
+
Resources: {},
|
|
32
|
+
Contents: Pdfrb::Model::Reference.new(contents.oid, 0)
|
|
33
|
+
},
|
|
34
|
+
type: Pdfrb::Model::Type::Page
|
|
35
|
+
)
|
|
36
|
+
page.value[:Rotate] = rotate if rotate.nonzero?
|
|
37
|
+
kids = (root.value[:Kids] ||= [])
|
|
38
|
+
kids << Pdfrb::Model::Reference.new(page.oid, page.gen)
|
|
39
|
+
root.value[:Count] = (root.value[:Count] || 0) + 1
|
|
40
|
+
page
|
|
41
|
+
end
|
|
42
|
+
alias << add
|
|
43
|
+
|
|
44
|
+
def each(&block)
|
|
45
|
+
return enum_for(:each) unless block_given?
|
|
46
|
+
|
|
47
|
+
walk(pages_root, &block)
|
|
48
|
+
self
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def count
|
|
52
|
+
raw = pages_root[:Count]
|
|
53
|
+
resolved = raw.is_a?(Pdfrb::Model::Reference) ? document.object(raw)&.value : raw
|
|
54
|
+
case resolved
|
|
55
|
+
when Integer then resolved
|
|
56
|
+
when Numeric then resolved.to_i
|
|
57
|
+
else
|
|
58
|
+
# Fallback: walk the page tree.
|
|
59
|
+
count = 0
|
|
60
|
+
each { count += 1 }
|
|
61
|
+
count
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
alias size count
|
|
65
|
+
alias length count
|
|
66
|
+
|
|
67
|
+
def empty?
|
|
68
|
+
count.zero?
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def [](index)
|
|
72
|
+
each_with_index { |p, i| return p if i == index }
|
|
73
|
+
nil
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def delete(page)
|
|
77
|
+
ref = ref_to(page)
|
|
78
|
+
root = pages_root
|
|
79
|
+
kids = root.value[:Kids]
|
|
80
|
+
return unless kids&.delete(ref)
|
|
81
|
+
|
|
82
|
+
root.value[:Count] = (root.value[:Count] || 1) - 1
|
|
83
|
+
page
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
private
|
|
87
|
+
|
|
88
|
+
def pages_root
|
|
89
|
+
catalog = document.catalog
|
|
90
|
+
raise Pdfrb::Error, "Document has no Catalog" unless catalog
|
|
91
|
+
|
|
92
|
+
ref = catalog.value[:Pages]
|
|
93
|
+
return document.object(ref) if ref
|
|
94
|
+
|
|
95
|
+
# No /Pages yet — seed an empty tree.
|
|
96
|
+
root = document.add({ Type: :Pages, Kids: [], Count: 0 },
|
|
97
|
+
type: Pdfrb::Model::Type::PageTreeNode)
|
|
98
|
+
catalog.value[:Pages] = Pdfrb::Model::Reference.new(root.oid, root.gen)
|
|
99
|
+
root
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def walk(node, &block)
|
|
103
|
+
kids = node.respond_to?(:value) ? node.value[:Kids] : node[:Kids]
|
|
104
|
+
return unless kids
|
|
105
|
+
|
|
106
|
+
# Kids may itself be an indirect reference, especially in
|
|
107
|
+
# compressed-object PDFs (FOP output).
|
|
108
|
+
kids = document.object(kids).value if kids.is_a?(Pdfrb::Model::Reference)
|
|
109
|
+
kids = kids.value if kids.respond_to?(:value) && !kids.is_a?(::Hash)
|
|
110
|
+
|
|
111
|
+
Array(kids).each do |kid_ref|
|
|
112
|
+
kid = kid_ref.is_a?(Pdfrb::Model::Reference) ?
|
|
113
|
+
document.object(kid_ref) : kid_ref
|
|
114
|
+
next unless kid
|
|
115
|
+
|
|
116
|
+
type = kid.respond_to?(:value) ? kid.value[:Type] : nil
|
|
117
|
+
case type
|
|
118
|
+
when :Pages then walk(kid, &block)
|
|
119
|
+
when :Page then yield kid
|
|
120
|
+
else
|
|
121
|
+
# Unknown type — best effort, treat as a Page.
|
|
122
|
+
yield kid if kid.respond_to?(:value)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def ref_to(page)
|
|
128
|
+
return page if page.is_a?(Pdfrb::Model::Reference)
|
|
129
|
+
|
|
130
|
+
Pdfrb::Model::Reference.new(page.oid, page.gen)
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "set"
|
|
4
|
+
|
|
5
|
+
module Pdfrb
|
|
6
|
+
# Top-level PDF document facade. Owns:
|
|
7
|
+
# * The IO it was read from (or nil for in-memory).
|
|
8
|
+
# * An oid -> Object table for new/modified objects.
|
|
9
|
+
# * A wrap() pipeline that upgrades raw Hashes to typed
|
|
10
|
+
# Dictionary subclasses based on /Type or an explicit type.
|
|
11
|
+
# * On read: an XrefSection + ObjectReader for lazy resolution.
|
|
12
|
+
# * A revisions stack (TODO 30 — incremental updates).
|
|
13
|
+
class Document
|
|
14
|
+
autoload :Pages, "pdfrb/document/pages"
|
|
15
|
+
autoload :Fonts, "pdfrb/document/fonts"
|
|
16
|
+
autoload :Metadata, "pdfrb/document/metadata"
|
|
17
|
+
autoload :Images, "pdfrb/document/images"
|
|
18
|
+
autoload :Files, "pdfrb/document/files"
|
|
19
|
+
autoload :Destinations, "pdfrb/document/destinations"
|
|
20
|
+
autoload :Annotations, "pdfrb/document/annotations"
|
|
21
|
+
|
|
22
|
+
def initialize(io: nil, config: {})
|
|
23
|
+
@config = Configuration.new(config)
|
|
24
|
+
@io = io
|
|
25
|
+
@objects = {} # oid -> Pdfrb::Model::Object (modified or new)
|
|
26
|
+
@next_oid = 1
|
|
27
|
+
@listeners = {} # message_name -> [Proc]
|
|
28
|
+
@xref = nil
|
|
29
|
+
@object_reader = nil
|
|
30
|
+
@version = "1.4"
|
|
31
|
+
@empty_trailer = nil
|
|
32
|
+
|
|
33
|
+
if io
|
|
34
|
+
read_from_io(io)
|
|
35
|
+
else
|
|
36
|
+
seed_empty_structure
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
attr_reader :config, :io, :xref, :version
|
|
41
|
+
|
|
42
|
+
def self.open(path, **opts)
|
|
43
|
+
if block_given?
|
|
44
|
+
File.open(path, "rb") { |f| yield new(io: f, **opts) }
|
|
45
|
+
else
|
|
46
|
+
bytes = File.binread(path)
|
|
47
|
+
require "stringio"
|
|
48
|
+
new(io: StringIO.new(bytes), **opts)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def wrap(data, type: nil, oid: 0, gen: 0)
|
|
53
|
+
target_class = resolve_target_class(data, type)
|
|
54
|
+
value = unwrap_value(data)
|
|
55
|
+
if target_class <= Pdfrb::Model::Object
|
|
56
|
+
target_class.new(value, oid: oid, gen: gen, document: self)
|
|
57
|
+
else
|
|
58
|
+
target_class.new(value)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def add(value, type: nil)
|
|
63
|
+
oid = allocate_oid
|
|
64
|
+
obj = wrap(value, type: type, oid: oid, gen: 0)
|
|
65
|
+
register(obj)
|
|
66
|
+
obj
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Resolve a Reference to its Object. New/modified objects take
|
|
70
|
+
# precedence over xref-loaded ones; otherwise consult the
|
|
71
|
+
# ObjectReader (which caches per oid).
|
|
72
|
+
def object(reference)
|
|
73
|
+
return reference unless reference.is_a?(Pdfrb::Model::Reference)
|
|
74
|
+
|
|
75
|
+
modified = @objects[reference.oid]
|
|
76
|
+
return modified if modified
|
|
77
|
+
return nil if @object_reader.nil?
|
|
78
|
+
|
|
79
|
+
@object_reader.load_oid(reference.oid)
|
|
80
|
+
end
|
|
81
|
+
alias dereference object
|
|
82
|
+
|
|
83
|
+
def register_listener(message, &block)
|
|
84
|
+
(@listeners[message] ||= []) << block
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def dispatch_message(message, *args)
|
|
88
|
+
return unless @listeners.key?(message)
|
|
89
|
+
|
|
90
|
+
@listeners[message].each { |blk| blk.call(*args) }
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# ---- Facade accessors (Phase 13) ----
|
|
94
|
+
# Each returns a memoised helper object that knows how to mutate
|
|
95
|
+
# this document. Defined under Pdfrb::Document::*.
|
|
96
|
+
|
|
97
|
+
def pages
|
|
98
|
+
@pages ||= Document::Pages.new(self)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def fonts
|
|
102
|
+
@fonts ||= Document::Fonts.new(self)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def images
|
|
106
|
+
@images ||= Document::Images.new(self)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def files
|
|
110
|
+
@files ||= Document::Files.new(self)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def metadata
|
|
114
|
+
@metadata ||= Document::Metadata.new(self)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def destinations
|
|
118
|
+
@destinations ||= Document::Destinations.new(self)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def annotations
|
|
122
|
+
@annotations ||= Document::Annotations.new(self)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Replace an indirect object in the @objects table. Used by the
|
|
126
|
+
# Importer when promoting a Dictionary stub to a Stream (so cycles
|
|
127
|
+
# resolve correctly). Idempotent.
|
|
128
|
+
def register_override(obj)
|
|
129
|
+
@objects[obj.oid] = obj
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Write this document to +path+ (or any IO via +io:).
|
|
133
|
+
def write(path = nil, io: nil)
|
|
134
|
+
target = io || (path && File.open(path, "wb"))
|
|
135
|
+
raise ArgumentError, "write needs a path or io:" unless target
|
|
136
|
+
|
|
137
|
+
Pdfrb::Writer.write(self, target)
|
|
138
|
+
target.close if path && io.nil? && target.respond_to?(:close)
|
|
139
|
+
self
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Convenience accessor for the document Catalog dict. Loads from
|
|
143
|
+
# trailer's /Root, which itself is loaded lazily from the xref.
|
|
144
|
+
def trailer
|
|
145
|
+
return @trailer if defined?(@trailer) && @trailer
|
|
146
|
+
|
|
147
|
+
@trailer = read_trailer
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def catalog
|
|
151
|
+
return @catalog if defined?(@catalog) && @catalog
|
|
152
|
+
|
|
153
|
+
ref = trailer ? trailer[:Root] : nil
|
|
154
|
+
return nil unless ref
|
|
155
|
+
|
|
156
|
+
@catalog = object(ref)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Yield every indirect object in this document: modified/new ones
|
|
160
|
+
# first (they shadow loaded ones), then every loaded entry the
|
|
161
|
+
# xref knows about.
|
|
162
|
+
def each_indirect_object
|
|
163
|
+
seen = Set.new
|
|
164
|
+
@objects.each_value do |obj|
|
|
165
|
+
next unless obj.indirect?
|
|
166
|
+
|
|
167
|
+
seen << obj.oid
|
|
168
|
+
yield obj
|
|
169
|
+
end
|
|
170
|
+
return if @xref.nil?
|
|
171
|
+
|
|
172
|
+
@xref.entries.each_key do |oid|
|
|
173
|
+
next if seen.include?(oid)
|
|
174
|
+
next if oid.zero?
|
|
175
|
+
|
|
176
|
+
obj = object(Pdfrb::Model::Reference.new(oid, 0))
|
|
177
|
+
next if obj.nil? || !obj.indirect?
|
|
178
|
+
|
|
179
|
+
yield obj
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
private
|
|
184
|
+
|
|
185
|
+
def allocate_oid
|
|
186
|
+
oid = @next_oid
|
|
187
|
+
@next_oid += 1
|
|
188
|
+
oid
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def register(obj)
|
|
192
|
+
@objects[obj.oid] = obj
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def read_from_io(io)
|
|
196
|
+
version = Pdfrb::Source::HeaderReader.read(io)
|
|
197
|
+
@version = version if version
|
|
198
|
+
sxref = Pdfrb::Source::TrailerReader.startxref_offset(io)
|
|
199
|
+
return unless sxref
|
|
200
|
+
|
|
201
|
+
@xref, @trailer_dict = load_xref_and_trailer(io, sxref)
|
|
202
|
+
@object_reader = Pdfrb::Source::ObjectReader.new(self, @xref) if @xref
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def load_xref_and_trailer(io, sxref)
|
|
206
|
+
xref, trailer = load_single_xref(io, sxref)
|
|
207
|
+
return [nil, nil] unless xref && trailer
|
|
208
|
+
|
|
209
|
+
# Follow /Prev chain for incremental updates. Earlier entries
|
|
210
|
+
# fill gaps; later entries take precedence (already in xref).
|
|
211
|
+
prev_offset = trailer[:Prev]
|
|
212
|
+
while prev_offset
|
|
213
|
+
prev_xref, prev_trailer = load_single_xref(io, prev_offset)
|
|
214
|
+
break unless prev_xref
|
|
215
|
+
|
|
216
|
+
xref.merge!(prev_xref)
|
|
217
|
+
prev_offset = prev_trailer && prev_trailer[:Prev]
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
[xref, trailer]
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def load_single_xref(io, sxref)
|
|
224
|
+
actual_xref_pos = find_xref_keyword(io, sxref)
|
|
225
|
+
if actual_xref_pos
|
|
226
|
+
xref = Pdfrb::Source::XrefTableReader.read(io, actual_xref_pos)
|
|
227
|
+
trailer = read_trailer_dict_after_xref(io)
|
|
228
|
+
return [xref, trailer]
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
# Try as XRef stream (PDF 1.5+).
|
|
232
|
+
io.seek(sxref, IO::SEEK_SET)
|
|
233
|
+
tok = Pdfrb::Source::Tokenizer.new(io)
|
|
234
|
+
parser = Pdfrb::Source::Parser.new(tok, document: self)
|
|
235
|
+
obj = parser.parse_indirect_object rescue nil
|
|
236
|
+
if obj.is_a?(Pdfrb::Model::Cos::Stream) && obj[:Type] == :XRef
|
|
237
|
+
xref = Pdfrb::Source::XrefStreamReader.read(obj, self)
|
|
238
|
+
[xref, obj.value]
|
|
239
|
+
else
|
|
240
|
+
# Last resort: recovery.
|
|
241
|
+
recover_or_raise(Pdfrb::ParseError.new("cannot locate xref at #{sxref}"))
|
|
242
|
+
[nil, nil]
|
|
243
|
+
end
|
|
244
|
+
rescue Pdfrb::ParseError => e
|
|
245
|
+
recover_or_raise(e)
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
# Search for the "xref" keyword near +offset+. Real PDFs have
|
|
249
|
+
# startxref values that drift (19-byte entries, generator bugs).
|
|
250
|
+
# Must exclude false matches inside "startxref\nNNNN\n%%EOF".
|
|
251
|
+
def find_xref_keyword(io, offset)
|
|
252
|
+
# First try the exact offset.
|
|
253
|
+
io.seek(offset, IO::SEEK_SET)
|
|
254
|
+
return offset if io.gets&.strip == "xref"
|
|
255
|
+
|
|
256
|
+
# Search backwards for "\nxref\n" (newline-anchored to avoid
|
|
257
|
+
# matching "startxref") within 2KB before the offset.
|
|
258
|
+
search_start = [offset - 2048, 0].max
|
|
259
|
+
io.seek(search_start, IO::SEEK_SET)
|
|
260
|
+
chunk = io.read(offset - search_start + 10)
|
|
261
|
+
# Find the last "\nxref\n" — the \n prefix ensures we don't
|
|
262
|
+
# match the "xref" inside "startxref".
|
|
263
|
+
pos = chunk.rindex("\nxref\n")
|
|
264
|
+
return search_start + pos + 1 if pos
|
|
265
|
+
|
|
266
|
+
# If not found with \n prefix, try from byte 0 (the xref might
|
|
267
|
+
# be at the very start of the search chunk with no \n before it).
|
|
268
|
+
pos = chunk.rindex("xref\n")
|
|
269
|
+
# Verify it's not inside "startxref".
|
|
270
|
+
if pos && pos > 4 && chunk.byteslice(pos - 4, 5) == "start"
|
|
271
|
+
pos = chunk.rindex("xref\n", pos - 1)
|
|
272
|
+
end
|
|
273
|
+
pos ? search_start + pos : nil
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
def read_trailer_dict_after_xref(io)
|
|
277
|
+
# XrefTableReader already consumed up to and including the
|
|
278
|
+
# "trailer" keyword line; skip any blank lines then parse the
|
|
279
|
+
# dict that follows.
|
|
280
|
+
while (line = io.gets)
|
|
281
|
+
break unless line.strip.empty?
|
|
282
|
+
end
|
|
283
|
+
io.seek(-line.bytesize, IO::SEEK_CUR) if line
|
|
284
|
+
tok = Pdfrb::Source::Tokenizer.new(io)
|
|
285
|
+
parser = Pdfrb::Source::Parser.new(tok, document: self)
|
|
286
|
+
parser.parse_dict
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
def read_trailer
|
|
290
|
+
return @trailer_dict if defined?(@trailer_dict) && @trailer_dict
|
|
291
|
+
|
|
292
|
+
@empty_trailer
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
def seed_empty_structure
|
|
296
|
+
pages = add({ Type: :Pages, Kids: [], Count: 0 })
|
|
297
|
+
catalog = add({ Type: :Catalog, Pages: Pdfrb::Model::Reference.new(pages.oid, 0) })
|
|
298
|
+
@catalog = catalog
|
|
299
|
+
@empty_trailer = { Size: @next_oid, Root: Pdfrb::Model::Reference.new(catalog.oid, 0) }
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
def recover_or_raise(error)
|
|
303
|
+
recover = @config["source.recover_malformed"]
|
|
304
|
+
raise error unless recover
|
|
305
|
+
|
|
306
|
+
recovered = Pdfrb::Source::Recovery.rebuild_xref(@io)
|
|
307
|
+
@xref = recovered
|
|
308
|
+
@object_reader = Pdfrb::Source::ObjectReader.new(self, recovered)
|
|
309
|
+
nil
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
def resolve_target_class(data, requested)
|
|
313
|
+
return requested if requested.is_a?(Class)
|
|
314
|
+
return data.class if data.is_a?(Pdfrb::Model::Object) && requested.nil? && typed_object?(data)
|
|
315
|
+
|
|
316
|
+
value = unwrap_value(data)
|
|
317
|
+
if value.is_a?(::Hash)
|
|
318
|
+
sym = value[:Type]
|
|
319
|
+
if sym
|
|
320
|
+
mapped = Pdfrb::Model::Cos::Dictionary.lookup_type(sym)
|
|
321
|
+
return mapped if mapped
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
default_class_for(value)
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
def typed_object?(obj)
|
|
328
|
+
obj.class != Pdfrb::Model::Object && obj.class != Pdfrb::Model::Cos::Dictionary
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
def unwrap_value(data)
|
|
332
|
+
data.is_a?(Pdfrb::Model::Object) ? data.value : data
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
def default_class_for(value)
|
|
336
|
+
case value
|
|
337
|
+
when ::Hash then Pdfrb::Model::Cos::Dictionary
|
|
338
|
+
when ::Array then Pdfrb::Model::PdfArray
|
|
339
|
+
else Pdfrb::Model::Object
|
|
340
|
+
end
|
|
341
|
+
end
|
|
342
|
+
end
|
|
343
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "openssl"
|
|
4
|
+
|
|
5
|
+
module Pdfrb
|
|
6
|
+
module Encryption
|
|
7
|
+
# AES cipher in CBC mode for PDF V4..V6 (s7.6.3.2 / 7.6.3.3).
|
|
8
|
+
# Backed by +openssl+ stdlib for performance and correctness.
|
|
9
|
+
# Caller derives the per-object key and the 16-byte IV (PDF V5+
|
|
10
|
+
# uses IV-in-ciphertext; PDF V4 uses random IV per stream).
|
|
11
|
+
class AES
|
|
12
|
+
attr_reader :key_size, :mode
|
|
13
|
+
|
|
14
|
+
def initialize(key_size: 128, mode: :CBC)
|
|
15
|
+
@key_size = key_size
|
|
16
|
+
@mode = mode
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def encrypt(plain, key, iv)
|
|
20
|
+
cipher = openssl_cipher(:encrypt, key.bytesize)
|
|
21
|
+
cipher.key = key.b
|
|
22
|
+
cipher.iv = iv.b
|
|
23
|
+
cipher.padding = 0 # PDF pads itself (PKCS#7)
|
|
24
|
+
out = cipher.update(pad_pkcs7(plain.b, 16)) + cipher.final
|
|
25
|
+
iv.b + out
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def decrypt(ciphertext, key)
|
|
29
|
+
cipher = openssl_cipher(:decrypt, key.bytesize)
|
|
30
|
+
iv = ciphertext.byteslice(0, 16)
|
|
31
|
+
body = ciphertext.byteslice(16..)
|
|
32
|
+
cipher.key = key.b
|
|
33
|
+
cipher.iv = iv
|
|
34
|
+
cipher.padding = 0
|
|
35
|
+
decrypted = cipher.update(body) + cipher.final
|
|
36
|
+
strip_pkcs7(decrypted)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
def openssl_cipher(direction, key_bytes)
|
|
42
|
+
name = case key_bytes
|
|
43
|
+
when 16 then "AES-128-#{@mode}"
|
|
44
|
+
when 32 then "AES-256-#{@mode}"
|
|
45
|
+
else raise Pdfrb::EncryptionError,
|
|
46
|
+
"unsupported AES key length #{key_bytes}"
|
|
47
|
+
end
|
|
48
|
+
c = OpenSSL::Cipher.new(name)
|
|
49
|
+
direction == :encrypt ? c.encrypt : c.decrypt
|
|
50
|
+
c
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def pad_pkcs7(data, block_size)
|
|
54
|
+
pad = block_size - (data.bytesize % block_size)
|
|
55
|
+
data + (pad.chr * pad)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def strip_pkcs7(data)
|
|
59
|
+
return data if data.empty?
|
|
60
|
+
|
|
61
|
+
pad = data.getbyte(-1)
|
|
62
|
+
return data unless pad && pad.between?(1, 16)
|
|
63
|
+
|
|
64
|
+
data.byteslice(0, data.bytesize - pad)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "digest/md5"
|
|
4
|
+
require "digest/sha2"
|
|
5
|
+
|
|
6
|
+
module Pdfrb
|
|
7
|
+
module Encryption
|
|
8
|
+
# Password verification and key derivation for the Standard
|
|
9
|
+
# security handler (s7.6.3.3, Algorithms 2 / 3 / 5 / 6 / 7).
|
|
10
|
+
#
|
|
11
|
+
# All functions are pure (no IO); they consume and return bytes.
|
|
12
|
+
module PasswordVerification
|
|
13
|
+
PADDING_BYTES = [
|
|
14
|
+
0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41,
|
|
15
|
+
0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,
|
|
16
|
+
0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80,
|
|
17
|
+
0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A
|
|
18
|
+
].freeze
|
|
19
|
+
private_constant :PADDING_BYTES
|
|
20
|
+
|
|
21
|
+
module_function
|
|
22
|
+
|
|
23
|
+
# Algorithm 2: derive the encryption key from a user password
|
|
24
|
+
# for revisions 2..4 (RC4 and AES-128).
|
|
25
|
+
def derive_key_rc4(password:, o_entry:, p_flags:, id0:,
|
|
26
|
+
revision:, key_length_bits:, encrypt_metadata: true)
|
|
27
|
+
padded = pad_password(password)
|
|
28
|
+
digest = Digest::MD5.new
|
|
29
|
+
digest.update(padded)
|
|
30
|
+
digest.update(o_entry.b)
|
|
31
|
+
digest.update([p_flags].pack("V"))
|
|
32
|
+
digest.update(id0.b)
|
|
33
|
+
unless encrypt_metadata
|
|
34
|
+
digest.update("\xFF\xFF\xFF\xFF".b)
|
|
35
|
+
end
|
|
36
|
+
hash = digest.digest
|
|
37
|
+
if revision >= 3
|
|
38
|
+
50.times { hash = Digest::MD5.digest(hash[0, key_length_bits / 8]) }
|
|
39
|
+
end
|
|
40
|
+
hash.byteslice(0, key_length_bits / 8)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Algorithm 5: derive the encryption key for revision 6
|
|
44
|
+
# (AES-256, PDF 2.0).
|
|
45
|
+
def derive_key_v6(password:, u_entry:, o_entry:,
|
|
46
|
+
p_flags:, oe_entry:)
|
|
47
|
+
# PDF 2.0 uses SHA-256 with password + validation salt.
|
|
48
|
+
raise NotImplementedError, "V6 key derivation TBD"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Algorithm 4 (R=2): build the /U entry.
|
|
52
|
+
def build_u_r2(file_key)
|
|
53
|
+
rc4 = RC4.new(file_key)
|
|
54
|
+
rc4.process(pack_bytes(PADDING_BYTES))
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Algorithm 5 (R>=3): build the /U entry.
|
|
58
|
+
def build_u_r3plus(file_key:, id0:, revision:)
|
|
59
|
+
digest = Digest::MD5.new
|
|
60
|
+
digest.update(pack_bytes(PADDING_BYTES))
|
|
61
|
+
digest.update(id0.b)
|
|
62
|
+
hash = digest.digest
|
|
63
|
+
rc4 = RC4.new(file_key)
|
|
64
|
+
encrypted = rc4.process(hash)
|
|
65
|
+
# 19 more rounds with key XORed by round index.
|
|
66
|
+
19.times do |i|
|
|
67
|
+
key = file_key.bytes.map { |b| (b ^ i).chr }.join
|
|
68
|
+
encrypted = RC4.new(key).process(encrypted)
|
|
69
|
+
end
|
|
70
|
+
# Pad / truncate to 32 bytes.
|
|
71
|
+
encrypted = encrypted + ("\x00" * (32 - encrypted.bytesize))
|
|
72
|
+
encrypted.byteslice(0, 32)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Algorithm 6: verify a user password. Returns true if it
|
|
76
|
+
# matches.
|
|
77
|
+
def verify_user_password(password:, encrypt_dict:, id0:)
|
|
78
|
+
o_entry = encrypt_dict[:O].b
|
|
79
|
+
p_flags = encrypt_dict[:P]
|
|
80
|
+
revision = encrypt_dict[:R]
|
|
81
|
+
key_bits = (encrypt_dict[:Length] || 40).to_i
|
|
82
|
+
encrypt_metadata = encrypt_dict.fetch(:EncryptMetadata, true)
|
|
83
|
+
key = derive_key_rc4(
|
|
84
|
+
password: password, o_entry: o_entry, p_flags: p_flags,
|
|
85
|
+
id0: id0, revision: revision, key_length_bits: key_bits,
|
|
86
|
+
encrypt_metadata: encrypt_metadata
|
|
87
|
+
)
|
|
88
|
+
expected_u = if revision == 2
|
|
89
|
+
build_u_r2(key)
|
|
90
|
+
else
|
|
91
|
+
build_u_r3plus(file_key: key, id0: id0, revision: revision)
|
|
92
|
+
end
|
|
93
|
+
u_entry = encrypt_dict[:U].b
|
|
94
|
+
# Compare the first 16 bytes for R>=3.
|
|
95
|
+
slice_len = revision == 2 ? 32 : 16
|
|
96
|
+
expected_u.byteslice(0, slice_len) == u_entry.byteslice(0, slice_len)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def pad_password(password)
|
|
100
|
+
bytes = password.to_s.b
|
|
101
|
+
padded = bytes + pack_bytes(PADDING_BYTES)
|
|
102
|
+
padded.byteslice(0, 32)
|
|
103
|
+
end
|
|
104
|
+
module_function :pad_password
|
|
105
|
+
|
|
106
|
+
def pack_bytes(arr)
|
|
107
|
+
arr.map(&:chr).join.force_encoding(Encoding::BINARY)
|
|
108
|
+
end
|
|
109
|
+
private_class_method :pack_bytes
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pdfrb
|
|
4
|
+
module Encryption
|
|
5
|
+
# Pure-Ruby RC4 stream cipher (s7.6.3.1, Algorithm 1). Key can be
|
|
6
|
+
# 1..256 bytes (PDF uses 5..32). Stateless per call: build a new
|
|
7
|
+
# cipher for each (key, oid, gen) tuple.
|
|
8
|
+
class RC4
|
|
9
|
+
attr_reader :key
|
|
10
|
+
|
|
11
|
+
def initialize(key)
|
|
12
|
+
@key = key.b
|
|
13
|
+
@s = (0..255).to_a
|
|
14
|
+
@i = @j = 0
|
|
15
|
+
key_schedule
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Encrypt/decrypt +bytes+ (symmetric). Caller is responsible for
|
|
19
|
+
# prepending the per-object key (5..16 bytes derived via MD5 of
|
|
20
|
+
# file_key + oid + gen).
|
|
21
|
+
def process(bytes)
|
|
22
|
+
out = +""
|
|
23
|
+
bytes.b.each_byte do |b|
|
|
24
|
+
@i = (@i + 1) & 0xFF
|
|
25
|
+
@j = (@j + @s[@i]) & 0xFF
|
|
26
|
+
@s[@i], @s[@j] = @s[@j], @s[@i]
|
|
27
|
+
out << (b ^ @s[(@s[@i] + @s[@j]) & 0xFF]).chr
|
|
28
|
+
end
|
|
29
|
+
out.force_encoding(Encoding::BINARY)
|
|
30
|
+
end
|
|
31
|
+
alias encrypt process
|
|
32
|
+
alias decrypt process
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def key_schedule
|
|
37
|
+
j = 0
|
|
38
|
+
256.times do |i|
|
|
39
|
+
j = (j + @s[i] + @key.getbyte(i % @key.bytesize)) & 0xFF
|
|
40
|
+
@s[i], @s[j] = @s[j], @s[i]
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|