第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何編輯以十六進(jìn)制格式編碼的 pdf 文本?

如何編輯以十六進(jìn)制格式編碼的 pdf 文本?

catspeake 2023-09-12 17:32:28
我正在嘗試在 PDF 中查找某些文本并將其替換為特定值。我正在使用 python 庫pdfrw,因?yàn)槲业氖走x環(huán)境是 python。以下是文檔第一頁中的示例內(nèi)容。BT\n/F8 40 Tf\n1 0 0 -1 569 376 Tm\n<0034> Tj\n26 0 Td <0028> Tj\n22 0 Td <0032> Tj\n25 0 Td <0031> Tj\n32 0 Td <0034> Tj\n26 0 Td <0036> Tj\nET\n0 .8863 1 RG對應(yīng)于文檔中的“REPORT”一詞。到目前為止,我已經(jīng)理解了這種格式中所有特殊標(biāo)簽和數(shù)字的含義,并成功地操縱了位置和其中的一些字符。但我不明白每個字符以什么格式或編碼進(jìn)行編碼(<0034>、<0028> 等)。我嘗試暴力破解 <00xx> 的每個組合,但只找到字母 R、E、P、O、T 的有效匹配,這些字母是單詞中使用的字母。我對頁面中包含的 F11 和 F10 進(jìn)行了相同的嘗試,發(fā)現(xiàn)與僅使用的字母匹配的結(jié)果相同。如果有人可以解釋這種編碼是如何工作的以及如何編輯它以便能夠插入任何 utf-8 字符,那將非常有幫助。謝謝。note-1:以下是 F8 對象:{'/Subtype': '/Type0', '/Type': '/Font', '/BaseFont': '/OpenSans-Bold', '/Encoding': '/Identity-H', '/DescendantFonts': [{'/DW': '0', '/Subtype': '/CIDFontType2', '/CIDSystemInfo': {'/Suplement': '0', '/Registry': '(Adobe)', '/Ordering ': '(Identity)'}, '/Type': '/Font', '/FontDescriptor': {'/Descent': '-292.96875', '/CapHeight': '713.86719', '/StemV': ' 83.984375', '/Type': '/FontDescriptor', '/FontFile2': {'/Length1': '5540', '/Length': '5540'}, '/Flags': '4', '/FontName ': '/OpenSans-Bold', '/ItalicAngle': '0','/FontBBox': ['-619.14063', '-292.96875', '1318.84766', '1068.84766'], '/Ascent': '1068.84766'}, '/BaseFont': '/OpenSans-Bold', '/W ': ['0', ['600.09766'], '40', ['560.05859'], '49', ['795.89844', '627.92969', '0', '660.15625', '0', '579.10156 ']], '/CIDToGIDMap': '/Identity'}], '/ToUnicode': {'/Length': '413'}}'0', '660.15625', '0', '579.10156']], '/CIDToGIDMap': '/Identity'}], '/ToUnicode': {'/Length': '413'}}'0', '660.15625', '0', '579.10156']], '/CIDToGIDMap': '/Identity'}], '/ToUnicode': {'/Length': '413'}}注意2:以 (nice text)Tj\n 或 (<0032><0032>) 方式替換文本在這里不起作用。
查看完整描述

3 回答

?
慕尼黑8549860

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個贊

因此,正如之前的答案所指出的,文檔中的嵌入字體只是一個子集,編碼引用的是我未知的字符。我通過首先創(chuàng)建臨時 pdf 來解決這個問題,其中包含字母表中的每個字母(其中包含我需要的字體信息),然后用新文件的資源字體替換原始文件的資源字體。然后我可以像我的臨時文件一樣輕松地操作文本


target.pages[0].Resources.Font=font_pdf.pages[0].Resources.Font

target.pages[0].Contents.stream.replace(

    "BT\n/F8 40 Tf\n1 0 0 -1 569 376 Tm\n<0034> Tj\n26 0 Td <0028> Tj\nET", 

    f"BT\n/F0 11 Tf\n1 0 0 -1 500 500 Tm\n(\x02Y\x02Q) Tj\nET"

)

謝謝你們 :)


注意:我仍然沒有很好的解決方案來使用自己的字體解碼十六進(jìn)制。所以我決定使用模式匹配,因?yàn)槲抑缿?yīng)該期待什么文本。更好的解決方案將會非常有幫助


查看完整回答
反對 回復(fù) 2023-09-12
?
小怪獸愛吃肉

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個贊

'/Encoding': '/Identity-H''/CIDToGIDMap': '/Identity'表示字符代碼對應(yīng)于字形id。因此<0034>顯示所選字體的字形編號 0x34。

如果字體已被子集化,您只能訪問子集中包含的字形。

'/Length': '5540'意味著字體大小為 5540 字節(jié),這顯然意味著它是子集化的。


查看完整回答
反對 回復(fù) 2023-09-12
?
哈士奇WWW

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個贊

一般來說,我認(rèn)為 pdf 文本可以通過不同的算法進(jìn)行壓縮/編碼,因此pdfrw不會自行解碼文本。因此,您通常無法知道什么是正確的方法,因?yàn)槊糠N情況都不同。

可能您沒有弄清楚字符和十六進(jìn)制代碼之間的正確對應(yīng)關(guān)系是什么,因?yàn)樗赡苁菈嚎s流 - 這意味著每個代碼取決于整個流中字符的位置加上所有先前的值人物。例如,文本可以被zlib壓縮。

此外,pdf 文本是用于定位/格式化/輸出文本的一系列命令,因此通常您必須能夠解碼/編碼所有這些命令才能處理真正的任何文本。您的格式可能包含符號表,其中所有使用的符號都映射到十六進(jìn)制值。為了找出正確的映射,所有符號都應(yīng)該出現(xiàn)在示例文本中。

R對于您的情況,您可能會使用下一個表,為了進(jìn)行轉(zhuǎn)換,我使用字母具有十六進(jìn)制值的事實(shí)0x34

在線嘗試一下!

import sys

for i, n in enumerate(range(32, 128)):

? ? sys.stdout.write(f"{hex(n - ord('R') + 0x34).ljust(4)}: '{chr(n)}' ")

? ? if (i + 1) % 8 == 0:

? ? ? ? sys.stdout.write('\n')

輸出:


0x2 : ' ' 0x3 : '!' 0x4 : '"' 0x5 : '#' 0x6 : '$' 0x7 : '%' 0x8 : '&' 0x9 : '''?

0xa : '(' 0xb : ')' 0xc : '*' 0xd : '+' 0xe : ',' 0xf : '-' 0x10: '.' 0x11: '/'?

0x12: '0' 0x13: '1' 0x14: '2' 0x15: '3' 0x16: '4' 0x17: '5' 0x18: '6' 0x19: '7'?

0x1a: '8' 0x1b: '9' 0x1c: ':' 0x1d: ';' 0x1e: '<' 0x1f: '=' 0x20: '>' 0x21: '?'?

0x22: '@' 0x23: 'A' 0x24: 'B' 0x25: 'C' 0x26: 'D' 0x27: 'E' 0x28: 'F' 0x29: 'G'?

0x2a: 'H' 0x2b: 'I' 0x2c: 'J' 0x2d: 'K' 0x2e: 'L' 0x2f: 'M' 0x30: 'N' 0x31: 'O'?

0x32: 'P' 0x33: 'Q' 0x34: 'R' 0x35: 'S' 0x36: 'T' 0x37: 'U' 0x38: 'V' 0x39: 'W'?

0x3a: 'X' 0x3b: 'Y' 0x3c: 'Z' 0x3d: '[' 0x3e: '\' 0x3f: ']' 0x40: '^' 0x41: '_'?

0x42: '`' 0x43: 'a' 0x44: 'b' 0x45: 'c' 0x46: 'd' 0x47: 'e' 0x48: 'f' 0x49: 'g'?

0x4a: 'h' 0x4b: 'i' 0x4c: 'j' 0x4d: 'k' 0x4e: 'l' 0x4f: 'm' 0x50: 'n' 0x51: 'o'?

0x52: 'p' 0x53: 'q' 0x54: 'r' 0x55: 's' 0x56: 't' 0x57: 'u' 0x58: 'v' 0x59: 'w'?

0x5a: 'x' 0x5b: 'y' 0x5c: 'z' 0x5d: '{' 0x5e: '|' 0x5f: '}' 0x60: '~' 0x61: ''?

從十六進(jìn)制轉(zhuǎn)換為字符的代碼很簡單:


hex_val = '0030'

print(chr(int(hex_val, 16) - 0x34 + ord('R')))

如果您在字符和十六進(jìn)制值之間有一些更奇特的映射,那么您只需創(chuàng)建一個包含所有可能的字符的文本,然后使用轉(zhuǎn)換器對其進(jìn)行轉(zhuǎn)換,看看每個字母里面的十六進(jìn)制是什么。


另外,我只是試圖弄清楚 PDF 中的文本是如何編碼的,使用了哪些命令,它看起來像Tj末尾帶有命令的字符串包含文本本身。因此,我在下面的代碼中編寫了 pdf 文本修飾符,它接受文件名或 URL 作為第一個參數(shù),輸出文件名作為第二個參數(shù),或者只是運(yùn)行它以使用默認(rèn)示例,所需的替換在腳本開頭作為變量列出changes。


但下一個修飾符不會解碼您的十六進(jìn)制格式。它可以方便地替換任何以純文本編碼的文本。

在線嘗試一下!

import sys, os, io

# Needs: python -m pip install pdfrw

from pdfrw import PdfReader, PdfWriter


changes = {'And': 'Or', 'text': 'string'}


def ReplaceText(text, reps = {}):

? ? res, in_block = '', False

? ? for line in text.splitlines():

? ? ? ? line = line.strip()

? ? ? ? nline = line

? ? ? ? if line == 'BT':

? ? ? ? ? ? in_block = True

? ? ? ? elif line == 'ET':

? ? ? ? ? ? in_block = False

? ? ? ? elif in_block:

? ? ? ? ? ? cmd = line.rpartition(' ')[2]

? ? ? ? ? ? if cmd.lower() == 'tj':

? ? ? ? ? ? ? ? for k, v in reps.items():

? ? ? ? ? ? ? ? ? ? nline = nline.replace(k, v)

? ? ? ? res += nline + '\n'

? ? return res


ifn = sys.argv[1] if len(sys.argv) > 1 else 'http://www.africau.edu/images/default/sample.pdf'

ofn = (ifn[:ifn.rfind('.')] + '.processed.pdf') if len(sys.argv) <= 2 else sys.argv[2]


if ifn.lower().startswith('http'):

? ? # Needs: python -m pip install requests

? ? import requests

? ? ofn = (ifn[ifn.rfind('/') + 1:] + '.processed.pdf') if len(sys.argv) <= 2 else sys.argv[2]

? ? ifn = io.BytesIO(requests.get(ifn).content)

? ??

r = PdfReader(ifn)

for page in r.pages:

? ? page.Contents.stream = ReplaceText(page.Contents.stream, changes)


PdfWriter(ofn, trailer = r).write()


查看完整回答
反對 回復(fù) 2023-09-12
  • 3 回答
  • 0 關(guān)注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號